1 //
2 // Copyright 2014 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 // TextureD3D.h: Implementations of the Texture interfaces shared betweeen the D3D backends.
8 
9 #ifndef LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
10 #define LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
11 
12 #include "common/Color.h"
13 #include "libANGLE/Constants.h"
14 #include "libANGLE/Stream.h"
15 #include "libANGLE/angletypes.h"
16 #include "libANGLE/renderer/TextureImpl.h"
17 #include "libANGLE/renderer/d3d/TextureStorage.h"
18 
19 namespace gl
20 {
21 class Framebuffer;
22 }
23 
24 namespace rx
25 {
26 class EGLImageD3D;
27 class ImageD3D;
28 class RendererD3D;
29 class RenderTargetD3D;
30 class TextureStorage;
31 
32 template <typename T>
33 using TexLevelsArray = std::array<T, gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS>;
34 
35 class TextureD3D : public TextureImpl
36 {
37   public:
38     TextureD3D(const gl::TextureState &data, RendererD3D *renderer);
39     ~TextureD3D() override;
40 
41     gl::Error onDestroy(const gl::Context *context) override;
42 
43     gl::Error getNativeTexture(const gl::Context *context, TextureStorage **outStorage);
44 
hasDirtyImages()45     bool hasDirtyImages() const { return mDirtyImages; }
resetDirty()46     void resetDirty() { mDirtyImages = false; }
47 
48     virtual ImageD3D *getImage(const gl::ImageIndex &index) const = 0;
49     virtual GLsizei getLayerCount(int level) const = 0;
50 
51     gl::Error getImageAndSyncFromStorage(const gl::Context *context,
52                                          const gl::ImageIndex &index,
53                                          ImageD3D **outImage);
54 
55     GLint getBaseLevelWidth() const;
56     GLint getBaseLevelHeight() const;
57     GLenum getBaseLevelInternalFormat() const;
58 
59     gl::Error setStorage(const gl::Context *context,
60                          GLenum target,
61                          size_t levels,
62                          GLenum internalFormat,
63                          const gl::Extents &size) override;
64 
65     gl::Error setStorageMultisample(const gl::Context *context,
66                                     GLenum target,
67                                     GLsizei samples,
68                                     GLint internalFormat,
69                                     const gl::Extents &size,
70                                     bool fixedSampleLocations) override;
71 
isImmutable()72     bool isImmutable() const { return mImmutable; }
73 
74     virtual gl::Error getRenderTarget(const gl::Context *context,
75                                       const gl::ImageIndex &index,
76                                       RenderTargetD3D **outRT) = 0;
77 
78     // Returns an iterator over all "Images" for this particular Texture.
79     virtual gl::ImageIndexIterator imageIterator() const = 0;
80 
81     // Returns an ImageIndex for a particular "Image". 3D Textures do not have images for
82     // slices of their depth texures, so 3D textures ignore the layer parameter.
83     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const = 0;
84     virtual bool isValidIndex(const gl::ImageIndex &index) const = 0;
85 
86     gl::Error setImageExternal(const gl::Context *context,
87                                GLenum target,
88                                egl::Stream *stream,
89                                const egl::Stream::GLTextureDescription &desc) override;
90     gl::Error generateMipmap(const gl::Context *context) override;
91     TextureStorage *getStorage();
92     ImageD3D *getBaseLevelImage() const;
93 
94     gl::Error getAttachmentRenderTarget(const gl::Context *context,
95                                         GLenum binding,
96                                         const gl::ImageIndex &imageIndex,
97                                         FramebufferAttachmentRenderTarget **rtOut) override;
98 
99     gl::Error setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
100 
101     void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
102 
103     gl::Error initializeContents(const gl::Context *context,
104                                  const gl::ImageIndex &imageIndex) override;
105 
106   protected:
107     gl::Error setImageImpl(const gl::Context *context,
108                            const gl::ImageIndex &index,
109                            GLenum type,
110                            const gl::PixelUnpackState &unpack,
111                            const uint8_t *pixels,
112                            ptrdiff_t layerOffset);
113     gl::Error subImage(const gl::Context *context,
114                        const gl::ImageIndex &index,
115                        const gl::Box &area,
116                        GLenum format,
117                        GLenum type,
118                        const gl::PixelUnpackState &unpack,
119                        const uint8_t *pixels,
120                        ptrdiff_t layerOffset);
121     gl::Error setCompressedImageImpl(const gl::Context *context,
122                                      const gl::ImageIndex &index,
123                                      const gl::PixelUnpackState &unpack,
124                                      const uint8_t *pixels,
125                                      ptrdiff_t layerOffset);
126     gl::Error subImageCompressed(const gl::Context *context,
127                                  const gl::ImageIndex &index,
128                                  const gl::Box &area,
129                                  GLenum format,
130                                  const gl::PixelUnpackState &unpack,
131                                  const uint8_t *pixels,
132                                  ptrdiff_t layerOffset);
133     bool isFastUnpackable(const gl::Buffer *unpackBuffer, GLenum sizedInternalFormat);
134     gl::Error fastUnpackPixels(const gl::Context *context,
135                                const gl::PixelUnpackState &unpack,
136                                const uint8_t *pixels,
137                                const gl::Box &destArea,
138                                GLenum sizedInternalFormat,
139                                GLenum type,
140                                RenderTargetD3D *destRenderTarget);
141 
142     GLint getLevelZeroWidth() const;
143     GLint getLevelZeroHeight() const;
144     virtual GLint getLevelZeroDepth() const;
145 
146     GLint creationLevels(GLsizei width, GLsizei height, GLsizei depth) const;
147     virtual gl::Error initMipmapImages(const gl::Context *context) = 0;
148     bool isBaseImageZeroSize() const;
149     virtual bool isImageComplete(const gl::ImageIndex &index) const = 0;
150 
151     bool canCreateRenderTargetForImage(const gl::ImageIndex &index) const;
152     gl::Error ensureRenderTarget(const gl::Context *context);
153 
154     virtual gl::Error createCompleteStorage(bool renderTarget,
155                                             TexStoragePointer *outTexStorage) const = 0;
156     virtual gl::Error setCompleteTexStorage(const gl::Context *context,
157                                             TextureStorage *newCompleteTexStorage) = 0;
158     gl::Error commitRegion(const gl::Context *context,
159                            const gl::ImageIndex &index,
160                            const gl::Box &region);
161 
162     gl::Error releaseTexStorage(const gl::Context *context);
163 
getBaseLevel()164     GLuint getBaseLevel() const { return mBaseLevel; };
165 
166     virtual void markAllImagesDirty() = 0;
167 
168     GLint getBaseLevelDepth() const;
169 
170     RendererD3D *mRenderer;
171 
172     bool mDirtyImages;
173 
174     bool mImmutable;
175     TextureStorage *mTexStorage;
176 
177   private:
178     virtual gl::Error initializeStorage(const gl::Context *context, bool renderTarget) = 0;
179 
180     virtual gl::Error updateStorage(const gl::Context *context) = 0;
181 
182     bool shouldUseSetData(const ImageD3D *image) const;
183 
184     gl::Error generateMipmapUsingImages(const gl::Context *context, const GLuint maxLevel);
185 
186     GLuint mBaseLevel;
187 };
188 
189 class TextureD3D_2D : public TextureD3D
190 {
191   public:
192     TextureD3D_2D(const gl::TextureState &data, RendererD3D *renderer);
193     ~TextureD3D_2D() override;
194 
195     gl::Error onDestroy(const gl::Context *context) override;
196 
197     ImageD3D *getImage(int level, int layer) const;
198     ImageD3D *getImage(const gl::ImageIndex &index) const override;
199     GLsizei getLayerCount(int level) const override;
200 
201     GLsizei getWidth(GLint level) const;
202     GLsizei getHeight(GLint level) const;
203     GLenum getInternalFormat(GLint level) const;
204     bool isDepth(GLint level) const;
205     bool isSRGB(GLint level) const;
206 
207     gl::Error setImage(const gl::Context *context,
208                        GLenum target,
209                        size_t level,
210                        GLenum internalFormat,
211                        const gl::Extents &size,
212                        GLenum format,
213                        GLenum type,
214                        const gl::PixelUnpackState &unpack,
215                        const uint8_t *pixels) override;
216     gl::Error setSubImage(const gl::Context *context,
217                           GLenum target,
218                           size_t level,
219                           const gl::Box &area,
220                           GLenum format,
221                           GLenum type,
222                           const gl::PixelUnpackState &unpack,
223                           const uint8_t *pixels) override;
224 
225     gl::Error setCompressedImage(const gl::Context *context,
226                                  GLenum target,
227                                  size_t level,
228                                  GLenum internalFormat,
229                                  const gl::Extents &size,
230                                  const gl::PixelUnpackState &unpack,
231                                  size_t imageSize,
232                                  const uint8_t *pixels) override;
233     gl::Error setCompressedSubImage(const gl::Context *context,
234                                     GLenum target,
235                                     size_t level,
236                                     const gl::Box &area,
237                                     GLenum format,
238                                     const gl::PixelUnpackState &unpack,
239                                     size_t imageSize,
240                                     const uint8_t *pixels) override;
241 
242     gl::Error copyImage(const gl::Context *context,
243                         GLenum target,
244                         size_t level,
245                         const gl::Rectangle &sourceArea,
246                         GLenum internalFormat,
247                         const gl::Framebuffer *source) override;
248     gl::Error copySubImage(const gl::Context *context,
249                            GLenum target,
250                            size_t level,
251                            const gl::Offset &destOffset,
252                            const gl::Rectangle &sourceArea,
253                            const gl::Framebuffer *source) override;
254 
255     gl::Error copyTexture(const gl::Context *context,
256                           GLenum target,
257                           size_t level,
258                           GLenum internalFormat,
259                           GLenum type,
260                           size_t sourceLevel,
261                           bool unpackFlipY,
262                           bool unpackPremultiplyAlpha,
263                           bool unpackUnmultiplyAlpha,
264                           const gl::Texture *source) override;
265     gl::Error copySubTexture(const gl::Context *context,
266                              GLenum target,
267                              size_t level,
268                              const gl::Offset &destOffset,
269                              size_t sourceLevel,
270                              const gl::Rectangle &sourceArea,
271                              bool unpackFlipY,
272                              bool unpackPremultiplyAlpha,
273                              bool unpackUnmultiplyAlpha,
274                              const gl::Texture *source) override;
275     gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source) override;
276 
277     gl::Error setStorage(const gl::Context *context,
278                          GLenum target,
279                          size_t levels,
280                          GLenum internalFormat,
281                          const gl::Extents &size) override;
282 
283     gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
284     gl::Error releaseTexImage(const gl::Context *context) override;
285 
286     gl::Error setEGLImageTarget(const gl::Context *context,
287                                 GLenum target,
288                                 egl::Image *image) override;
289 
290     gl::Error getRenderTarget(const gl::Context *context,
291                               const gl::ImageIndex &index,
292                               RenderTargetD3D **outRT) override;
293 
294     gl::ImageIndexIterator imageIterator() const override;
295     gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
296     bool isValidIndex(const gl::ImageIndex &index) const override;
297 
298   protected:
299     void markAllImagesDirty() override;
300 
301   private:
302     gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
303     gl::Error createCompleteStorage(bool renderTarget,
304                                     TexStoragePointer *outTexStorage) const override;
305     gl::Error setCompleteTexStorage(const gl::Context *context,
306                                     TextureStorage *newCompleteTexStorage) override;
307 
308     gl::Error updateStorage(const gl::Context *context) override;
309     gl::Error initMipmapImages(const gl::Context *context) override;
310 
311     bool isValidLevel(int level) const;
312     bool isLevelComplete(int level) const;
313     bool isImageComplete(const gl::ImageIndex &index) const override;
314 
315     gl::Error updateStorageLevel(const gl::Context *context, int level);
316 
317     gl::Error redefineImage(const gl::Context *context,
318                             size_t level,
319                             GLenum internalformat,
320                             const gl::Extents &size,
321                             bool forceRelease);
322 
323     bool mEGLImageTarget;
324     TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray;
325 };
326 
327 class TextureD3D_Cube : public TextureD3D
328 {
329   public:
330     TextureD3D_Cube(const gl::TextureState &data, RendererD3D *renderer);
331     ~TextureD3D_Cube() override;
332 
333     gl::Error onDestroy(const gl::Context *context) override;
334 
335     ImageD3D *getImage(int level, int layer) const;
336     ImageD3D *getImage(const gl::ImageIndex &index) const override;
337     GLsizei getLayerCount(int level) const override;
338 
339     GLenum getInternalFormat(GLint level, GLint layer) const;
340     bool isDepth(GLint level, GLint layer) const;
341     bool isSRGB(GLint level, GLint layer) const;
342 
343     gl::Error setImage(const gl::Context *context,
344                        GLenum target,
345                        size_t level,
346                        GLenum internalFormat,
347                        const gl::Extents &size,
348                        GLenum format,
349                        GLenum type,
350                        const gl::PixelUnpackState &unpack,
351                        const uint8_t *pixels) override;
352     gl::Error setSubImage(const gl::Context *context,
353                           GLenum target,
354                           size_t level,
355                           const gl::Box &area,
356                           GLenum format,
357                           GLenum type,
358                           const gl::PixelUnpackState &unpack,
359                           const uint8_t *pixels) override;
360 
361     gl::Error setCompressedImage(const gl::Context *context,
362                                  GLenum target,
363                                  size_t level,
364                                  GLenum internalFormat,
365                                  const gl::Extents &size,
366                                  const gl::PixelUnpackState &unpack,
367                                  size_t imageSize,
368                                  const uint8_t *pixels) override;
369     gl::Error setCompressedSubImage(const gl::Context *context,
370                                     GLenum target,
371                                     size_t level,
372                                     const gl::Box &area,
373                                     GLenum format,
374                                     const gl::PixelUnpackState &unpack,
375                                     size_t imageSize,
376                                     const uint8_t *pixels) override;
377 
378     gl::Error copyImage(const gl::Context *context,
379                         GLenum target,
380                         size_t level,
381                         const gl::Rectangle &sourceArea,
382                         GLenum internalFormat,
383                         const gl::Framebuffer *source) override;
384     gl::Error copySubImage(const gl::Context *context,
385                            GLenum target,
386                            size_t level,
387                            const gl::Offset &destOffset,
388                            const gl::Rectangle &sourceArea,
389                            const gl::Framebuffer *source) override;
390 
391     gl::Error copyTexture(const gl::Context *context,
392                           GLenum target,
393                           size_t level,
394                           GLenum internalFormat,
395                           GLenum type,
396                           size_t sourceLevel,
397                           bool unpackFlipY,
398                           bool unpackPremultiplyAlpha,
399                           bool unpackUnmultiplyAlpha,
400                           const gl::Texture *source) override;
401     gl::Error copySubTexture(const gl::Context *context,
402                              GLenum target,
403                              size_t level,
404                              const gl::Offset &destOffset,
405                              size_t sourceLevel,
406                              const gl::Rectangle &sourceArea,
407                              bool unpackFlipY,
408                              bool unpackPremultiplyAlpha,
409                              bool unpackUnmultiplyAlpha,
410                              const gl::Texture *source) override;
411 
412     gl::Error setStorage(const gl::Context *context,
413                          GLenum target,
414                          size_t levels,
415                          GLenum internalFormat,
416                          const gl::Extents &size) override;
417 
418     gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
419     gl::Error releaseTexImage(const gl::Context *context) override;
420 
421     gl::Error setEGLImageTarget(const gl::Context *context,
422                                 GLenum target,
423                                 egl::Image *image) override;
424 
425     gl::Error getRenderTarget(const gl::Context *context,
426                               const gl::ImageIndex &index,
427                               RenderTargetD3D **outRT) override;
428 
429     gl::ImageIndexIterator imageIterator() const override;
430     gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
431     bool isValidIndex(const gl::ImageIndex &index) const override;
432 
433   protected:
434     void markAllImagesDirty() override;
435 
436   private:
437     gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
438     gl::Error createCompleteStorage(bool renderTarget,
439                                     TexStoragePointer *outTexStorage) const override;
440     gl::Error setCompleteTexStorage(const gl::Context *context,
441                                     TextureStorage *newCompleteTexStorage) override;
442 
443     gl::Error updateStorage(const gl::Context *context) override;
444     gl::Error initMipmapImages(const gl::Context *context) override;
445 
446     bool isValidFaceLevel(int faceIndex, int level) const;
447     bool isFaceLevelComplete(int faceIndex, int level) const;
448     bool isCubeComplete() const;
449     bool isImageComplete(const gl::ImageIndex &index) const override;
450     gl::Error updateStorageFaceLevel(const gl::Context *context, int faceIndex, int level);
451 
452     gl::Error redefineImage(const gl::Context *context,
453                             int faceIndex,
454                             GLint level,
455                             GLenum internalformat,
456                             const gl::Extents &size,
457                             bool forceRelease);
458 
459     std::array<TexLevelsArray<std::unique_ptr<ImageD3D>>, 6> mImageArray;
460 };
461 
462 class TextureD3D_3D : public TextureD3D
463 {
464   public:
465     TextureD3D_3D(const gl::TextureState &data, RendererD3D *renderer);
466     ~TextureD3D_3D() override;
467 
468     gl::Error onDestroy(const gl::Context *context) override;
469 
470     ImageD3D *getImage(int level, int layer) const;
471     ImageD3D *getImage(const gl::ImageIndex &index) const override;
472     GLsizei getLayerCount(int level) const override;
473 
474     GLsizei getWidth(GLint level) const;
475     GLsizei getHeight(GLint level) const;
476     GLsizei getDepth(GLint level) const;
477     GLenum getInternalFormat(GLint level) const;
478     bool isDepth(GLint level) const;
479 
480     gl::Error setImage(const gl::Context *context,
481                        GLenum target,
482                        size_t level,
483                        GLenum internalFormat,
484                        const gl::Extents &size,
485                        GLenum format,
486                        GLenum type,
487                        const gl::PixelUnpackState &unpack,
488                        const uint8_t *pixels) override;
489     gl::Error setSubImage(const gl::Context *context,
490                           GLenum target,
491                           size_t level,
492                           const gl::Box &area,
493                           GLenum format,
494                           GLenum type,
495                           const gl::PixelUnpackState &unpack,
496                           const uint8_t *pixels) override;
497 
498     gl::Error setCompressedImage(const gl::Context *context,
499                                  GLenum target,
500                                  size_t level,
501                                  GLenum internalFormat,
502                                  const gl::Extents &size,
503                                  const gl::PixelUnpackState &unpack,
504                                  size_t imageSize,
505                                  const uint8_t *pixels) override;
506     gl::Error setCompressedSubImage(const gl::Context *context,
507                                     GLenum target,
508                                     size_t level,
509                                     const gl::Box &area,
510                                     GLenum format,
511                                     const gl::PixelUnpackState &unpack,
512                                     size_t imageSize,
513                                     const uint8_t *pixels) override;
514 
515     gl::Error copyImage(const gl::Context *context,
516                         GLenum target,
517                         size_t level,
518                         const gl::Rectangle &sourceArea,
519                         GLenum internalFormat,
520                         const gl::Framebuffer *source) override;
521     gl::Error copySubImage(const gl::Context *context,
522                            GLenum target,
523                            size_t level,
524                            const gl::Offset &destOffset,
525                            const gl::Rectangle &sourceArea,
526                            const gl::Framebuffer *source) override;
527 
528     gl::Error setStorage(const gl::Context *context,
529                          GLenum target,
530                          size_t levels,
531                          GLenum internalFormat,
532                          const gl::Extents &size) override;
533 
534     gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
535     gl::Error releaseTexImage(const gl::Context *context) override;
536 
537     gl::Error setEGLImageTarget(const gl::Context *context,
538                                 GLenum target,
539                                 egl::Image *image) override;
540 
541     gl::Error getRenderTarget(const gl::Context *context,
542                               const gl::ImageIndex &index,
543                               RenderTargetD3D **outRT) override;
544 
545     gl::ImageIndexIterator imageIterator() const override;
546     gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
547     bool isValidIndex(const gl::ImageIndex &index) const override;
548 
549   protected:
550     void markAllImagesDirty() override;
551     GLint getLevelZeroDepth() const override;
552 
553   private:
554     gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
555     gl::Error createCompleteStorage(bool renderTarget,
556                                     TexStoragePointer *outStorage) const override;
557     gl::Error setCompleteTexStorage(const gl::Context *context,
558                                     TextureStorage *newCompleteTexStorage) override;
559 
560     gl::Error updateStorage(const gl::Context *context) override;
561     gl::Error initMipmapImages(const gl::Context *context) override;
562 
563     bool isValidLevel(int level) const;
564     bool isLevelComplete(int level) const;
565     bool isImageComplete(const gl::ImageIndex &index) const override;
566     gl::Error updateStorageLevel(const gl::Context *context, int level);
567 
568     gl::Error redefineImage(const gl::Context *context,
569                             GLint level,
570                             GLenum internalformat,
571                             const gl::Extents &size,
572                             bool forceRelease);
573 
574     TexLevelsArray<std::unique_ptr<ImageD3D>> mImageArray;
575 };
576 
577 class TextureD3D_2DArray : public TextureD3D
578 {
579   public:
580     TextureD3D_2DArray(const gl::TextureState &data, RendererD3D *renderer);
581     ~TextureD3D_2DArray() override;
582 
583     gl::Error onDestroy(const gl::Context *context) override;
584 
585     virtual ImageD3D *getImage(int level, int layer) const;
586     ImageD3D *getImage(const gl::ImageIndex &index) const override;
587     GLsizei getLayerCount(int level) const override;
588 
589     GLsizei getWidth(GLint level) const;
590     GLsizei getHeight(GLint level) const;
591     GLenum getInternalFormat(GLint level) const;
592     bool isDepth(GLint level) const;
593 
594     gl::Error setImage(const gl::Context *context,
595                        GLenum target,
596                        size_t level,
597                        GLenum internalFormat,
598                        const gl::Extents &size,
599                        GLenum format,
600                        GLenum type,
601                        const gl::PixelUnpackState &unpack,
602                        const uint8_t *pixels) override;
603     gl::Error setSubImage(const gl::Context *context,
604                           GLenum target,
605                           size_t level,
606                           const gl::Box &area,
607                           GLenum format,
608                           GLenum type,
609                           const gl::PixelUnpackState &unpack,
610                           const uint8_t *pixels) override;
611 
612     gl::Error setCompressedImage(const gl::Context *context,
613                                  GLenum target,
614                                  size_t level,
615                                  GLenum internalFormat,
616                                  const gl::Extents &size,
617                                  const gl::PixelUnpackState &unpack,
618                                  size_t imageSize,
619                                  const uint8_t *pixels) override;
620     gl::Error setCompressedSubImage(const gl::Context *context,
621                                     GLenum target,
622                                     size_t level,
623                                     const gl::Box &area,
624                                     GLenum format,
625                                     const gl::PixelUnpackState &unpack,
626                                     size_t imageSize,
627                                     const uint8_t *pixels) override;
628 
629     gl::Error copyImage(const gl::Context *context,
630                         GLenum target,
631                         size_t level,
632                         const gl::Rectangle &sourceArea,
633                         GLenum internalFormat,
634                         const gl::Framebuffer *source) override;
635     gl::Error copySubImage(const gl::Context *context,
636                            GLenum target,
637                            size_t level,
638                            const gl::Offset &destOffset,
639                            const gl::Rectangle &sourceArea,
640                            const gl::Framebuffer *source) override;
641 
642     gl::Error setStorage(const gl::Context *context,
643                          GLenum target,
644                          size_t levels,
645                          GLenum internalFormat,
646                          const gl::Extents &size) override;
647 
648     gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
649     gl::Error releaseTexImage(const gl::Context *context) override;
650 
651     gl::Error setEGLImageTarget(const gl::Context *context,
652                                 GLenum target,
653                                 egl::Image *image) override;
654 
655     gl::Error getRenderTarget(const gl::Context *context,
656                               const gl::ImageIndex &index,
657                               RenderTargetD3D **outRT) override;
658 
659     gl::ImageIndexIterator imageIterator() const override;
660     gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
661     bool isValidIndex(const gl::ImageIndex &index) const override;
662 
663   protected:
664     void markAllImagesDirty() override;
665 
666   private:
667     gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
668     gl::Error createCompleteStorage(bool renderTarget,
669                                     TexStoragePointer *outStorage) const override;
670     gl::Error setCompleteTexStorage(const gl::Context *context,
671                                     TextureStorage *newCompleteTexStorage) override;
672 
673     gl::Error updateStorage(const gl::Context *context) override;
674     gl::Error initMipmapImages(const gl::Context *context) override;
675 
676     bool isValidLevel(int level) const;
677     bool isLevelComplete(int level) const;
678     bool isImageComplete(const gl::ImageIndex &index) const override;
679     gl::Error updateStorageLevel(const gl::Context *context, int level);
680 
681     void deleteImages();
682     gl::Error redefineImage(const gl::Context *context,
683                             GLint level,
684                             GLenum internalformat,
685                             const gl::Extents &size,
686                             bool forceRelease);
687 
688     // Storing images as an array of single depth textures since D3D11 treats each array level of a
689     // Texture2D object as a separate subresource.  Each layer would have to be looped over
690     // to update all the texture layers since they cannot all be updated at once and it makes the most
691     // sense for the Image class to not have to worry about layer subresource as well as mip subresources.
692     GLsizei mLayerCounts[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
693     ImageD3D **mImageArray[gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS];
694 };
695 
696 class TextureD3D_External : public TextureD3D
697 {
698   public:
699     TextureD3D_External(const gl::TextureState &data, RendererD3D *renderer);
700     ~TextureD3D_External() override;
701 
702     ImageD3D *getImage(const gl::ImageIndex &index) const override;
703     GLsizei getLayerCount(int level) const override;
704 
705     gl::Error setImage(const gl::Context *context,
706                        GLenum target,
707                        size_t level,
708                        GLenum internalFormat,
709                        const gl::Extents &size,
710                        GLenum format,
711                        GLenum type,
712                        const gl::PixelUnpackState &unpack,
713                        const uint8_t *pixels) override;
714     gl::Error setSubImage(const gl::Context *context,
715                           GLenum target,
716                           size_t level,
717                           const gl::Box &area,
718                           GLenum format,
719                           GLenum type,
720                           const gl::PixelUnpackState &unpack,
721                           const uint8_t *pixels) override;
722 
723     gl::Error setCompressedImage(const gl::Context *context,
724                                  GLenum target,
725                                  size_t level,
726                                  GLenum internalFormat,
727                                  const gl::Extents &size,
728                                  const gl::PixelUnpackState &unpack,
729                                  size_t imageSize,
730                                  const uint8_t *pixels) override;
731     gl::Error setCompressedSubImage(const gl::Context *context,
732                                     GLenum target,
733                                     size_t level,
734                                     const gl::Box &area,
735                                     GLenum format,
736                                     const gl::PixelUnpackState &unpack,
737                                     size_t imageSize,
738                                     const uint8_t *pixels) override;
739 
740     gl::Error copyImage(const gl::Context *context,
741                         GLenum target,
742                         size_t level,
743                         const gl::Rectangle &sourceArea,
744                         GLenum internalFormat,
745                         const gl::Framebuffer *source) override;
746     gl::Error copySubImage(const gl::Context *context,
747                            GLenum target,
748                            size_t level,
749                            const gl::Offset &destOffset,
750                            const gl::Rectangle &sourceArea,
751                            const gl::Framebuffer *source) override;
752 
753     gl::Error setStorage(const gl::Context *context,
754                          GLenum target,
755                          size_t levels,
756                          GLenum internalFormat,
757                          const gl::Extents &size) override;
758 
759     gl::Error setImageExternal(const gl::Context *context,
760                                GLenum target,
761                                egl::Stream *stream,
762                                const egl::Stream::GLTextureDescription &desc) override;
763 
764     gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
765     gl::Error releaseTexImage(const gl::Context *context) override;
766 
767     gl::Error setEGLImageTarget(const gl::Context *context,
768                                 GLenum target,
769                                 egl::Image *image) override;
770 
771     gl::Error getRenderTarget(const gl::Context *context,
772                               const gl::ImageIndex &index,
773                               RenderTargetD3D **outRT) override;
774 
775     gl::ImageIndexIterator imageIterator() const override;
776     gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
777     bool isValidIndex(const gl::ImageIndex &index) const override;
778 
779   protected:
780     void markAllImagesDirty() override;
781 
782   private:
783     gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
784     gl::Error createCompleteStorage(bool renderTarget,
785                                     TexStoragePointer *outTexStorage) const override;
786     gl::Error setCompleteTexStorage(const gl::Context *context,
787                                     TextureStorage *newCompleteTexStorage) override;
788 
789     gl::Error updateStorage(const gl::Context *context) override;
790     gl::Error initMipmapImages(const gl::Context *context) override;
791 
792     bool isImageComplete(const gl::ImageIndex &index) const override;
793 };
794 
795 class TextureD3D_2DMultisample : public TextureD3D
796 {
797   public:
798     TextureD3D_2DMultisample(const gl::TextureState &data, RendererD3D *renderer);
799     ~TextureD3D_2DMultisample() override;
800 
801     ImageD3D *getImage(const gl::ImageIndex &index) const override;
802     gl::Error setImage(const gl::Context *context,
803                        GLenum target,
804                        size_t level,
805                        GLenum internalFormat,
806                        const gl::Extents &size,
807                        GLenum format,
808                        GLenum type,
809                        const gl::PixelUnpackState &unpack,
810                        const uint8_t *pixels) override;
811     gl::Error setSubImage(const gl::Context *context,
812                           GLenum target,
813                           size_t level,
814                           const gl::Box &area,
815                           GLenum format,
816                           GLenum type,
817                           const gl::PixelUnpackState &unpack,
818                           const uint8_t *pixels) override;
819 
820     gl::Error setCompressedImage(const gl::Context *context,
821                                  GLenum target,
822                                  size_t level,
823                                  GLenum internalFormat,
824                                  const gl::Extents &size,
825                                  const gl::PixelUnpackState &unpack,
826                                  size_t imageSize,
827                                  const uint8_t *pixels) override;
828     gl::Error setCompressedSubImage(const gl::Context *context,
829                                     GLenum target,
830                                     size_t level,
831                                     const gl::Box &area,
832                                     GLenum format,
833                                     const gl::PixelUnpackState &unpack,
834                                     size_t imageSize,
835                                     const uint8_t *pixels) override;
836 
837     gl::Error copyImage(const gl::Context *context,
838                         GLenum target,
839                         size_t level,
840                         const gl::Rectangle &sourceArea,
841                         GLenum internalFormat,
842                         const gl::Framebuffer *source) override;
843     gl::Error copySubImage(const gl::Context *context,
844                            GLenum target,
845                            size_t level,
846                            const gl::Offset &destOffset,
847                            const gl::Rectangle &sourceArea,
848                            const gl::Framebuffer *source) override;
849 
850     gl::Error setStorageMultisample(const gl::Context *context,
851                                     GLenum target,
852                                     GLsizei samples,
853                                     GLint internalFormat,
854                                     const gl::Extents &size,
855                                     bool fixedSampleLocations) override;
856 
857     gl::Error bindTexImage(const gl::Context *context, egl::Surface *surface) override;
858     gl::Error releaseTexImage(const gl::Context *context) override;
859 
860     gl::Error setEGLImageTarget(const gl::Context *context,
861                                 GLenum target,
862                                 egl::Image *image) override;
863 
864     gl::Error getRenderTarget(const gl::Context *context,
865                               const gl::ImageIndex &index,
866                               RenderTargetD3D **outRT) override;
867 
868     gl::ImageIndexIterator imageIterator() const override;
869     gl::ImageIndex getImageIndex(GLint mip, GLint layer) const override;
870     bool isValidIndex(const gl::ImageIndex &index) const override;
871 
872     GLsizei getLayerCount(int level) const override;
873 
874   protected:
875     void markAllImagesDirty() override;
876 
877   private:
878     gl::Error initializeStorage(const gl::Context *context, bool renderTarget) override;
879     gl::Error createCompleteStorage(bool renderTarget,
880                                     TexStoragePointer *outTexStorage) const override;
881     gl::Error setCompleteTexStorage(const gl::Context *context,
882                                     TextureStorage *newCompleteTexStorage) override;
883 
884     gl::Error updateStorage(const gl::Context *context) override;
885     gl::Error initMipmapImages(const gl::Context *context) override;
886 
887     bool isImageComplete(const gl::ImageIndex &index) const override;
888 };
889 }
890 
891 #endif // LIBANGLE_RENDERER_D3D_TEXTURED3D_H_
892