xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/TextureStorage.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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:
TextureStorage(const std::string & label)43     TextureStorage(const std::string &label) : mKHRDebugLabel(label) {}
~TextureStorage()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 bool isMultiplanar(const gl::Context *context) = 0;
56 
57     virtual angle::Result findRenderTarget(const gl::Context *context,
58                                            const gl::ImageIndex &index,
59                                            GLsizei samples,
60                                            RenderTargetD3D **outRT) const = 0;
61     virtual angle::Result getRenderTarget(const gl::Context *context,
62                                           const gl::ImageIndex &index,
63                                           GLsizei samples,
64                                           RenderTargetD3D **outRT)        = 0;
65     virtual angle::Result generateMipmap(const gl::Context *context,
66                                          const gl::ImageIndex &sourceIndex,
67                                          const gl::ImageIndex &destIndex) = 0;
68 
69     virtual angle::Result copyToStorage(const gl::Context *context,
70                                         TextureStorage *destStorage) = 0;
71     virtual angle::Result setData(const gl::Context *context,
72                                   const gl::ImageIndex &index,
73                                   ImageD3D *image,
74                                   const gl::Box *destBox,
75                                   GLenum type,
76                                   const gl::PixelUnpackState &unpack,
77                                   const uint8_t *pixelData)          = 0;
78 
79     // This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D)
80     // might override it.
81     virtual angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
82                                                         bool useLevelZeroTexture);
83 
invalidateTextures()84     virtual void invalidateTextures() {}
85 
86     // RenderToTexture methods
87     virtual angle::Result releaseMultisampledTexStorageForLevel(size_t level);
88     virtual angle::Result resolveTexture(const gl::Context *context);
89     virtual GLsizei getRenderToTextureSamples() const;
90 
91     // Called by outer object when label has changed via KHR_debug extension
92     void setLabel(const std::string &newLabel);
93 
94   protected:
onLabelUpdate()95     virtual void onLabelUpdate() {}
96 
97     const angle::Subject *mSubject;
98     std::string mKHRDebugLabel;
99 };
100 
onDestroy(const gl::Context * context)101 inline angle::Result TextureStorage::onDestroy(const gl::Context *context)
102 {
103     return angle::Result::Continue;
104 }
105 
useLevelZeroWorkaroundTexture(const gl::Context * context,bool useLevelZeroTexture)106 inline angle::Result TextureStorage::useLevelZeroWorkaroundTexture(const gl::Context *context,
107                                                                    bool useLevelZeroTexture)
108 {
109     return angle::Result::Continue;
110 }
111 
releaseMultisampledTexStorageForLevel(size_t level)112 inline angle::Result TextureStorage::releaseMultisampledTexStorageForLevel(size_t level)
113 {
114     return angle::Result::Continue;
115 }
116 
resolveTexture(const gl::Context * context)117 inline angle::Result TextureStorage::resolveTexture(const gl::Context *context)
118 {
119     return angle::Result::Continue;
120 }
121 
getRenderToTextureSamples()122 inline GLsizei TextureStorage::getRenderToTextureSamples() const
123 {
124     return 0;
125 }
126 
setLabel(const std::string & newLabel)127 inline void TextureStorage::setLabel(const std::string &newLabel)
128 {
129     mKHRDebugLabel = newLabel;
130     onLabelUpdate();
131 }
132 
133 using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>;
134 
135 }  // namespace rx
136 
137 #endif  // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
138