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