Home | History | Annotate | Download | only in d3d11
      1 //
      2 // Copyright (c) 2012-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 // TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived
      8 // classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11 texture.
      9 
     10 #ifndef LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
     11 #define LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
     12 
     13 #include "libGLESv2/Texture.h"
     14 #include "libGLESv2/renderer/d3d/TextureStorage.h"
     15 
     16 #include <map>
     17 
     18 namespace gl
     19 {
     20 struct ImageIndex;
     21 }
     22 
     23 namespace rx
     24 {
     25 class RenderTarget;
     26 class RenderTarget11;
     27 class Renderer;
     28 class Renderer11;
     29 class SwapChain11;
     30 class Image11;
     31 
     32 class TextureStorage11 : public TextureStorage
     33 {
     34   public:
     35     virtual ~TextureStorage11();
     36 
     37     static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
     38 
     39     static DWORD GetTextureBindFlags(GLenum internalFormat, bool renderTarget);
     40 
     41     UINT getBindFlags() const;
     42 
     43     virtual ID3D11Resource *getResource() const = 0;
     44     virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
     45     virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index) = 0;
     46 
     47     virtual void generateMipmaps() = 0;
     48 
     49     virtual int getTopLevel() const;
     50     virtual bool isRenderTarget() const;
     51     virtual bool isManaged() const;
     52     virtual int getLevelCount() const;
     53     UINT getSubresourceIndex(int mipLevel, int layerTarget) const;
     54 
     55     void generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
     56     void invalidateSwizzleCacheLevel(int mipLevel);
     57     void invalidateSwizzleCache();
     58 
     59     bool updateSubresourceLevel(ID3D11Resource *texture, unsigned int sourceSubresource, int level,
     60                                 int layerTarget, GLint xoffset, GLint yoffset, GLint zoffset,
     61                                 GLsizei width, GLsizei height, GLsizei depth);
     62 
     63     bool copySubresourceLevel(ID3D11Resource* dstTexture, unsigned int dstSubresource, int level,
     64                               int layerTarget, GLint xoffset, GLint yoffset, GLint zoffset,
     65                               GLsizei width, GLsizei height, GLsizei depth);
     66 
     67     virtual void associateImage(Image11* image, int level, int layerTarget) = 0;
     68     virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage) = 0;
     69     virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage) = 0;
     70     virtual void releaseAssociatedImage(int level, int layerTarget, Image11* incomingImage) = 0;
     71 
     72   protected:
     73     TextureStorage11(Renderer *renderer, UINT bindFlags);
     74     void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
     75     int getLevelWidth(int mipLevel) const;
     76     int getLevelHeight(int mipLevel) const;
     77     int getLevelDepth(int mipLevel) const;
     78 
     79     virtual ID3D11Resource *getSwizzleTexture() = 0;
     80     virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel) = 0;
     81     ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
     82 
     83     virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) = 0;
     84 
     85     void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
     86 
     87     Renderer11 *mRenderer;
     88     int mTopLevel;
     89     unsigned int mMipLevels;
     90 
     91     DXGI_FORMAT mTextureFormat;
     92     DXGI_FORMAT mShaderResourceFormat;
     93     DXGI_FORMAT mRenderTargetFormat;
     94     DXGI_FORMAT mDepthStencilFormat;
     95     DXGI_FORMAT mSwizzleTextureFormat;
     96     DXGI_FORMAT mSwizzleShaderResourceFormat;
     97     DXGI_FORMAT mSwizzleRenderTargetFormat;
     98     unsigned int mTextureWidth;
     99     unsigned int mTextureHeight;
    100     unsigned int mTextureDepth;
    101 
    102     struct SwizzleCacheValue
    103     {
    104         GLenum swizzleRed;
    105         GLenum swizzleGreen;
    106         GLenum swizzleBlue;
    107         GLenum swizzleAlpha;
    108 
    109         SwizzleCacheValue();
    110         SwizzleCacheValue(GLenum red, GLenum green, GLenum blue, GLenum alpha);
    111 
    112         bool operator ==(const SwizzleCacheValue &other) const;
    113         bool operator !=(const SwizzleCacheValue &other) const;
    114     };
    115     SwizzleCacheValue mSwizzleCache[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    116 
    117     struct SRVKey
    118     {
    119         SRVKey(int baseLevel = 0, int mipLevels = 0, bool swizzle = false);
    120 
    121         bool operator==(const SRVKey &rhs) const;
    122 
    123         int baseLevel;
    124         int mipLevels;
    125         bool swizzle;
    126     };
    127 
    128     struct SRVPair
    129     {
    130         SRVKey key;
    131         ID3D11ShaderResourceView *srv;
    132     };
    133 
    134     struct SRVCache
    135     {
    136         ~SRVCache();
    137 
    138         ID3D11ShaderResourceView *find(const SRVKey &key) const;
    139         ID3D11ShaderResourceView *add(const SRVKey &key, ID3D11ShaderResourceView *srv);
    140 
    141         std::vector<SRVPair> cache;
    142     };
    143 
    144   private:
    145     DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
    146 
    147     const UINT mBindFlags;
    148 
    149     SRVCache srvCache;
    150     ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    151 };
    152 
    153 class TextureStorage11_2D : public TextureStorage11
    154 {
    155   public:
    156     TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain);
    157     TextureStorage11_2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels);
    158     virtual ~TextureStorage11_2D();
    159 
    160     static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
    161 
    162     virtual ID3D11Resource *getResource() const;
    163     virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
    164 
    165     virtual void generateMipmaps();
    166 
    167     virtual void associateImage(Image11* image, int level, int layerTarget);
    168     virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
    169     virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
    170     virtual void releaseAssociatedImage(int level, int layerTarget, Image11* incomingImage);
    171 
    172   protected:
    173     virtual ID3D11Resource *getSwizzleTexture();
    174     virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
    175 
    176   private:
    177     DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
    178 
    179     virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
    180 
    181     ID3D11Texture2D *mTexture;
    182     RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    183 
    184     ID3D11Texture2D *mSwizzleTexture;
    185     ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    186 
    187     Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    188 };
    189 
    190 class TextureStorage11_Cube : public TextureStorage11
    191 {
    192   public:
    193     TextureStorage11_Cube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels);
    194     virtual ~TextureStorage11_Cube();
    195 
    196     static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
    197 
    198     virtual ID3D11Resource *getResource() const;
    199     virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
    200 
    201     virtual void generateMipmaps();
    202 
    203     virtual void associateImage(Image11* image, int level, int layerTarget);
    204     virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
    205     virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
    206     virtual void releaseAssociatedImage(int level, int layerTarget, Image11* incomingImage);
    207 
    208   protected:
    209     virtual ID3D11Resource *getSwizzleTexture();
    210     virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
    211 
    212   private:
    213     DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
    214 
    215     virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
    216 
    217     ID3D11Texture2D *mTexture;
    218     RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    219 
    220     ID3D11Texture2D *mSwizzleTexture;
    221     ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    222 
    223     Image11 *mAssociatedImages[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    224 };
    225 
    226 class TextureStorage11_3D : public TextureStorage11
    227 {
    228   public:
    229     TextureStorage11_3D(Renderer *renderer, GLenum internalformat, bool renderTarget,
    230                         GLsizei width, GLsizei height, GLsizei depth, int levels);
    231     virtual ~TextureStorage11_3D();
    232 
    233     static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage);
    234 
    235     virtual ID3D11Resource *getResource() const;
    236 
    237     // Handles both layer and non-layer RTs
    238     virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
    239 
    240     virtual void generateMipmaps();
    241 
    242     virtual void associateImage(Image11* image, int level, int layerTarget);
    243     virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
    244     virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
    245     virtual void releaseAssociatedImage(int level, int layerTarget, Image11* incomingImage);
    246 
    247   protected:
    248     virtual ID3D11Resource *getSwizzleTexture();
    249     virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
    250 
    251   private:
    252     DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
    253 
    254     virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
    255 
    256     typedef std::pair<int, int> LevelLayerKey;
    257     typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
    258     RenderTargetMap mLevelLayerRenderTargets;
    259 
    260     RenderTarget11 *mLevelRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    261 
    262     ID3D11Texture3D *mTexture;
    263     ID3D11Texture3D *mSwizzleTexture;
    264     ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    265 
    266     Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    267 };
    268 
    269 class TextureStorage11_2DArray : public TextureStorage11
    270 {
    271   public:
    272     TextureStorage11_2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget,
    273                              GLsizei width, GLsizei height, GLsizei depth, int levels);
    274     virtual ~TextureStorage11_2DArray();
    275 
    276     static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage);
    277 
    278     virtual ID3D11Resource *getResource() const;
    279     virtual RenderTarget *getRenderTarget(const gl::ImageIndex &index);
    280 
    281     virtual void generateMipmaps();
    282 
    283     virtual void associateImage(Image11* image, int level, int layerTarget);
    284     virtual void disassociateImage(int level, int layerTarget, Image11* expectedImage);
    285     virtual bool isAssociatedImageValid(int level, int layerTarget, Image11* expectedImage);
    286     virtual void releaseAssociatedImage(int level, int layerTarget, Image11* incomingImage);
    287 
    288   protected:
    289     virtual ID3D11Resource *getSwizzleTexture();
    290     virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
    291 
    292   private:
    293     DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray);
    294 
    295     virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
    296 
    297     typedef std::pair<int, int> LevelLayerKey;
    298     typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
    299     RenderTargetMap mRenderTargets;
    300 
    301     ID3D11Texture2D *mTexture;
    302 
    303     ID3D11Texture2D *mSwizzleTexture;
    304     ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
    305 
    306     typedef std::map<LevelLayerKey, Image11*> ImageMap;
    307     ImageMap mAssociatedImages;
    308 };
    309 
    310 }
    311 
    312 #endif // LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
    313