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 LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
11 #define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
12 
13 #include "libANGLE/Error.h"
14 #include "libANGLE/Texture.h"
15 #include "libANGLE/renderer/d3d/TextureStorage.h"
16 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
17 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
18 
19 #include <array>
20 #include <map>
21 
22 namespace gl
23 {
24 struct ImageIndex;
25 }
26 
27 namespace rx
28 {
29 class EGLImageD3D;
30 class RenderTargetD3D;
31 class RenderTarget11;
32 class Renderer11;
33 class SwapChain11;
34 class Image11;
35 struct Renderer11DeviceCaps;
36 
37 template <typename T>
38 using TexLevelArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>;
39 
40 template <typename T>
41 using CubeFaceArray = std::array<T, gl::CUBE_FACE_COUNT>;
42 
43 class TextureStorage11 : public TextureStorage
44 {
45   public:
46     ~TextureStorage11() override;
47 
48     static DWORD GetTextureBindFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget);
49     static DWORD GetTextureMiscFlags(GLenum internalFormat, const Renderer11DeviceCaps &renderer11DeviceCaps, bool renderTarget, int levels);
50 
51     UINT getBindFlags() const;
52     UINT getMiscFlags() const;
53     const d3d11::Format &getFormatSet() const;
54     gl::Error getSRVLevels(const gl::Context *context,
55                            GLint baseLevel,
56                            GLint maxLevel,
57                            const d3d11::SharedSRV **outSRV);
58     gl::Error generateSwizzles(const gl::Context *context, const gl::SwizzleState &swizzleTarget);
59     void markLevelDirty(int mipLevel);
60     void markDirty();
61 
62     gl::Error updateSubresourceLevel(const gl::Context *context,
63                                      const TextureHelper11 &texture,
64                                      unsigned int sourceSubresource,
65                                      const gl::ImageIndex &index,
66                                      const gl::Box &copyArea);
67 
68     gl::Error copySubresourceLevel(const gl::Context *context,
69                                    const TextureHelper11 &dstTexture,
70                                    unsigned int dstSubresource,
71                                    const gl::ImageIndex &index,
72                                    const gl::Box &region);
73 
74     // TextureStorage virtual functions
75     int getTopLevel() const override;
76     bool isRenderTarget() const override;
77     bool isManaged() const override;
78     bool supportsNativeMipmapFunction() const override;
79     int getLevelCount() const override;
80     gl::Error generateMipmap(const gl::Context *context,
81                              const gl::ImageIndex &sourceIndex,
82                              const gl::ImageIndex &destIndex) override;
83     gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
84     gl::Error setData(const gl::Context *context,
85                       const gl::ImageIndex &index,
86                       ImageD3D *image,
87                       const gl::Box *destBox,
88                       GLenum type,
89                       const gl::PixelUnpackState &unpack,
90                       const uint8_t *pixelData) override;
91 
92     virtual gl::Error getSRV(const gl::Context *context,
93                              const gl::TextureState &textureState,
94                              const d3d11::SharedSRV **outSRV);
95     virtual UINT getSubresourceIndex(const gl::ImageIndex &index) const;
96     virtual gl::Error getResource(const gl::Context *context,
97                                   const TextureHelper11 **outResource) = 0;
98     virtual void associateImage(Image11* image, const gl::ImageIndex &index) = 0;
99     virtual void disassociateImage(const gl::ImageIndex &index, Image11* expectedImage) = 0;
100     virtual void verifyAssociatedImageValid(const gl::ImageIndex &index,
101                                             Image11 *expectedImage) = 0;
102     virtual gl::Error releaseAssociatedImage(const gl::Context *context,
103                                              const gl::ImageIndex &index,
104                                              Image11 *incomingImage) = 0;
105 
106   protected:
107     TextureStorage11(Renderer11 *renderer, UINT bindFlags, UINT miscFlags, GLenum internalFormat);
108     int getLevelWidth(int mipLevel) const;
109     int getLevelHeight(int mipLevel) const;
110     int getLevelDepth(int mipLevel) const;
111 
112     // Some classes (e.g. TextureStorage11_2D) will override getMippedResource.
113     virtual gl::Error getMippedResource(const gl::Context *context,
114                                         const TextureHelper11 **outResource);
115 
116     virtual gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) = 0;
117     virtual gl::Error getSwizzleRenderTarget(int mipLevel,
118                                              const d3d11::RenderTargetView **outRTV) = 0;
119     gl::Error getSRVLevel(const gl::Context *context,
120                           int mipLevel,
121                           bool blitSRV,
122                           const d3d11::SharedSRV **outSRV);
123 
124     // Get a version of a depth texture with only depth information, not stencil.
125     enum DropStencil
126     {
127         CREATED,
128         ALREADY_EXISTS
129     };
130     virtual gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context);
131     gl::Error initDropStencilTexture(const gl::Context *context, const gl::ImageIndexIterator &it);
132 
133     // The baseLevel parameter should *not* have mTopLevel applied.
134     virtual gl::Error createSRV(const gl::Context *context,
135                                 int baseLevel,
136                                 int mipLevels,
137                                 DXGI_FORMAT format,
138                                 const TextureHelper11 &texture,
139                                 d3d11::SharedSRV *outSRV) = 0;
140 
141     void verifySwizzleExists(const gl::SwizzleState &swizzleState);
142 
143     // Clear all cached non-swizzle SRVs and invalidate the swizzle cache.
144     void clearSRVCache();
145 
146     Renderer11 *mRenderer;
147     int mTopLevel;
148     unsigned int mMipLevels;
149 
150     const d3d11::Format &mFormatInfo;
151     unsigned int mTextureWidth;
152     unsigned int mTextureHeight;
153     unsigned int mTextureDepth;
154 
155     TexLevelArray<gl::SwizzleState> mSwizzleCache;
156     TextureHelper11 mDropStencilTexture;
157 
158   private:
159     const UINT mBindFlags;
160     const UINT mMiscFlags;
161 
162     struct SRVKey
163     {
164         SRVKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil);
165 
166         bool operator<(const SRVKey &rhs) const;
167 
168         int baseLevel    = 0;  // Without mTopLevel applied.
169         int mipLevels    = 0;
170         bool swizzle     = false;
171         bool dropStencil = false;
172     };
173     typedef std::map<SRVKey, d3d11::SharedSRV> SRVCache;
174 
175     gl::Error getCachedOrCreateSRV(const gl::Context *context,
176                                    const SRVKey &key,
177                                    const d3d11::SharedSRV **outSRV);
178 
179     SRVCache mSrvCache;
180     TexLevelArray<d3d11::SharedSRV> mLevelSRVs;
181     TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs;
182 };
183 
184 class TextureStorage11_2D : public TextureStorage11
185 {
186   public:
187     TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain);
188     TextureStorage11_2D(Renderer11 *renderer, GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, int levels, bool hintLevelZeroOnly = false);
189     ~TextureStorage11_2D() override;
190 
191     gl::Error onDestroy(const gl::Context *context) override;
192 
193     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
194     gl::Error getMippedResource(const gl::Context *context,
195                                 const TextureHelper11 **outResource) override;
196     gl::Error getRenderTarget(const gl::Context *context,
197                               const gl::ImageIndex &index,
198                               RenderTargetD3D **outRT) override;
199 
200     gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
201 
202     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
203     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
204     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
205     gl::Error releaseAssociatedImage(const gl::Context *context,
206                                      const gl::ImageIndex &index,
207                                      Image11 *incomingImage) override;
208 
209     gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
210                                             bool useLevelZeroTexture) override;
211 
212   protected:
213     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
214     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
215 
216     gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
217 
218     gl::Error ensureTextureExists(int mipLevels);
219 
220   private:
221     gl::Error createSRV(const gl::Context *context,
222                         int baseLevel,
223                         int mipLevels,
224                         DXGI_FORMAT format,
225                         const TextureHelper11 &texture,
226                         d3d11::SharedSRV *outSRV) override;
227 
228     TextureHelper11 mTexture;
229     TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget;
230     bool mHasKeyedMutex;
231 
232     // These are members related to the zero max-LOD workaround.
233     // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from level zero).
234     // These members are used to work around this limitation.
235     // Usually only mTexture XOR mLevelZeroTexture will exist.
236     // For example, if an app creates a texture with only one level, then 9_3 will only create mLevelZeroTexture.
237     // However, in some scenarios, both textures have to be created. This incurs additional memory overhead.
238     // One example of this is an application that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture.
239     // A more likely example is an app that creates an empty texture, renders to it, and then calls glGenerateMipmap
240     // TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been created to save memory.
241     TextureHelper11 mLevelZeroTexture;
242     std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget;
243     bool mUseLevelZeroTexture;
244 
245     // Swizzle-related variables
246     TextureHelper11 mSwizzleTexture;
247     TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
248 
249     TexLevelArray<Image11 *> mAssociatedImages;
250 };
251 
252 class TextureStorage11_External : public TextureStorage11
253 {
254   public:
255     TextureStorage11_External(Renderer11 *renderer,
256                               egl::Stream *stream,
257                               const egl::Stream::GLTextureDescription &glDesc);
258     ~TextureStorage11_External() override;
259 
260     gl::Error onDestroy(const gl::Context *context) override;
261 
262     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
263     gl::Error getMippedResource(const gl::Context *context,
264                                 const TextureHelper11 **outResource) override;
265     gl::Error getRenderTarget(const gl::Context *context,
266                               const gl::ImageIndex &index,
267                               RenderTargetD3D **outRT) override;
268 
269     gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
270 
271     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
272     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
273     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
274     gl::Error releaseAssociatedImage(const gl::Context *context,
275                                      const gl::ImageIndex &index,
276                                      Image11 *incomingImage) override;
277 
278   protected:
279     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
280     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
281 
282   private:
283     gl::Error createSRV(const gl::Context *context,
284                         int baseLevel,
285                         int mipLevels,
286                         DXGI_FORMAT format,
287                         const TextureHelper11 &texture,
288                         d3d11::SharedSRV *outSRV) override;
289 
290     TextureHelper11 mTexture;
291     int mSubresourceIndex;
292     bool mHasKeyedMutex;
293 
294     Image11 *mAssociatedImage;
295 };
296 
297 class TextureStorage11_EGLImage final : public TextureStorage11
298 {
299   public:
300     TextureStorage11_EGLImage(Renderer11 *renderer,
301                               EGLImageD3D *eglImage,
302                               RenderTarget11 *renderTarget11);
303     ~TextureStorage11_EGLImage() override;
304 
305     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
306     gl::Error getSRV(const gl::Context *context,
307                      const gl::TextureState &textureState,
308                      const d3d11::SharedSRV **outSRV) override;
309     gl::Error getMippedResource(const gl::Context *context,
310                                 const TextureHelper11 **outResource) override;
311     gl::Error getRenderTarget(const gl::Context *context,
312                               const gl::ImageIndex &index,
313                               RenderTargetD3D **outRT) override;
314 
315     gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
316 
317     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
318     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
319     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
320     gl::Error releaseAssociatedImage(const gl::Context *context,
321                                      const gl::ImageIndex &index,
322                                      Image11 *incomingImage) override;
323 
324     gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
325                                             bool useLevelZeroTexture) override;
326 
327   protected:
328     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
329     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
330 
331   private:
332     // Check if the EGL image's render target has been updated due to orphaning and delete
333     // any SRVs and other resources based on the image's old render target.
334     gl::Error checkForUpdatedRenderTarget(const gl::Context *context);
335 
336     gl::Error createSRV(const gl::Context *context,
337                         int baseLevel,
338                         int mipLevels,
339                         DXGI_FORMAT format,
340                         const TextureHelper11 &texture,
341                         d3d11::SharedSRV *outSRV) override;
342 
343     gl::Error getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const;
344 
345     EGLImageD3D *mImage;
346     uintptr_t mCurrentRenderTarget;
347 
348     // Swizzle-related variables
349     TextureHelper11 mSwizzleTexture;
350     std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets;
351 };
352 
353 class TextureStorage11_Cube : public TextureStorage11
354 {
355   public:
356     TextureStorage11_Cube(Renderer11 *renderer, GLenum internalformat, bool renderTarget, int size, int levels, bool hintLevelZeroOnly);
357     ~TextureStorage11_Cube() override;
358 
359     gl::Error onDestroy(const gl::Context *context) override;
360 
361     UINT getSubresourceIndex(const gl::ImageIndex &index) const override;
362 
363     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
364     gl::Error getMippedResource(const gl::Context *context,
365                                 const TextureHelper11 **outResource) override;
366     gl::Error getRenderTarget(const gl::Context *context,
367                               const gl::ImageIndex &index,
368                               RenderTargetD3D **outRT) override;
369 
370     gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
371 
372     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
373     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
374     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
375     gl::Error releaseAssociatedImage(const gl::Context *context,
376                                      const gl::ImageIndex &index,
377                                      Image11 *incomingImage) override;
378 
379     gl::Error useLevelZeroWorkaroundTexture(const gl::Context *context,
380                                             bool useLevelZeroTexture) override;
381 
382   protected:
383     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
384     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
385 
386     gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
387 
388     gl::Error ensureTextureExists(int mipLevels);
389 
390   private:
391     gl::Error createSRV(const gl::Context *context,
392                         int baseLevel,
393                         int mipLevels,
394                         DXGI_FORMAT format,
395                         const TextureHelper11 &texture,
396                         d3d11::SharedSRV *outSRV) override;
397     gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
398                                     const gl::ImageIndex &index,
399                                     DXGI_FORMAT resourceFormat,
400                                     d3d11::SharedSRV *srv) const;
401 
402     TextureHelper11 mTexture;
403     CubeFaceArray<TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget;
404 
405     // Level-zero workaround members. See TextureStorage11_2D's workaround members for a description.
406     TextureHelper11 mLevelZeroTexture;
407     CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget;
408     bool mUseLevelZeroTexture;
409 
410     TextureHelper11 mSwizzleTexture;
411     TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
412 
413     CubeFaceArray<TexLevelArray<Image11 *>> mAssociatedImages;
414 };
415 
416 class TextureStorage11_3D : public TextureStorage11
417 {
418   public:
419     TextureStorage11_3D(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
420                         GLsizei width, GLsizei height, GLsizei depth, int levels);
421     ~TextureStorage11_3D() override;
422 
423     gl::Error onDestroy(const gl::Context *context) override;
424 
425     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
426 
427     // Handles both layer and non-layer RTs
428     gl::Error getRenderTarget(const gl::Context *context,
429                               const gl::ImageIndex &index,
430                               RenderTargetD3D **outRT) override;
431 
432     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
433     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
434     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
435     gl::Error releaseAssociatedImage(const gl::Context *context,
436                                      const gl::ImageIndex &index,
437                                      Image11 *incomingImage) override;
438 
439   protected:
440     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
441     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
442 
443   private:
444     gl::Error createSRV(const gl::Context *context,
445                         int baseLevel,
446                         int mipLevels,
447                         DXGI_FORMAT format,
448                         const TextureHelper11 &texture,
449                         d3d11::SharedSRV *outSRV) override;
450 
451     typedef std::pair<int, int> LevelLayerKey;
452     std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets;
453 
454     TexLevelArray<std::unique_ptr<RenderTarget11>> mLevelRenderTargets;
455 
456     TextureHelper11 mTexture;
457     TextureHelper11 mSwizzleTexture;
458     TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
459 
460     TexLevelArray<Image11 *> mAssociatedImages;
461 };
462 
463 class TextureStorage11_2DArray : public TextureStorage11
464 {
465   public:
466     TextureStorage11_2DArray(Renderer11 *renderer, GLenum internalformat, bool renderTarget,
467                              GLsizei width, GLsizei height, GLsizei depth, int levels);
468     ~TextureStorage11_2DArray() override;
469 
470     gl::Error onDestroy(const gl::Context *context) override;
471 
472     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
473     gl::Error getRenderTarget(const gl::Context *context,
474                               const gl::ImageIndex &index,
475                               RenderTargetD3D **outRT) override;
476 
477     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
478     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
479     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
480     gl::Error releaseAssociatedImage(const gl::Context *context,
481                                      const gl::ImageIndex &index,
482                                      Image11 *incomingImage) override;
483 
484   protected:
485     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
486     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
487 
488     gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
489 
490   private:
491     struct LevelLayerRangeKey
492     {
LevelLayerRangeKeyLevelLayerRangeKey493         LevelLayerRangeKey(int mipLevelIn, int layerIn, int numLayersIn)
494             : mipLevel(mipLevelIn), layer(layerIn), numLayers(numLayersIn)
495         {
496         }
497         bool operator<(const LevelLayerRangeKey &other) const
498         {
499             if (mipLevel != other.mipLevel)
500             {
501                 return mipLevel < other.mipLevel;
502             }
503             if (layer != other.layer)
504             {
505                 return layer < other.layer;
506             }
507             return numLayers < other.numLayers;
508         }
509         int mipLevel;
510         int layer;
511         int numLayers;
512     };
513 
514   private:
515     gl::Error createSRV(const gl::Context *context,
516                         int baseLevel,
517                         int mipLevels,
518                         DXGI_FORMAT format,
519                         const TextureHelper11 &texture,
520                         d3d11::SharedSRV *outSRV) override;
521     gl::Error createRenderTargetSRV(const TextureHelper11 &texture,
522                                     const gl::ImageIndex &index,
523                                     DXGI_FORMAT resourceFormat,
524                                     d3d11::SharedSRV *srv) const;
525 
526     std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets;
527 
528     TextureHelper11 mTexture;
529 
530     TextureHelper11 mSwizzleTexture;
531     TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
532 
533     typedef std::map<LevelLayerRangeKey, Image11 *> ImageMap;
534     ImageMap mAssociatedImages;
535 };
536 
537 class TextureStorage11_2DMultisample : public TextureStorage11
538 {
539   public:
540     TextureStorage11_2DMultisample(Renderer11 *renderer,
541                                    GLenum internalformat,
542                                    GLsizei width,
543                                    GLsizei height,
544                                    int levels,
545                                    int samples,
546                                    bool fixedSampleLocations);
547     ~TextureStorage11_2DMultisample() override;
548 
549     gl::Error onDestroy(const gl::Context *context) override;
550 
551     gl::Error getResource(const gl::Context *context, const TextureHelper11 **outResource) override;
552     gl::Error getRenderTarget(const gl::Context *context,
553                               const gl::ImageIndex &index,
554                               RenderTargetD3D **outRT) override;
555 
556     gl::Error copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
557 
558     void associateImage(Image11 *image, const gl::ImageIndex &index) override;
559     void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
560     void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
561     gl::Error releaseAssociatedImage(const gl::Context *context,
562                                      const gl::ImageIndex &index,
563                                      Image11 *incomingImage) override;
564 
565   protected:
566     gl::Error getSwizzleTexture(const TextureHelper11 **outTexture) override;
567     gl::Error getSwizzleRenderTarget(int mipLevel, const d3d11::RenderTargetView **outRTV) override;
568 
569     gl::ErrorOrResult<DropStencil> ensureDropStencilTexture(const gl::Context *context) override;
570 
571     gl::Error ensureTextureExists(int mipLevels);
572 
573   private:
574     gl::Error createSRV(const gl::Context *context,
575                         int baseLevel,
576                         int mipLevels,
577                         DXGI_FORMAT format,
578                         const TextureHelper11 &texture,
579                         d3d11::SharedSRV *outSRV) override;
580 
581     TextureHelper11 mTexture;
582     std::unique_ptr<RenderTarget11> mRenderTarget;
583 
584     unsigned int mSamples;
585     GLboolean mFixedSampleLocations;
586 };
587 }
588 
589 #endif // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
590