tor-browser

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

TextureStorage11.h (47868B)


      1 //
      2 // Copyright 2012 The ANGLE Project Authors. All rights reserved.
      3 // Use of this source code is governed by a BSD-style license that can be
      4 // found in the LICENSE file.
      5 //
      6 
      7 // TextureStorage11.h: Defines the abstract rx::TextureStorage11 class and its concrete derived
      8 // classes TextureStorage11_2D and TextureStorage11_Cube, which act as the interface to the D3D11
      9 // texture.
     10 
     11 #ifndef LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
     12 #define LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_
     13 
     14 #include "libANGLE/Error.h"
     15 #include "libANGLE/Texture.h"
     16 #include "libANGLE/renderer/d3d/TextureStorage.h"
     17 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
     18 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
     19 
     20 #include <array>
     21 #include <map>
     22 
     23 namespace gl
     24 {
     25 class ImageIndex;
     26 }  // namespace gl
     27 
     28 namespace rx
     29 {
     30 class EGLImageD3D;
     31 class RenderTargetD3D;
     32 class RenderTarget11;
     33 class Renderer11;
     34 class SwapChain11;
     35 class Image11;
     36 struct Renderer11DeviceCaps;
     37 class TextureStorage11_2DMultisample;
     38 
     39 template <typename T>
     40 using CubeFaceArray = std::array<T, gl::kCubeFaceCount>;
     41 
     42 struct MultisampledRenderToTextureInfo
     43 {
     44    MultisampledRenderToTextureInfo(const GLsizei samples,
     45                                    const gl::ImageIndex &indexSS,
     46                                    const gl::ImageIndex &indexMS);
     47    ~MultisampledRenderToTextureInfo();
     48 
     49    // How many samples the multisampled texture contains
     50    GLsizei samples;
     51    // This is the image index for the single sampled texture
     52    // This will hold the relevant level information
     53    gl::ImageIndex indexSS;
     54    // This is the image index for the multisampled texture
     55    // For multisampled indexes, there is no level Index since they should
     56    // account for the entire level.
     57    gl::ImageIndex indexMS;
     58    // True when multisampled texture has been written to and needs to be
     59    // resolved to the single sampled texture
     60    bool msTextureNeedsResolve;
     61    std::unique_ptr<TextureStorage11_2DMultisample> msTex;
     62 };
     63 
     64 class TextureStorage11 : public TextureStorage
     65 {
     66  public:
     67    ~TextureStorage11() override;
     68 
     69    static DWORD GetTextureBindFlags(GLenum internalFormat,
     70                                     const Renderer11DeviceCaps &renderer11DeviceCaps,
     71                                     BindFlags flags);
     72    static DWORD GetTextureMiscFlags(GLenum internalFormat,
     73                                     const Renderer11DeviceCaps &renderer11DeviceCaps,
     74                                     BindFlags flags,
     75                                     int levels);
     76 
     77    UINT getBindFlags() const;
     78    UINT getMiscFlags() const;
     79    const d3d11::Format &getFormatSet() const;
     80    angle::Result getSRVLevels(const gl::Context *context,
     81                               GLint baseLevel,
     82                               GLint maxLevel,
     83                               const d3d11::SharedSRV **outSRV);
     84    angle::Result generateSwizzles(const gl::Context *context,
     85                                   const gl::TextureState &textureState);
     86    void markLevelDirty(int mipLevel);
     87    void markDirty();
     88 
     89    angle::Result updateSubresourceLevel(const gl::Context *context,
     90                                         const TextureHelper11 &texture,
     91                                         unsigned int sourceSubresource,
     92                                         const gl::ImageIndex &index,
     93                                         const gl::Box &copyArea);
     94 
     95    angle::Result copySubresourceLevel(const gl::Context *context,
     96                                       const TextureHelper11 &dstTexture,
     97                                       unsigned int dstSubresource,
     98                                       const gl::ImageIndex &index,
     99                                       const gl::Box &region);
    100 
    101    // TextureStorage virtual functions
    102    int getTopLevel() const override;
    103    bool isRenderTarget() const override;
    104    bool isManaged() const override;
    105    bool supportsNativeMipmapFunction() const override;
    106    int getLevelCount() const override;
    107    bool isUnorderedAccess() const override { return mBindFlags & D3D11_BIND_UNORDERED_ACCESS; }
    108    angle::Result generateMipmap(const gl::Context *context,
    109                                 const gl::ImageIndex &sourceIndex,
    110                                 const gl::ImageIndex &destIndex) override;
    111    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    112    angle::Result setData(const gl::Context *context,
    113                          const gl::ImageIndex &index,
    114                          ImageD3D *image,
    115                          const gl::Box *destBox,
    116                          GLenum type,
    117                          const gl::PixelUnpackState &unpack,
    118                          const uint8_t *pixelData) override;
    119    void invalidateTextures() override;
    120 
    121    virtual angle::Result getSRVForSampler(const gl::Context *context,
    122                                           const gl::TextureState &textureState,
    123                                           const gl::SamplerState &sampler,
    124                                           const d3d11::SharedSRV **outSRV);
    125    angle::Result getSRVForImage(const gl::Context *context,
    126                                 const gl::ImageUnit &imageUnit,
    127                                 const d3d11::SharedSRV **outSRV);
    128    angle::Result getUAVForImage(const gl::Context *context,
    129                                 const gl::ImageUnit &imageUnit,
    130                                 const d3d11::SharedUAV **outUAV);
    131    virtual angle::Result getSubresourceIndex(const gl::Context *context,
    132                                              const gl::ImageIndex &index,
    133                                              UINT *outSubresourceIndex) const;
    134    virtual angle::Result getResource(const gl::Context *context,
    135                                      const TextureHelper11 **outResource)              = 0;
    136    virtual void associateImage(Image11 *image, const gl::ImageIndex &index)            = 0;
    137    virtual void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) = 0;
    138    virtual void verifyAssociatedImageValid(const gl::ImageIndex &index,
    139                                            Image11 *expectedImage)                     = 0;
    140    virtual angle::Result releaseAssociatedImage(const gl::Context *context,
    141                                                 const gl::ImageIndex &index,
    142                                                 Image11 *incomingImage)                = 0;
    143 
    144    GLsizei getRenderToTextureSamples() const override;
    145 
    146  protected:
    147    TextureStorage11(Renderer11 *renderer,
    148                     UINT bindFlags,
    149                     UINT miscFlags,
    150                     GLenum internalFormat,
    151                     const std::string &label);
    152    int getLevelWidth(int mipLevel) const;
    153    int getLevelHeight(int mipLevel) const;
    154    int getLevelDepth(int mipLevel) const;
    155 
    156    // Some classes (e.g. TextureStorage11_2D) will override getMippedResource.
    157    virtual angle::Result getMippedResource(const gl::Context *context,
    158                                            const TextureHelper11 **outResource);
    159 
    160    virtual angle::Result getSwizzleTexture(const gl::Context *context,
    161                                            const TextureHelper11 **outTexture)          = 0;
    162    virtual angle::Result getSwizzleRenderTarget(const gl::Context *context,
    163                                                 int mipLevel,
    164                                                 const d3d11::RenderTargetView **outRTV) = 0;
    165 
    166    enum class SRVType
    167    {
    168        Sample,
    169        Blit,
    170        Stencil
    171    };
    172    angle::Result getSRVLevel(const gl::Context *context,
    173                              int mipLevel,
    174                              SRVType srvType,
    175                              const d3d11::SharedSRV **outSRV);
    176 
    177    // Get a version of a depth texture with only depth information, not stencil.
    178    enum DropStencil
    179    {
    180        CREATED,
    181        ALREADY_EXISTS
    182    };
    183    virtual angle::Result ensureDropStencilTexture(const gl::Context *context,
    184                                                   DropStencil *dropStencilOut);
    185    angle::Result initDropStencilTexture(const gl::Context *context,
    186                                         const gl::ImageIndexIterator &it);
    187 
    188    // The baseLevel parameter should *not* have mTopLevel applied.
    189    virtual angle::Result createSRVForSampler(const gl::Context *context,
    190                                              int baseLevel,
    191                                              int mipLevels,
    192                                              DXGI_FORMAT format,
    193                                              const TextureHelper11 &texture,
    194                                              d3d11::SharedSRV *outSRV) = 0;
    195    virtual angle::Result createSRVForImage(const gl::Context *context,
    196                                            int level,
    197                                            DXGI_FORMAT format,
    198                                            const TextureHelper11 &texture,
    199                                            d3d11::SharedSRV *outSRV)   = 0;
    200    virtual angle::Result createUAVForImage(const gl::Context *context,
    201                                            int level,
    202                                            DXGI_FORMAT format,
    203                                            const TextureHelper11 &texture,
    204                                            d3d11::SharedUAV *outUAV)   = 0;
    205 
    206    void verifySwizzleExists(const gl::SwizzleState &swizzleState);
    207 
    208    // Clear all cached non-swizzle SRVs and invalidate the swizzle cache.
    209    void clearSRVCache();
    210 
    211    // Helper for resolving MS shadowed texture
    212    angle::Result resolveTextureHelper(const gl::Context *context, const TextureHelper11 &texture);
    213    angle::Result releaseMultisampledTexStorageForLevel(size_t level) override;
    214    angle::Result findMultisampledRenderTarget(const gl::Context *context,
    215                                               const gl::ImageIndex &index,
    216                                               GLsizei samples,
    217                                               RenderTargetD3D **outRT) const;
    218    angle::Result getMultisampledRenderTarget(const gl::Context *context,
    219                                              const gl::ImageIndex &index,
    220                                              GLsizei samples,
    221                                              RenderTargetD3D **outRT);
    222 
    223    Renderer11 *mRenderer;
    224    int mTopLevel;
    225    unsigned int mMipLevels;
    226 
    227    const d3d11::Format &mFormatInfo;
    228    unsigned int mTextureWidth;
    229    unsigned int mTextureHeight;
    230    unsigned int mTextureDepth;
    231 
    232    gl::TexLevelArray<gl::SwizzleState> mSwizzleCache;
    233    TextureHelper11 mDropStencilTexture;
    234 
    235    std::unique_ptr<MultisampledRenderToTextureInfo> mMSTexInfo;
    236 
    237  private:
    238    const UINT mBindFlags;
    239    const UINT mMiscFlags;
    240 
    241    struct SamplerKey
    242    {
    243        SamplerKey();
    244        SamplerKey(int baseLevel, int mipLevels, bool swizzle, bool dropStencil);
    245 
    246        bool operator<(const SamplerKey &rhs) const;
    247 
    248        int baseLevel;
    249        int mipLevels;
    250        bool swizzle;
    251        bool dropStencil;
    252    };
    253 
    254    angle::Result getCachedOrCreateSRVForSampler(const gl::Context *context,
    255                                                 const SamplerKey &key,
    256                                                 const d3d11::SharedSRV **outSRV);
    257 
    258    using SRVCacheForSampler = std::map<SamplerKey, d3d11::SharedSRV>;
    259    SRVCacheForSampler mSrvCacheForSampler;
    260 
    261    struct ImageKey
    262    {
    263        ImageKey();
    264        ImageKey(int level, bool layered, int layer, GLenum access, GLenum format);
    265        bool operator<(const ImageKey &rhs) const;
    266        int level;
    267        bool layered;
    268        int layer;
    269        GLenum access;
    270        GLenum format;
    271    };
    272 
    273    angle::Result getCachedOrCreateSRVForImage(const gl::Context *context,
    274                                               const ImageKey &key,
    275                                               const d3d11::SharedSRV **outSRV);
    276    angle::Result getCachedOrCreateUAVForImage(const gl::Context *context,
    277                                               const ImageKey &key,
    278                                               const d3d11::SharedUAV **outUAV);
    279 
    280    using SRVCacheForImage = std::map<ImageKey, d3d11::SharedSRV>;
    281    SRVCacheForImage mSrvCacheForImage;
    282    using UAVCacheForImage = std::map<ImageKey, d3d11::SharedUAV>;
    283    UAVCacheForImage mUavCacheForImage;
    284 
    285    gl::TexLevelArray<d3d11::SharedSRV> mLevelSRVs;
    286    gl::TexLevelArray<d3d11::SharedSRV> mLevelBlitSRVs;
    287    gl::TexLevelArray<d3d11::SharedSRV> mLevelStencilSRVs;
    288 };
    289 
    290 class TextureStorage11_2D : public TextureStorage11
    291 {
    292  public:
    293    TextureStorage11_2D(Renderer11 *renderer, SwapChain11 *swapchain, const std::string &label);
    294    TextureStorage11_2D(Renderer11 *renderer,
    295                        GLenum internalformat,
    296                        BindFlags bindFlags,
    297                        GLsizei width,
    298                        GLsizei height,
    299                        int levels,
    300                        const std::string &label,
    301                        bool hintLevelZeroOnly = false);
    302    ~TextureStorage11_2D() override;
    303 
    304    angle::Result onDestroy(const gl::Context *context) override;
    305 
    306    angle::Result getResource(const gl::Context *context,
    307                              const TextureHelper11 **outResource) override;
    308    angle::Result getMippedResource(const gl::Context *context,
    309                                    const TextureHelper11 **outResource) override;
    310    angle::Result findRenderTarget(const gl::Context *context,
    311                                   const gl::ImageIndex &index,
    312                                   GLsizei samples,
    313                                   RenderTargetD3D **outRT) const override;
    314    angle::Result getRenderTarget(const gl::Context *context,
    315                                  const gl::ImageIndex &index,
    316                                  GLsizei samples,
    317                                  RenderTargetD3D **outRT) override;
    318 
    319    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    320 
    321    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    322    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    323    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    324    angle::Result releaseAssociatedImage(const gl::Context *context,
    325                                         const gl::ImageIndex &index,
    326                                         Image11 *incomingImage) override;
    327 
    328    angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
    329                                                bool useLevelZeroTexture) override;
    330    void onLabelUpdate() override;
    331 
    332  protected:
    333    angle::Result getSwizzleTexture(const gl::Context *context,
    334                                    const TextureHelper11 **outTexture) override;
    335    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    336                                         int mipLevel,
    337                                         const d3d11::RenderTargetView **outRTV) override;
    338 
    339    angle::Result ensureDropStencilTexture(const gl::Context *context,
    340                                           DropStencil *dropStencilOut) override;
    341 
    342    angle::Result ensureTextureExists(const gl::Context *context, int mipLevels);
    343 
    344    angle::Result resolveTexture(const gl::Context *context) override;
    345 
    346  private:
    347    angle::Result createSRVForSampler(const gl::Context *context,
    348                                      int baseLevel,
    349                                      int mipLevels,
    350                                      DXGI_FORMAT format,
    351                                      const TextureHelper11 &texture,
    352                                      d3d11::SharedSRV *outSRV) override;
    353    angle::Result createSRVForImage(const gl::Context *context,
    354                                    int level,
    355                                    DXGI_FORMAT format,
    356                                    const TextureHelper11 &texture,
    357                                    d3d11::SharedSRV *outSRV) override;
    358    angle::Result createUAVForImage(const gl::Context *context,
    359                                    int level,
    360                                    DXGI_FORMAT format,
    361                                    const TextureHelper11 &texture,
    362                                    d3d11::SharedUAV *outUAV) override;
    363 
    364    TextureHelper11 mTexture;
    365    gl::TexLevelArray<std::unique_ptr<RenderTarget11>> mRenderTarget;
    366    bool mHasKeyedMutex;
    367 
    368    // These are members related to the zero max-LOD workaround.
    369    // D3D11 Feature Level 9_3 can't disable mipmaps on a mipmapped texture (i.e. solely sample from
    370    // level zero). These members are used to work around this limitation. Usually only mTexture XOR
    371    // mLevelZeroTexture will exist. For example, if an app creates a texture with only one level,
    372    // then 9_3 will only create mLevelZeroTexture. However, in some scenarios, both textures have
    373    // to be created. This incurs additional memory overhead. One example of this is an application
    374    // that creates a texture, calls glGenerateMipmap, and then disables mipmaps on the texture. A
    375    // more likely example is an app that creates an empty texture, renders to it, and then calls
    376    // glGenerateMipmap
    377    // TODO: In this rendering scenario, release the mLevelZeroTexture after mTexture has been
    378    // created to save memory.
    379    TextureHelper11 mLevelZeroTexture;
    380    std::unique_ptr<RenderTarget11> mLevelZeroRenderTarget;
    381    bool mUseLevelZeroTexture;
    382 
    383    // Swizzle-related variables
    384    TextureHelper11 mSwizzleTexture;
    385    gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
    386 
    387    gl::TexLevelArray<Image11 *> mAssociatedImages;
    388 };
    389 
    390 class TextureStorage11_External : public TextureStorage11
    391 {
    392  public:
    393    TextureStorage11_External(Renderer11 *renderer,
    394                              egl::Stream *stream,
    395                              const egl::Stream::GLTextureDescription &glDesc,
    396                              const std::string &label);
    397    ~TextureStorage11_External() override;
    398 
    399    angle::Result onDestroy(const gl::Context *context) override;
    400 
    401    angle::Result getResource(const gl::Context *context,
    402                              const TextureHelper11 **outResource) override;
    403    angle::Result getMippedResource(const gl::Context *context,
    404                                    const TextureHelper11 **outResource) override;
    405    angle::Result findRenderTarget(const gl::Context *context,
    406                                   const gl::ImageIndex &index,
    407                                   GLsizei samples,
    408                                   RenderTargetD3D **outRT) const override;
    409    angle::Result getRenderTarget(const gl::Context *context,
    410                                  const gl::ImageIndex &index,
    411                                  GLsizei samples,
    412                                  RenderTargetD3D **outRT) override;
    413 
    414    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    415 
    416    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    417    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    418    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    419    angle::Result releaseAssociatedImage(const gl::Context *context,
    420                                         const gl::ImageIndex &index,
    421                                         Image11 *incomingImage) override;
    422    void onLabelUpdate() override;
    423 
    424  protected:
    425    angle::Result getSwizzleTexture(const gl::Context *context,
    426                                    const TextureHelper11 **outTexture) override;
    427    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    428                                         int mipLevel,
    429                                         const d3d11::RenderTargetView **outRTV) override;
    430 
    431  private:
    432    angle::Result createSRVForSampler(const gl::Context *context,
    433                                      int baseLevel,
    434                                      int mipLevels,
    435                                      DXGI_FORMAT format,
    436                                      const TextureHelper11 &texture,
    437                                      d3d11::SharedSRV *outSRV) override;
    438    angle::Result createSRVForImage(const gl::Context *context,
    439                                    int level,
    440                                    DXGI_FORMAT format,
    441                                    const TextureHelper11 &texture,
    442                                    d3d11::SharedSRV *outSRV) override;
    443    angle::Result createUAVForImage(const gl::Context *context,
    444                                    int level,
    445                                    DXGI_FORMAT format,
    446                                    const TextureHelper11 &texture,
    447                                    d3d11::SharedUAV *outUAV) override;
    448 
    449    TextureHelper11 mTexture;
    450    int mSubresourceIndex;
    451    bool mHasKeyedMutex;
    452 
    453    Image11 *mAssociatedImage;
    454 };
    455 
    456 // A base class for texture storage classes where the associated images are not changed, nor are
    457 // they accessible as images in GLES3.1+ shaders.
    458 class TextureStorage11ImmutableBase : public TextureStorage11
    459 {
    460  public:
    461    TextureStorage11ImmutableBase(Renderer11 *renderer,
    462                                  UINT bindFlags,
    463                                  UINT miscFlags,
    464                                  GLenum internalFormat,
    465                                  const std::string &label);
    466 
    467    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    468    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    469    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    470    angle::Result releaseAssociatedImage(const gl::Context *context,
    471                                         const gl::ImageIndex &index,
    472                                         Image11 *incomingImage) override;
    473 
    474    angle::Result createSRVForImage(const gl::Context *context,
    475                                    int level,
    476                                    DXGI_FORMAT format,
    477                                    const TextureHelper11 &texture,
    478                                    d3d11::SharedSRV *outSRV) override;
    479    angle::Result createUAVForImage(const gl::Context *context,
    480                                    int level,
    481                                    DXGI_FORMAT format,
    482                                    const TextureHelper11 &texture,
    483                                    d3d11::SharedUAV *outUAV) override;
    484 };
    485 
    486 class TextureStorage11_EGLImage final : public TextureStorage11ImmutableBase
    487 {
    488  public:
    489    TextureStorage11_EGLImage(Renderer11 *renderer,
    490                              EGLImageD3D *eglImage,
    491                              RenderTarget11 *renderTarget11,
    492                              const std::string &label);
    493    ~TextureStorage11_EGLImage() override;
    494 
    495    angle::Result getSubresourceIndex(const gl::Context *context,
    496                                      const gl::ImageIndex &index,
    497                                      UINT *outSubresourceIndex) const override;
    498    angle::Result getResource(const gl::Context *context,
    499                              const TextureHelper11 **outResource) override;
    500    angle::Result getSRVForSampler(const gl::Context *context,
    501                                   const gl::TextureState &textureState,
    502                                   const gl::SamplerState &sampler,
    503                                   const d3d11::SharedSRV **outSRV) override;
    504    angle::Result getMippedResource(const gl::Context *context,
    505                                    const TextureHelper11 **outResource) override;
    506    angle::Result findRenderTarget(const gl::Context *context,
    507                                   const gl::ImageIndex &index,
    508                                   GLsizei samples,
    509                                   RenderTargetD3D **outRT) const override;
    510    angle::Result getRenderTarget(const gl::Context *context,
    511                                  const gl::ImageIndex &index,
    512                                  GLsizei samples,
    513                                  RenderTargetD3D **outRT) override;
    514 
    515    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    516 
    517    angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
    518                                                bool useLevelZeroTexture) override;
    519    void onLabelUpdate() override;
    520 
    521  protected:
    522    angle::Result getSwizzleTexture(const gl::Context *context,
    523                                    const TextureHelper11 **outTexture) override;
    524    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    525                                         int mipLevel,
    526                                         const d3d11::RenderTargetView **outRTV) override;
    527 
    528  private:
    529    // Check if the EGL image's render target has been updated due to orphaning and delete
    530    // any SRVs and other resources based on the image's old render target.
    531    angle::Result checkForUpdatedRenderTarget(const gl::Context *context);
    532 
    533    angle::Result createSRVForSampler(const gl::Context *context,
    534                                      int baseLevel,
    535                                      int mipLevels,
    536                                      DXGI_FORMAT format,
    537                                      const TextureHelper11 &texture,
    538                                      d3d11::SharedSRV *outSRV) override;
    539 
    540    angle::Result getImageRenderTarget(const gl::Context *context, RenderTarget11 **outRT) const;
    541 
    542    EGLImageD3D *mImage;
    543    uintptr_t mCurrentRenderTarget;
    544 
    545    // Swizzle-related variables
    546    TextureHelper11 mSwizzleTexture;
    547    std::vector<d3d11::RenderTargetView> mSwizzleRenderTargets;
    548 };
    549 
    550 class TextureStorage11_Cube : public TextureStorage11
    551 {
    552  public:
    553    TextureStorage11_Cube(Renderer11 *renderer,
    554                          GLenum internalformat,
    555                          BindFlags bindFlags,
    556                          int size,
    557                          int levels,
    558                          bool hintLevelZeroOnly,
    559                          const std::string &label);
    560    ~TextureStorage11_Cube() override;
    561 
    562    angle::Result onDestroy(const gl::Context *context) override;
    563 
    564    angle::Result getSubresourceIndex(const gl::Context *context,
    565                                      const gl::ImageIndex &index,
    566                                      UINT *outSubresourceIndex) const override;
    567 
    568    angle::Result getResource(const gl::Context *context,
    569                              const TextureHelper11 **outResource) override;
    570    angle::Result getMippedResource(const gl::Context *context,
    571                                    const TextureHelper11 **outResource) override;
    572    angle::Result findRenderTarget(const gl::Context *context,
    573                                   const gl::ImageIndex &index,
    574                                   GLsizei samples,
    575                                   RenderTargetD3D **outRT) const override;
    576    angle::Result getRenderTarget(const gl::Context *context,
    577                                  const gl::ImageIndex &index,
    578                                  GLsizei samples,
    579                                  RenderTargetD3D **outRT) override;
    580 
    581    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    582 
    583    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    584    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    585    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    586    angle::Result releaseAssociatedImage(const gl::Context *context,
    587                                         const gl::ImageIndex &index,
    588                                         Image11 *incomingImage) override;
    589 
    590    angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
    591                                                bool useLevelZeroTexture) override;
    592    void onLabelUpdate() override;
    593 
    594  protected:
    595    angle::Result getSwizzleTexture(const gl::Context *context,
    596                                    const TextureHelper11 **outTexture) override;
    597    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    598                                         int mipLevel,
    599                                         const d3d11::RenderTargetView **outRTV) override;
    600 
    601    angle::Result ensureDropStencilTexture(const gl::Context *context,
    602                                           DropStencil *dropStencilOut) override;
    603 
    604    angle::Result ensureTextureExists(const gl::Context *context, int mipLevels);
    605 
    606    angle::Result resolveTexture(const gl::Context *context) override;
    607 
    608  private:
    609    angle::Result createSRVForSampler(const gl::Context *context,
    610                                      int baseLevel,
    611                                      int mipLevels,
    612                                      DXGI_FORMAT format,
    613                                      const TextureHelper11 &texture,
    614                                      d3d11::SharedSRV *outSRV) override;
    615    angle::Result createSRVForImage(const gl::Context *context,
    616                                    int level,
    617                                    DXGI_FORMAT format,
    618                                    const TextureHelper11 &texture,
    619                                    d3d11::SharedSRV *outSRV) override;
    620    angle::Result createUAVForImage(const gl::Context *context,
    621                                    int level,
    622                                    DXGI_FORMAT format,
    623                                    const TextureHelper11 &texture,
    624                                    d3d11::SharedUAV *outUAV) override;
    625    angle::Result createRenderTargetSRV(const gl::Context *context,
    626                                        const TextureHelper11 &texture,
    627                                        const gl::ImageIndex &index,
    628                                        DXGI_FORMAT resourceFormat,
    629                                        d3d11::SharedSRV *srv) const;
    630 
    631    TextureHelper11 mTexture;
    632    CubeFaceArray<gl::TexLevelArray<std::unique_ptr<RenderTarget11>>> mRenderTarget;
    633 
    634    // Level-zero workaround members. See TextureStorage11_2D's workaround members for a
    635    // description.
    636    TextureHelper11 mLevelZeroTexture;
    637    CubeFaceArray<std::unique_ptr<RenderTarget11>> mLevelZeroRenderTarget;
    638    bool mUseLevelZeroTexture;
    639 
    640    TextureHelper11 mSwizzleTexture;
    641    gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
    642 
    643    CubeFaceArray<gl::TexLevelArray<Image11 *>> mAssociatedImages;
    644 };
    645 
    646 class TextureStorage11_3D : public TextureStorage11
    647 {
    648  public:
    649    TextureStorage11_3D(Renderer11 *renderer,
    650                        GLenum internalformat,
    651                        BindFlags bindFlags,
    652                        GLsizei width,
    653                        GLsizei height,
    654                        GLsizei depth,
    655                        int levels,
    656                        const std::string &label);
    657    ~TextureStorage11_3D() override;
    658 
    659    angle::Result onDestroy(const gl::Context *context) override;
    660 
    661    angle::Result getResource(const gl::Context *context,
    662                              const TextureHelper11 **outResource) override;
    663 
    664    // Handles both layer and non-layer RTs
    665    angle::Result findRenderTarget(const gl::Context *context,
    666                                   const gl::ImageIndex &index,
    667                                   GLsizei samples,
    668                                   RenderTargetD3D **outRT) const override;
    669    angle::Result getRenderTarget(const gl::Context *context,
    670                                  const gl::ImageIndex &index,
    671                                  GLsizei samples,
    672                                  RenderTargetD3D **outRT) override;
    673 
    674    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    675    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    676    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    677    angle::Result releaseAssociatedImage(const gl::Context *context,
    678                                         const gl::ImageIndex &index,
    679                                         Image11 *incomingImage) override;
    680    void onLabelUpdate() override;
    681 
    682  protected:
    683    angle::Result getSwizzleTexture(const gl::Context *context,
    684                                    const TextureHelper11 **outTexture) override;
    685    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    686                                         int mipLevel,
    687                                         const d3d11::RenderTargetView **outRTV) override;
    688 
    689  private:
    690    angle::Result createSRVForSampler(const gl::Context *context,
    691                                      int baseLevel,
    692                                      int mipLevels,
    693                                      DXGI_FORMAT format,
    694                                      const TextureHelper11 &texture,
    695                                      d3d11::SharedSRV *outSRV) override;
    696    angle::Result createSRVForImage(const gl::Context *context,
    697                                    int level,
    698                                    DXGI_FORMAT format,
    699                                    const TextureHelper11 &texture,
    700                                    d3d11::SharedSRV *outSRV) override;
    701    angle::Result createUAVForImage(const gl::Context *context,
    702                                    int level,
    703                                    DXGI_FORMAT format,
    704                                    const TextureHelper11 &texture,
    705                                    d3d11::SharedUAV *outUAV) override;
    706 
    707    typedef std::pair<int, int> LevelLayerKey;
    708    std::map<LevelLayerKey, std::unique_ptr<RenderTarget11>> mLevelLayerRenderTargets;
    709 
    710    gl::TexLevelArray<std::unique_ptr<RenderTarget11>> mLevelRenderTargets;
    711 
    712    TextureHelper11 mTexture;
    713    TextureHelper11 mSwizzleTexture;
    714    gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
    715 
    716    gl::TexLevelArray<Image11 *> mAssociatedImages;
    717 };
    718 
    719 class TextureStorage11_2DArray : public TextureStorage11
    720 {
    721  public:
    722    TextureStorage11_2DArray(Renderer11 *renderer,
    723                             GLenum internalformat,
    724                             BindFlags bindFlags,
    725                             GLsizei width,
    726                             GLsizei height,
    727                             GLsizei depth,
    728                             int levels,
    729                             const std::string &label);
    730    ~TextureStorage11_2DArray() override;
    731 
    732    angle::Result onDestroy(const gl::Context *context) override;
    733 
    734    angle::Result getResource(const gl::Context *context,
    735                              const TextureHelper11 **outResource) override;
    736    angle::Result findRenderTarget(const gl::Context *context,
    737                                   const gl::ImageIndex &index,
    738                                   GLsizei samples,
    739                                   RenderTargetD3D **outRT) const override;
    740    angle::Result getRenderTarget(const gl::Context *context,
    741                                  const gl::ImageIndex &index,
    742                                  GLsizei samples,
    743                                  RenderTargetD3D **outRT) override;
    744 
    745    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    746    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    747    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    748    angle::Result releaseAssociatedImage(const gl::Context *context,
    749                                         const gl::ImageIndex &index,
    750                                         Image11 *incomingImage) override;
    751    void onLabelUpdate() override;
    752 
    753    struct LevelLayerRangeKey
    754    {
    755        LevelLayerRangeKey(int mipLevelIn, int layerIn, int numLayersIn)
    756            : mipLevel(mipLevelIn), layer(layerIn), numLayers(numLayersIn)
    757        {}
    758        bool operator<(const LevelLayerRangeKey &other) const
    759        {
    760            if (mipLevel != other.mipLevel)
    761            {
    762                return mipLevel < other.mipLevel;
    763            }
    764            if (layer != other.layer)
    765            {
    766                return layer < other.layer;
    767            }
    768            return numLayers < other.numLayers;
    769        }
    770        int mipLevel;
    771        int layer;
    772        int numLayers;
    773    };
    774 
    775  protected:
    776    angle::Result getSwizzleTexture(const gl::Context *context,
    777                                    const TextureHelper11 **outTexture) override;
    778    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    779                                         int mipLevel,
    780                                         const d3d11::RenderTargetView **outRTV) override;
    781 
    782    angle::Result ensureDropStencilTexture(const gl::Context *context,
    783                                           DropStencil *dropStencilOut) override;
    784 
    785  private:
    786    angle::Result createSRVForSampler(const gl::Context *context,
    787                                      int baseLevel,
    788                                      int mipLevels,
    789                                      DXGI_FORMAT format,
    790                                      const TextureHelper11 &texture,
    791                                      d3d11::SharedSRV *outSRV) override;
    792    angle::Result createSRVForImage(const gl::Context *context,
    793                                    int level,
    794                                    DXGI_FORMAT format,
    795                                    const TextureHelper11 &texture,
    796                                    d3d11::SharedSRV *outSRV) override;
    797    angle::Result createUAVForImage(const gl::Context *context,
    798                                    int level,
    799                                    DXGI_FORMAT format,
    800                                    const TextureHelper11 &texture,
    801                                    d3d11::SharedUAV *outUAV) override;
    802    angle::Result createRenderTargetSRV(const gl::Context *context,
    803                                        const TextureHelper11 &texture,
    804                                        const gl::ImageIndex &index,
    805                                        DXGI_FORMAT resourceFormat,
    806                                        d3d11::SharedSRV *srv) const;
    807 
    808    std::map<LevelLayerRangeKey, std::unique_ptr<RenderTarget11>> mRenderTargets;
    809 
    810    TextureHelper11 mTexture;
    811 
    812    TextureHelper11 mSwizzleTexture;
    813    gl::TexLevelArray<d3d11::RenderTargetView> mSwizzleRenderTargets;
    814 
    815    typedef std::map<LevelLayerRangeKey, Image11 *> ImageMap;
    816    ImageMap mAssociatedImages;
    817 };
    818 
    819 class TextureStorage11_2DMultisample final : public TextureStorage11ImmutableBase
    820 {
    821  public:
    822    TextureStorage11_2DMultisample(Renderer11 *renderer,
    823                                   GLenum internalformat,
    824                                   GLsizei width,
    825                                   GLsizei height,
    826                                   int levels,
    827                                   int samples,
    828                                   bool fixedSampleLocations,
    829                                   const std::string &label);
    830    ~TextureStorage11_2DMultisample() override;
    831 
    832    angle::Result onDestroy(const gl::Context *context) override;
    833 
    834    angle::Result getResource(const gl::Context *context,
    835                              const TextureHelper11 **outResource) override;
    836    angle::Result findRenderTarget(const gl::Context *context,
    837                                   const gl::ImageIndex &index,
    838                                   GLsizei samples,
    839                                   RenderTargetD3D **outRT) const override;
    840    angle::Result getRenderTarget(const gl::Context *context,
    841                                  const gl::ImageIndex &index,
    842                                  GLsizei samples,
    843                                  RenderTargetD3D **outRT) override;
    844 
    845    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    846    void onLabelUpdate() override;
    847 
    848  protected:
    849    angle::Result getSwizzleTexture(const gl::Context *context,
    850                                    const TextureHelper11 **outTexture) override;
    851    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    852                                         int mipLevel,
    853                                         const d3d11::RenderTargetView **outRTV) override;
    854 
    855    angle::Result ensureDropStencilTexture(const gl::Context *context,
    856                                           DropStencil *dropStencilOut) override;
    857 
    858    angle::Result ensureTextureExists(const gl::Context *context, int mipLevels);
    859 
    860  private:
    861    angle::Result createSRVForSampler(const gl::Context *context,
    862                                      int baseLevel,
    863                                      int mipLevels,
    864                                      DXGI_FORMAT format,
    865                                      const TextureHelper11 &texture,
    866                                      d3d11::SharedSRV *outSRV) override;
    867 
    868    TextureHelper11 mTexture;
    869    std::unique_ptr<RenderTarget11> mRenderTarget;
    870 
    871    unsigned int mSamples;
    872    GLboolean mFixedSampleLocations;
    873 };
    874 
    875 class TextureStorage11_2DMultisampleArray final : public TextureStorage11ImmutableBase
    876 {
    877  public:
    878    TextureStorage11_2DMultisampleArray(Renderer11 *renderer,
    879                                        GLenum internalformat,
    880                                        GLsizei width,
    881                                        GLsizei height,
    882                                        GLsizei depth,
    883                                        int levels,
    884                                        int samples,
    885                                        bool fixedSampleLocations,
    886                                        const std::string &label);
    887    ~TextureStorage11_2DMultisampleArray() override;
    888 
    889    angle::Result onDestroy(const gl::Context *context) override;
    890 
    891    angle::Result getResource(const gl::Context *context,
    892                              const TextureHelper11 **outResource) override;
    893    angle::Result findRenderTarget(const gl::Context *context,
    894                                   const gl::ImageIndex &index,
    895                                   GLsizei samples,
    896                                   RenderTargetD3D **outRT) const override;
    897    angle::Result getRenderTarget(const gl::Context *context,
    898                                  const gl::ImageIndex &index,
    899                                  GLsizei samples,
    900                                  RenderTargetD3D **outRT) override;
    901 
    902    angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
    903    void onLabelUpdate() override;
    904 
    905  protected:
    906    angle::Result getSwizzleTexture(const gl::Context *context,
    907                                    const TextureHelper11 **outTexture) override;
    908    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    909                                         int mipLevel,
    910                                         const d3d11::RenderTargetView **outRTV) override;
    911 
    912    angle::Result ensureDropStencilTexture(const gl::Context *context,
    913                                           DropStencil *dropStencilOut) override;
    914 
    915    angle::Result ensureTextureExists(const gl::Context *context, int mipLevels);
    916 
    917  private:
    918    angle::Result createRenderTargetSRV(const gl::Context *context,
    919                                        const TextureHelper11 &texture,
    920                                        const gl::ImageIndex &index,
    921                                        DXGI_FORMAT resourceFormat,
    922                                        d3d11::SharedSRV *srv) const;
    923 
    924    angle::Result createSRVForSampler(const gl::Context *context,
    925                                      int baseLevel,
    926                                      int mipLevels,
    927                                      DXGI_FORMAT format,
    928                                      const TextureHelper11 &texture,
    929                                      d3d11::SharedSRV *outSRV) override;
    930 
    931    TextureHelper11 mTexture;
    932    std::map<TextureStorage11_2DArray::LevelLayerRangeKey, std::unique_ptr<RenderTarget11>>
    933        mRenderTargets;
    934 
    935    unsigned int mSamples;
    936    GLboolean mFixedSampleLocations;
    937 };
    938 
    939 class TextureStorage11_Buffer : public TextureStorage11
    940 {
    941  public:
    942    TextureStorage11_Buffer(Renderer11 *renderer,
    943                            const gl::OffsetBindingPointer<gl::Buffer> &buffer,
    944                            GLenum internalFormat,
    945                            const std::string &label);
    946    ~TextureStorage11_Buffer() override;
    947 
    948    angle::Result getResource(const gl::Context *context,
    949                              const TextureHelper11 **outResource) override;
    950    angle::Result getMippedResource(const gl::Context *context,
    951                                    const TextureHelper11 **outResource) override;
    952    angle::Result findRenderTarget(const gl::Context *context,
    953                                   const gl::ImageIndex &index,
    954                                   GLsizei samples,
    955                                   RenderTargetD3D **outRT) const override;
    956    angle::Result getRenderTarget(const gl::Context *context,
    957                                  const gl::ImageIndex &index,
    958                                  GLsizei samples,
    959                                  RenderTargetD3D **outRT) override;
    960 
    961    void onLabelUpdate() override;
    962 
    963    void associateImage(Image11 *image, const gl::ImageIndex &index) override;
    964    void disassociateImage(const gl::ImageIndex &index, Image11 *expectedImage) override;
    965    void verifyAssociatedImageValid(const gl::ImageIndex &index, Image11 *expectedImage) override;
    966    angle::Result releaseAssociatedImage(const gl::Context *context,
    967                                         const gl::ImageIndex &index,
    968                                         Image11 *incomingImage) override;
    969 
    970  protected:
    971    angle::Result getSwizzleTexture(const gl::Context *context,
    972                                    const TextureHelper11 **outTexture) override;
    973    angle::Result getSwizzleRenderTarget(const gl::Context *context,
    974                                         int mipLevel,
    975                                         const d3d11::RenderTargetView **outRTV) override;
    976 
    977  private:
    978    angle::Result createSRVForSampler(const gl::Context *context,
    979                                      int baseLevel,
    980                                      int mipLevels,
    981                                      DXGI_FORMAT format,
    982                                      const TextureHelper11 &texture,
    983                                      d3d11::SharedSRV *outSRV) override;
    984    angle::Result createSRVForImage(const gl::Context *context,
    985                                    int level,
    986                                    DXGI_FORMAT format,
    987                                    const TextureHelper11 &texture,
    988                                    d3d11::SharedSRV *outSRV) override;
    989    angle::Result createUAVForImage(const gl::Context *context,
    990                                    int level,
    991                                    DXGI_FORMAT format,
    992                                    const TextureHelper11 &texture,
    993                                    d3d11::SharedUAV *outUAV) override;
    994 
    995    angle::Result initTexture(const gl::Context *context);
    996 
    997    TextureHelper11 mTexture;
    998    const gl::OffsetBindingPointer<gl::Buffer> &mBuffer;
    999    GLint64 mDataSize;
   1000 };
   1001 }  // namespace rx
   1002 
   1003 #endif  // LIBANGLE_RENDERER_D3D_D3D11_TEXTURESTORAGE11_H_