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.
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.
10 #ifndef LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
11 #define LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_
13 #include "libGLESv2/Texture.h"
14 #include "libGLESv2/Error.h"
15 #include "libGLESv2/renderer/d3d/TextureStorage.h"
33 class TextureStorage11 : public TextureStorage
36 virtual ~TextureStorage11();
38 static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
40 static DWORD GetTextureBindFlags(GLenum internalFormat, bool renderTarget);
42 UINT getBindFlags() const;
44 virtual gl::Error getResource(ID3D11Resource **outResource) = 0;
45 virtual gl::Error getSRV(const gl::SamplerState &samplerState, ID3D11ShaderResourceView **outSRV);
46 virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT) = 0;
48 virtual gl::Error generateMipmap(const gl::ImageIndex &sourceIndex, const gl::ImageIndex &destIndex);
50 virtual int getTopLevel() const;
51 virtual bool isRenderTarget() const;
52 virtual bool isManaged() const;
53 virtual int getLevelCount() const;
54 UINT getSubresourceIndex(const gl::ImageIndex &index) const;
56 gl::Error generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
57 void invalidateSwizzleCacheLevel(int mipLevel);
58 void invalidateSwizzleCache();
60 gl::Error updateSubresourceLevel(ID3D11Resource *texture, unsigned int sourceSubresource,
61 const gl::ImageIndex &index, const gl::Box ©Area);
63 gl::Error copySubresourceLevel(ID3D11Resource* dstTexture, unsigned int dstSubresource,
64 const gl::ImageIndex &index, const gl::Box ®ion);
66 virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0;
67 virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage) = 0;
68 virtual bool isAssociatedImageValid(const gl::ImageIndex &index, Image11* expectedImage) = 0;
69 virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage) = 0;
71 virtual gl::Error copyToStorage(TextureStorage *destStorage);
72 virtual gl::Error setData(const gl::ImageIndex &index, Image *image, const gl::Box *destBox, GLenum type,
73 const gl::PixelUnpackState &unpack, const uint8_t *pixelData);
76 TextureStorage11(Renderer *renderer, UINT bindFlags);
77 int getLevelWidth(int mipLevel) const;
78 int getLevelHeight(int mipLevel) const;
79 int getLevelDepth(int mipLevel) const;
81 virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture) = 0;
82 virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV) = 0;
83 gl::Error getSRVLevel(int mipLevel, ID3D11ShaderResourceView **outSRV);
85 virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
86 ID3D11ShaderResourceView **outSRV) const = 0;
88 void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
90 Renderer11 *mRenderer;
92 unsigned int mMipLevels;
94 DXGI_FORMAT mTextureFormat;
95 DXGI_FORMAT mShaderResourceFormat;
96 DXGI_FORMAT mRenderTargetFormat;
97 DXGI_FORMAT mDepthStencilFormat;
98 DXGI_FORMAT mSwizzleTextureFormat;
99 DXGI_FORMAT mSwizzleShaderResourceFormat;
100 DXGI_FORMAT mSwizzleRenderTargetFormat;
101 unsigned int mTextureWidth;
102 unsigned int mTextureHeight;
103 unsigned int mTextureDepth;
105 struct SwizzleCacheValue
113 SwizzleCacheValue(GLenum red, GLenum green, GLenum blue, GLenum alpha);
115 bool operator ==(const SwizzleCacheValue &other) const;
116 bool operator !=(const SwizzleCacheValue &other) const;
118 SwizzleCacheValue mSwizzleCache[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
121 DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
123 const UINT mBindFlags;
127 SRVKey(int baseLevel = 0, int mipLevels = 0, bool swizzle = false);
129 bool operator<(const SRVKey &rhs) const;
135 typedef std::map<SRVKey, ID3D11ShaderResourceView *> SRVCache;
138 ID3D11ShaderResourceView *mLevelSRVs[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
141 class TextureStorage11_2D : public TextureStorage11
144 TextureStorage11_2D(Renderer *renderer, SwapChain11 *swapchain);
145 TextureStorage11_2D(Renderer *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels);
146 virtual ~TextureStorage11_2D();
148 static TextureStorage11_2D *makeTextureStorage11_2D(TextureStorage *storage);
150 virtual gl::Error getResource(ID3D11Resource **outResource);
151 virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
153 virtual void associateImage(Image11* image, const gl::ImageIndex &index);
154 virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage);
155 virtual bool isAssociatedImageValid(const gl::ImageIndex &index, Image11* expectedImage);
156 virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
159 virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
160 virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
163 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
165 virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
166 ID3D11ShaderResourceView **outSRV) const;
168 ID3D11Texture2D *mTexture;
169 RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
171 ID3D11Texture2D *mSwizzleTexture;
172 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
174 Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
177 class TextureStorage11_Cube : public TextureStorage11
180 TextureStorage11_Cube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels);
181 virtual ~TextureStorage11_Cube();
183 static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
185 virtual gl::Error getResource(ID3D11Resource **outResource);
186 virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
188 virtual void associateImage(Image11* image, const gl::ImageIndex &index);
189 virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage);
190 virtual bool isAssociatedImageValid(const gl::ImageIndex &index, Image11* expectedImage);
191 virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
194 virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
195 virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
198 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
200 virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
201 ID3D11ShaderResourceView **outSRV) const;
203 static const size_t CUBE_FACE_COUNT = 6;
205 ID3D11Texture2D *mTexture;
206 RenderTarget11 *mRenderTarget[CUBE_FACE_COUNT][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
208 ID3D11Texture2D *mSwizzleTexture;
209 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
211 Image11 *mAssociatedImages[CUBE_FACE_COUNT][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
214 class TextureStorage11_3D : public TextureStorage11
217 TextureStorage11_3D(Renderer *renderer, GLenum internalformat, bool renderTarget,
218 GLsizei width, GLsizei height, GLsizei depth, int levels);
219 virtual ~TextureStorage11_3D();
221 static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage);
223 virtual gl::Error getResource(ID3D11Resource **outResource);
225 // Handles both layer and non-layer RTs
226 virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
228 virtual void associateImage(Image11* image, const gl::ImageIndex &index);
229 virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage);
230 virtual bool isAssociatedImageValid(const gl::ImageIndex &index, Image11* expectedImage);
231 virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
234 virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
235 virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
238 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
240 virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
241 ID3D11ShaderResourceView **outSRV) const;
243 typedef std::pair<int, int> LevelLayerKey;
244 typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
245 RenderTargetMap mLevelLayerRenderTargets;
247 RenderTarget11 *mLevelRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
249 ID3D11Texture3D *mTexture;
250 ID3D11Texture3D *mSwizzleTexture;
251 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
253 Image11 *mAssociatedImages[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
256 class TextureStorage11_2DArray : public TextureStorage11
259 TextureStorage11_2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget,
260 GLsizei width, GLsizei height, GLsizei depth, int levels);
261 virtual ~TextureStorage11_2DArray();
263 static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage);
265 virtual gl::Error getResource(ID3D11Resource **outResource);
266 virtual gl::Error getRenderTarget(const gl::ImageIndex &index, RenderTarget **outRT);
268 virtual void associateImage(Image11* image, const gl::ImageIndex &index);
269 virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage);
270 virtual bool isAssociatedImageValid(const gl::ImageIndex &index, Image11* expectedImage);
271 virtual gl::Error releaseAssociatedImage(const gl::ImageIndex &index, Image11* incomingImage);
274 virtual gl::Error getSwizzleTexture(ID3D11Resource **outTexture);
275 virtual gl::Error getSwizzleRenderTarget(int mipLevel, ID3D11RenderTargetView **outRTV);
278 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray);
280 virtual gl::Error createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture,
281 ID3D11ShaderResourceView **outSRV) const;
283 typedef std::pair<int, int> LevelLayerKey;
284 typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
285 RenderTargetMap mRenderTargets;
287 ID3D11Texture2D *mTexture;
289 ID3D11Texture2D *mSwizzleTexture;
290 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
292 typedef std::map<LevelLayerKey, Image11*> ImageMap;
293 ImageMap mAssociatedImages;
298 #endif // LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_