tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TextureD3D.h (49896B)


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