Home | History | Annotate | Download | only in d3d11
      1 //
      2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 
      7 // Blit11.cpp: Texture copy utility class.
      8 
      9 #ifndef LIBGLESV2_BLIT11_H_
     10 #define LIBGLESV2_BLIT11_H_
     11 
     12 #include "common/angleutils.h"
     13 #include "libGLESv2/angletypes.h"
     14 
     15 #include <map>
     16 
     17 namespace rx
     18 {
     19 class Renderer11;
     20 
     21 enum Filter
     22 {
     23     Point,
     24     Linear,
     25 };
     26 
     27 class Blit11
     28 {
     29   public:
     30     explicit Blit11(Renderer11 *renderer);
     31     ~Blit11();
     32 
     33     bool swizzleTexture(ID3D11ShaderResourceView *source, ID3D11RenderTargetView *dest, const gl::Extents &size,
     34                         GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
     35 
     36     bool copyTexture(ID3D11ShaderResourceView *source, const gl::Box &sourceArea, const gl::Extents &sourceSize,
     37                      ID3D11RenderTargetView *dest, const gl::Box &destArea, const gl::Extents &destSize,
     38                      const gl::Rectangle *scissor, GLenum destFormat, GLenum filter);
     39 
     40     bool copyStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &sourceArea, const gl::Extents &sourceSize,
     41                      ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &destArea, const gl::Extents &destSize,
     42                      const gl::Rectangle *scissor);
     43 
     44     bool copyDepth(ID3D11ShaderResourceView *source, const gl::Box &sourceArea, const gl::Extents &sourceSize,
     45                    ID3D11DepthStencilView *dest, const gl::Box &destArea, const gl::Extents &destSize,
     46                    const gl::Rectangle *scissor);
     47 
     48     bool copyDepthStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &sourceArea, const gl::Extents &sourceSize,
     49                           ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &destArea, const gl::Extents &destSize,
     50                           const gl::Rectangle *scissor);
     51 
     52   private:
     53     rx::Renderer11 *mRenderer;
     54 
     55     struct BlitParameters
     56     {
     57         GLenum mDestinationFormat;
     58         bool mSignedInteger;
     59         bool m3DBlit;
     60     };
     61 
     62     bool copyDepthStencil(ID3D11Resource *source, unsigned int sourceSubresource, const gl::Box &sourceArea, const gl::Extents &sourceSize,
     63                           ID3D11Resource *dest, unsigned int destSubresource, const gl::Box &destArea, const gl::Extents &destSize,
     64                           const gl::Rectangle *scissor, bool stencilOnly);
     65 
     66     static bool compareBlitParameters(const BlitParameters &a, const BlitParameters &b);
     67 
     68     typedef void (*WriteVertexFunction)(const gl::Box &sourceArea, const gl::Extents &sourceSize,
     69                                         const gl::Box &destArea, const gl::Extents &destSize,
     70                                         void *outVertices, unsigned int *outStride, unsigned int *outVertexCount,
     71                                         D3D11_PRIMITIVE_TOPOLOGY *outTopology);
     72 
     73     struct Shader
     74     {
     75         WriteVertexFunction mVertexWriteFunction;
     76         ID3D11InputLayout *mInputLayout;
     77         ID3D11VertexShader *mVertexShader;
     78         ID3D11GeometryShader *mGeometryShader;
     79         ID3D11PixelShader *mPixelShader;
     80     };
     81 
     82     typedef bool (*BlitParametersComparisonFunction)(const BlitParameters&, const BlitParameters &);
     83     typedef std::map<BlitParameters, Shader, BlitParametersComparisonFunction> BlitShaderMap;
     84     BlitShaderMap mBlitShaderMap;
     85 
     86     void add2DBlitShaderToMap(GLenum destFormat, bool signedInteger, ID3D11PixelShader *ps);
     87     void add3DBlitShaderToMap(GLenum destFormat, bool signedInteger, ID3D11PixelShader *ps);
     88 
     89     struct SwizzleParameters
     90     {
     91         GLenum mDestinationType;
     92         D3D11_SRV_DIMENSION mViewDimension;
     93     };
     94 
     95     static bool compareSwizzleParameters(const SwizzleParameters &a, const SwizzleParameters &b);
     96 
     97     typedef bool (*SwizzleParametersComparisonFunction)(const SwizzleParameters&, const SwizzleParameters &);
     98     typedef std::map<SwizzleParameters, Shader, SwizzleParametersComparisonFunction> SwizzleShaderMap;
     99     SwizzleShaderMap mSwizzleShaderMap;
    100 
    101     void addSwizzleShaderToMap(GLenum destType, D3D11_SRV_DIMENSION viewDimension, ID3D11PixelShader *ps);
    102 
    103     void buildShaderMap();
    104     void clearShaderMap();
    105 
    106     ID3D11Buffer *mVertexBuffer;
    107     ID3D11SamplerState *mPointSampler;
    108     ID3D11SamplerState *mLinearSampler;
    109     ID3D11RasterizerState *mScissorEnabledRasterizerState;
    110     ID3D11RasterizerState *mScissorDisabledRasterizerState;
    111     ID3D11DepthStencilState *mDepthStencilState;
    112 
    113     ID3D11InputLayout *mQuad2DIL;
    114     ID3D11VertexShader *mQuad2DVS;
    115     ID3D11PixelShader *mDepthPS;
    116 
    117     ID3D11InputLayout *mQuad3DIL;
    118     ID3D11VertexShader *mQuad3DVS;
    119     ID3D11GeometryShader *mQuad3DGS;
    120 
    121     ID3D11Buffer *mSwizzleCB;
    122 
    123     DISALLOW_COPY_AND_ASSIGN(Blit11);
    124 };
    125 
    126 }
    127 
    128 #endif   // LIBGLESV2_BLIT11_H_
    129