xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/d3d9/TextureStorage9.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 // TextureStorage9.h: Defines the abstract rx::TextureStorage9 class and its concrete derived
8 // classes TextureStorage9_2D and TextureStorage9_Cube, which act as the interface to the
9 // D3D9 texture.
10 
11 #ifndef LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_
12 #define LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_
13 
14 #include "common/debug.h"
15 #include "libANGLE/renderer/d3d/TextureStorage.h"
16 
17 namespace rx
18 {
19 class EGLImageD3D;
20 class Renderer9;
21 class SwapChain9;
22 class RenderTargetD3D;
23 class RenderTarget9;
24 
25 class TextureStorage9 : public TextureStorage
26 {
27   public:
28     ~TextureStorage9() override;
29 
30     static DWORD GetTextureUsage(GLenum internalformat, bool renderTarget);
31 
32     D3DPOOL getPool() const;
33     DWORD getUsage() const;
34 
35     virtual angle::Result getSurfaceLevel(const gl::Context *context,
36                                           gl::TextureTarget target,
37                                           int level,
38                                           bool dirty,
39                                           IDirect3DSurface9 **outSurface)    = 0;
40     virtual angle::Result getBaseTexture(const gl::Context *context,
41                                          IDirect3DBaseTexture9 **outTexture) = 0;
42 
43     int getTopLevel() const override;
44     bool isRenderTarget() const override;
isUnorderedAccess()45     bool isUnorderedAccess() const override { return false; }
46     bool isManaged() const override;
47     bool supportsNativeMipmapFunction() const override;
48     int getLevelCount() const override;
49     bool isMultiplanar(const gl::Context *context) override;
50 
51     angle::Result setData(const gl::Context *context,
52                           const gl::ImageIndex &index,
53                           ImageD3D *image,
54                           const gl::Box *destBox,
55                           GLenum type,
56                           const gl::PixelUnpackState &unpack,
57                           const uint8_t *pixelData) override;
58 
59   protected:
60     int mTopLevel;
61     size_t mMipLevels;
62     size_t mTextureWidth;
63     size_t mTextureHeight;
64     GLenum mInternalFormat;
65     D3DFORMAT mTextureFormat;
66 
67     Renderer9 *mRenderer;
68 
69     TextureStorage9(Renderer9 *renderer, DWORD usage, const std::string &label);
70 
71   private:
72     const DWORD mD3DUsage;
73     const D3DPOOL mD3DPool;
74 };
75 
76 class TextureStorage9_2D : public TextureStorage9
77 {
78   public:
79     TextureStorage9_2D(Renderer9 *renderer, SwapChain9 *swapchain, const std::string &label);
80     TextureStorage9_2D(Renderer9 *renderer,
81                        GLenum internalformat,
82                        bool renderTarget,
83                        GLsizei width,
84                        GLsizei height,
85                        int levels,
86                        const std::string &label);
87     ~TextureStorage9_2D() override;
88 
89     angle::Result getSurfaceLevel(const gl::Context *context,
90                                   gl::TextureTarget target,
91                                   int level,
92                                   bool dirty,
93                                   IDirect3DSurface9 **outSurface) override;
94     angle::Result findRenderTarget(const gl::Context *context,
95                                    const gl::ImageIndex &index,
96                                    GLsizei samples,
97                                    RenderTargetD3D **outRT) const override;
98     angle::Result getRenderTarget(const gl::Context *context,
99                                   const gl::ImageIndex &index,
100                                   GLsizei samples,
101                                   RenderTargetD3D **outRT) override;
102     angle::Result getBaseTexture(const gl::Context *context,
103                                  IDirect3DBaseTexture9 **outTexture) override;
104     angle::Result generateMipmap(const gl::Context *context,
105                                  const gl::ImageIndex &sourceIndex,
106                                  const gl::ImageIndex &destIndex) override;
107     angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
108 
109   private:
110     IDirect3DTexture9 *mTexture;
111     std::vector<RenderTarget9 *> mRenderTargets;
112 };
113 
114 class TextureStorage9_EGLImage final : public TextureStorage9
115 {
116   public:
117     TextureStorage9_EGLImage(Renderer9 *renderer,
118                              EGLImageD3D *image,
119                              RenderTarget9 *renderTarget9,
120                              const std::string &label);
121     ~TextureStorage9_EGLImage() override;
122 
123     angle::Result getSurfaceLevel(const gl::Context *context,
124                                   gl::TextureTarget target,
125                                   int level,
126                                   bool dirty,
127                                   IDirect3DSurface9 **outSurface) override;
128     angle::Result findRenderTarget(const gl::Context *context,
129                                    const gl::ImageIndex &index,
130                                    GLsizei samples,
131                                    RenderTargetD3D **outRT) const override;
132     angle::Result getRenderTarget(const gl::Context *context,
133                                   const gl::ImageIndex &index,
134                                   GLsizei samples,
135                                   RenderTargetD3D **outRT) override;
136     angle::Result getBaseTexture(const gl::Context *context,
137                                  IDirect3DBaseTexture9 **outTexture) override;
138     angle::Result generateMipmap(const gl::Context *context,
139                                  const gl::ImageIndex &sourceIndex,
140                                  const gl::ImageIndex &destIndex) override;
141     angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
142 
143   private:
144     EGLImageD3D *mImage;
145 };
146 
147 class TextureStorage9_Cube : public TextureStorage9
148 {
149   public:
150     TextureStorage9_Cube(Renderer9 *renderer,
151                          GLenum internalformat,
152                          bool renderTarget,
153                          int size,
154                          int levels,
155                          bool hintLevelZeroOnly,
156                          const std::string &label);
157 
158     ~TextureStorage9_Cube() override;
159 
160     angle::Result getSurfaceLevel(const gl::Context *context,
161                                   gl::TextureTarget target,
162                                   int level,
163                                   bool dirty,
164                                   IDirect3DSurface9 **outSurface) override;
165     angle::Result findRenderTarget(const gl::Context *context,
166                                    const gl::ImageIndex &index,
167                                    GLsizei samples,
168                                    RenderTargetD3D **outRT) const override;
169     angle::Result getRenderTarget(const gl::Context *context,
170                                   const gl::ImageIndex &index,
171                                   GLsizei samples,
172                                   RenderTargetD3D **outRT) override;
173     angle::Result getBaseTexture(const gl::Context *context,
174                                  IDirect3DBaseTexture9 **outTexture) override;
175     angle::Result generateMipmap(const gl::Context *context,
176                                  const gl::ImageIndex &sourceIndex,
177                                  const gl::ImageIndex &destIndex) override;
178     angle::Result copyToStorage(const gl::Context *context, TextureStorage *destStorage) override;
179 
180   private:
181     IDirect3DCubeTexture9 *mTexture;
182     RenderTarget9 *mRenderTarget[gl::kCubeFaceCount];
183 };
184 
185 }  // namespace rx
186 
187 #endif  // LIBANGLE_RENDERER_D3D_D3D9_TEXTURESTORAGE9_H_
188