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/renderer/TextureStorage.h"
24 class TextureStorage11 : public TextureStorage
27 virtual ~TextureStorage11();
29 static TextureStorage11 *makeTextureStorage11(TextureStorage *storage);
31 static DWORD GetTextureBindFlags(GLenum internalFormat, GLuint clientVersion, bool renderTarget);
33 UINT getBindFlags() const;
35 virtual ID3D11Resource *getResource() const = 0;
36 virtual ID3D11ShaderResourceView *getSRV(const gl::SamplerState &samplerState);
37 virtual RenderTarget *getRenderTarget(int level) { return NULL; }
38 virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level) { return NULL; }
39 virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer) { return NULL; }
41 virtual void generateMipmap(int level) {};
42 virtual void generateMipmap(int face, int level) {};
44 virtual int getTopLevel() const;
45 virtual bool isRenderTarget() const;
46 virtual bool isManaged() const;
47 virtual int getLevelCount() const;
48 UINT getSubresourceIndex(int mipLevel, int layerTarget) const;
50 void generateSwizzles(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
51 void invalidateSwizzleCacheLevel(int mipLevel);
52 void invalidateSwizzleCache();
54 bool updateSubresourceLevel(ID3D11Resource *texture, unsigned int sourceSubresource, int level,
55 int layerTarget, GLint xoffset, GLint yoffset, GLint zoffset,
56 GLsizei width, GLsizei height, GLsizei depth);
59 TextureStorage11(Renderer *renderer, UINT bindFlags);
60 void generateMipmapLayer(RenderTarget11 *source, RenderTarget11 *dest);
61 int getLevelWidth(int mipLevel) const;
62 int getLevelHeight(int mipLevel) const;
63 int getLevelDepth(int mipLevel) const;
65 virtual ID3D11Resource *getSwizzleTexture() = 0;
66 virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel) = 0;
67 ID3D11ShaderResourceView *getSRVLevel(int mipLevel);
69 virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture) = 0;
71 void verifySwizzleExists(GLenum swizzleRed, GLenum swizzleGreen, GLenum swizzleBlue, GLenum swizzleAlpha);
73 virtual unsigned int getTextureLevelDepth(int mipLevel) const = 0;
75 Renderer11 *mRenderer;
77 unsigned int mMipLevels;
79 DXGI_FORMAT mTextureFormat;
80 DXGI_FORMAT mShaderResourceFormat;
81 DXGI_FORMAT mRenderTargetFormat;
82 DXGI_FORMAT mDepthStencilFormat;
83 DXGI_FORMAT mSwizzleTextureFormat;
84 DXGI_FORMAT mSwizzleShaderResourceFormat;
85 DXGI_FORMAT mSwizzleRenderTargetFormat;
86 unsigned int mTextureWidth;
87 unsigned int mTextureHeight;
88 unsigned int mTextureDepth;
90 struct SwizzleCacheValue
98 SwizzleCacheValue(GLenum red, GLenum green, GLenum blue, GLenum alpha);
100 bool operator ==(const SwizzleCacheValue &other) const;
101 bool operator !=(const SwizzleCacheValue &other) const;
103 SwizzleCacheValue mSwizzleCache[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
107 SRVKey(int baseLevel = 0, int mipLevels = 0, bool swizzle = false);
109 bool operator==(const SRVKey &rhs) const;
119 ID3D11ShaderResourceView *srv;
126 ID3D11ShaderResourceView *find(const SRVKey &key) const;
127 ID3D11ShaderResourceView *add(const SRVKey &key, ID3D11ShaderResourceView *srv);
129 std::vector<SRVPair> cache;
133 DISALLOW_COPY_AND_ASSIGN(TextureStorage11);
135 const UINT mBindFlags;
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 ID3D11Resource *getResource() const;
151 virtual RenderTarget *getRenderTarget(int level);
153 virtual void generateMipmap(int level);
156 virtual ID3D11Resource *getSwizzleTexture();
157 virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
159 virtual unsigned int getTextureLevelDepth(int mipLevel) const;
162 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2D);
164 virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
166 ID3D11Texture2D *mTexture;
167 RenderTarget11 *mRenderTarget[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
169 ID3D11Texture2D *mSwizzleTexture;
170 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
173 class TextureStorage11_Cube : public TextureStorage11
176 TextureStorage11_Cube(Renderer *renderer, GLenum internalformat, bool renderTarget, int size, int levels);
177 virtual ~TextureStorage11_Cube();
179 static TextureStorage11_Cube *makeTextureStorage11_Cube(TextureStorage *storage);
181 virtual ID3D11Resource *getResource() const;
182 virtual RenderTarget *getRenderTargetFace(GLenum faceTarget, int level);
184 virtual void generateMipmap(int faceIndex, int level);
187 virtual ID3D11Resource *getSwizzleTexture();
188 virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
190 virtual unsigned int getTextureLevelDepth(int mipLevel) const;
193 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_Cube);
195 virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
197 ID3D11Texture2D *mTexture;
198 RenderTarget11 *mRenderTarget[6][gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
200 ID3D11Texture2D *mSwizzleTexture;
201 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
204 class TextureStorage11_3D : public TextureStorage11
207 TextureStorage11_3D(Renderer *renderer, GLenum internalformat, bool renderTarget,
208 GLsizei width, GLsizei height, GLsizei depth, int levels);
209 virtual ~TextureStorage11_3D();
211 static TextureStorage11_3D *makeTextureStorage11_3D(TextureStorage *storage);
213 virtual ID3D11Resource *getResource() const;
214 virtual RenderTarget *getRenderTarget(int mipLevel);
215 virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
217 virtual void generateMipmap(int level);
220 virtual ID3D11Resource *getSwizzleTexture();
221 virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
223 virtual unsigned int getTextureLevelDepth(int mipLevel) const;
226 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_3D);
228 virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
230 typedef std::pair<int, int> LevelLayerKey;
231 typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
232 RenderTargetMap mLevelLayerRenderTargets;
234 RenderTarget11 *mLevelRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
236 ID3D11Texture3D *mTexture;
237 ID3D11Texture3D *mSwizzleTexture;
238 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
241 class TextureStorage11_2DArray : public TextureStorage11
244 TextureStorage11_2DArray(Renderer *renderer, GLenum internalformat, bool renderTarget,
245 GLsizei width, GLsizei height, GLsizei depth, int levels);
246 virtual ~TextureStorage11_2DArray();
248 static TextureStorage11_2DArray *makeTextureStorage11_2DArray(TextureStorage *storage);
250 virtual ID3D11Resource *getResource() const;
251 virtual RenderTarget *getRenderTargetLayer(int mipLevel, int layer);
253 virtual void generateMipmap(int level);
256 virtual ID3D11Resource *getSwizzleTexture();
257 virtual ID3D11RenderTargetView *getSwizzleRenderTarget(int mipLevel);
259 virtual unsigned int getTextureLevelDepth(int mipLevel) const;
262 DISALLOW_COPY_AND_ASSIGN(TextureStorage11_2DArray);
264 virtual ID3D11ShaderResourceView *createSRV(int baseLevel, int mipLevels, DXGI_FORMAT format, ID3D11Resource *texture);
266 typedef std::pair<int, int> LevelLayerKey;
267 typedef std::map<LevelLayerKey, RenderTarget11*> RenderTargetMap;
268 RenderTargetMap mRenderTargets;
270 ID3D11Texture2D *mTexture;
272 ID3D11Texture2D *mSwizzleTexture;
273 ID3D11RenderTargetView *mSwizzleRenderTargets[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
278 #endif // LIBGLESV2_RENDERER_TEXTURESTORAGE11_H_