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