TextureStorage.h (4500B)
1 // 2 // Copyright 2002 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 // TextureStorage.h: Defines the abstract rx::TextureStorage class. 8 9 #ifndef LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_ 10 #define LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_ 11 12 #include "common/debug.h" 13 #include "libANGLE/angletypes.h" 14 15 #include <GLES2/gl2.h> 16 #include <stdint.h> 17 18 namespace gl 19 { 20 class Context; 21 class ImageIndex; 22 struct Box; 23 struct PixelUnpackState; 24 } // namespace gl 25 26 namespace angle 27 { 28 class Subject; 29 } // namespace angle 30 31 namespace rx 32 { 33 class SwapChainD3D; 34 class RenderTargetD3D; 35 class ImageD3D; 36 37 // Dirty bit messages from TextureStorage 38 constexpr size_t kTextureStorageObserverMessageIndex = 0; 39 40 class TextureStorage : public angle::Subject 41 { 42 public: 43 TextureStorage(const std::string &label) : mKHRDebugLabel(label) {} 44 ~TextureStorage() override {} 45 46 virtual angle::Result onDestroy(const gl::Context *context); 47 48 virtual int getTopLevel() const = 0; 49 virtual bool isRenderTarget() const = 0; 50 virtual bool isUnorderedAccess() const = 0; 51 virtual bool isManaged() const = 0; 52 virtual bool supportsNativeMipmapFunction() const = 0; 53 virtual int getLevelCount() const = 0; 54 55 virtual angle::Result findRenderTarget(const gl::Context *context, 56 const gl::ImageIndex &index, 57 GLsizei samples, 58 RenderTargetD3D **outRT) const = 0; 59 virtual angle::Result getRenderTarget(const gl::Context *context, 60 const gl::ImageIndex &index, 61 GLsizei samples, 62 RenderTargetD3D **outRT) = 0; 63 virtual angle::Result generateMipmap(const gl::Context *context, 64 const gl::ImageIndex &sourceIndex, 65 const gl::ImageIndex &destIndex) = 0; 66 67 virtual angle::Result copyToStorage(const gl::Context *context, 68 TextureStorage *destStorage) = 0; 69 virtual angle::Result setData(const gl::Context *context, 70 const gl::ImageIndex &index, 71 ImageD3D *image, 72 const gl::Box *destBox, 73 GLenum type, 74 const gl::PixelUnpackState &unpack, 75 const uint8_t *pixelData) = 0; 76 77 // This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D) 78 // might override it. 79 virtual angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context, 80 bool useLevelZeroTexture); 81 82 virtual void invalidateTextures() {} 83 84 // RenderToTexture methods 85 virtual angle::Result releaseMultisampledTexStorageForLevel(size_t level); 86 virtual angle::Result resolveTexture(const gl::Context *context); 87 virtual GLsizei getRenderToTextureSamples() const; 88 89 // Called by outer object when label has changed via KHR_debug extension 90 void setLabel(const std::string &newLabel); 91 92 protected: 93 virtual void onLabelUpdate() {} 94 95 const angle::Subject *mSubject; 96 std::string mKHRDebugLabel; 97 }; 98 99 inline angle::Result TextureStorage::onDestroy(const gl::Context *context) 100 { 101 return angle::Result::Continue; 102 } 103 104 inline angle::Result TextureStorage::useLevelZeroWorkaroundTexture(const gl::Context *context, 105 bool useLevelZeroTexture) 106 { 107 return angle::Result::Continue; 108 } 109 110 inline angle::Result TextureStorage::releaseMultisampledTexStorageForLevel(size_t level) 111 { 112 return angle::Result::Continue; 113 } 114 115 inline angle::Result TextureStorage::resolveTexture(const gl::Context *context) 116 { 117 return angle::Result::Continue; 118 } 119 120 inline GLsizei TextureStorage::getRenderToTextureSamples() const 121 { 122 return 0; 123 } 124 125 inline void TextureStorage::setLabel(const std::string &newLabel) 126 { 127 mKHRDebugLabel = newLabel; 128 onLabelUpdate(); 129 } 130 131 using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>; 132 133 } // namespace rx 134 135 #endif // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_