xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/wgpu/TextureWgpu.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2024 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // TextureWgpu.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for TextureWgpu, implementing TextureImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_WGPU_TEXTUREWGPU_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_WGPU_TEXTUREWGPU_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/TextureImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/ContextWgpu.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/RenderTargetWgpu.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/wgpu/wgpu_helpers.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker class TextureWgpu : public TextureImpl
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker   public:
23*8975f5c5SAndroid Build Coastguard Worker     TextureWgpu(const gl::TextureState &state);
24*8975f5c5SAndroid Build Coastguard Worker     ~TextureWgpu() override;
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker     angle::Result setImage(const gl::Context *context,
27*8975f5c5SAndroid Build Coastguard Worker                            const gl::ImageIndex &index,
28*8975f5c5SAndroid Build Coastguard Worker                            GLenum internalFormat,
29*8975f5c5SAndroid Build Coastguard Worker                            const gl::Extents &size,
30*8975f5c5SAndroid Build Coastguard Worker                            GLenum format,
31*8975f5c5SAndroid Build Coastguard Worker                            GLenum type,
32*8975f5c5SAndroid Build Coastguard Worker                            const gl::PixelUnpackState &unpack,
33*8975f5c5SAndroid Build Coastguard Worker                            gl::Buffer *unpackBuffer,
34*8975f5c5SAndroid Build Coastguard Worker                            const uint8_t *pixels) override;
35*8975f5c5SAndroid Build Coastguard Worker     angle::Result setSubImage(const gl::Context *context,
36*8975f5c5SAndroid Build Coastguard Worker                               const gl::ImageIndex &index,
37*8975f5c5SAndroid Build Coastguard Worker                               const gl::Box &area,
38*8975f5c5SAndroid Build Coastguard Worker                               GLenum format,
39*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
40*8975f5c5SAndroid Build Coastguard Worker                               const gl::PixelUnpackState &unpack,
41*8975f5c5SAndroid Build Coastguard Worker                               gl::Buffer *unpackBuffer,
42*8975f5c5SAndroid Build Coastguard Worker                               const uint8_t *pixels) override;
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     angle::Result setCompressedImage(const gl::Context *context,
45*8975f5c5SAndroid Build Coastguard Worker                                      const gl::ImageIndex &index,
46*8975f5c5SAndroid Build Coastguard Worker                                      GLenum internalFormat,
47*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Extents &size,
48*8975f5c5SAndroid Build Coastguard Worker                                      const gl::PixelUnpackState &unpack,
49*8975f5c5SAndroid Build Coastguard Worker                                      size_t imageSize,
50*8975f5c5SAndroid Build Coastguard Worker                                      const uint8_t *pixels) override;
51*8975f5c5SAndroid Build Coastguard Worker     angle::Result setCompressedSubImage(const gl::Context *context,
52*8975f5c5SAndroid Build Coastguard Worker                                         const gl::ImageIndex &index,
53*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Box &area,
54*8975f5c5SAndroid Build Coastguard Worker                                         GLenum format,
55*8975f5c5SAndroid Build Coastguard Worker                                         const gl::PixelUnpackState &unpack,
56*8975f5c5SAndroid Build Coastguard Worker                                         size_t imageSize,
57*8975f5c5SAndroid Build Coastguard Worker                                         const uint8_t *pixels) override;
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyImage(const gl::Context *context,
60*8975f5c5SAndroid Build Coastguard Worker                             const gl::ImageIndex &index,
61*8975f5c5SAndroid Build Coastguard Worker                             const gl::Rectangle &sourceArea,
62*8975f5c5SAndroid Build Coastguard Worker                             GLenum internalFormat,
63*8975f5c5SAndroid Build Coastguard Worker                             gl::Framebuffer *source) override;
64*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubImage(const gl::Context *context,
65*8975f5c5SAndroid Build Coastguard Worker                                const gl::ImageIndex &index,
66*8975f5c5SAndroid Build Coastguard Worker                                const gl::Offset &destOffset,
67*8975f5c5SAndroid Build Coastguard Worker                                const gl::Rectangle &sourceArea,
68*8975f5c5SAndroid Build Coastguard Worker                                gl::Framebuffer *source) override;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyTexture(const gl::Context *context,
71*8975f5c5SAndroid Build Coastguard Worker                               const gl::ImageIndex &index,
72*8975f5c5SAndroid Build Coastguard Worker                               GLenum internalFormat,
73*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
74*8975f5c5SAndroid Build Coastguard Worker                               GLint sourceLevel,
75*8975f5c5SAndroid Build Coastguard Worker                               bool unpackFlipY,
76*8975f5c5SAndroid Build Coastguard Worker                               bool unpackPremultiplyAlpha,
77*8975f5c5SAndroid Build Coastguard Worker                               bool unpackUnmultiplyAlpha,
78*8975f5c5SAndroid Build Coastguard Worker                               const gl::Texture *source) override;
79*8975f5c5SAndroid Build Coastguard Worker     angle::Result copySubTexture(const gl::Context *context,
80*8975f5c5SAndroid Build Coastguard Worker                                  const gl::ImageIndex &index,
81*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Offset &destOffset,
82*8975f5c5SAndroid Build Coastguard Worker                                  GLint sourceLevel,
83*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Box &sourceBox,
84*8975f5c5SAndroid Build Coastguard Worker                                  bool unpackFlipY,
85*8975f5c5SAndroid Build Coastguard Worker                                  bool unpackPremultiplyAlpha,
86*8975f5c5SAndroid Build Coastguard Worker                                  bool unpackUnmultiplyAlpha,
87*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Texture *source) override;
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyRenderbufferSubData(const gl::Context *context,
90*8975f5c5SAndroid Build Coastguard Worker                                           const gl::Renderbuffer *srcBuffer,
91*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcLevel,
92*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcX,
93*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcY,
94*8975f5c5SAndroid Build Coastguard Worker                                           GLint srcZ,
95*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstLevel,
96*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstX,
97*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstY,
98*8975f5c5SAndroid Build Coastguard Worker                                           GLint dstZ,
99*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcWidth,
100*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcHeight,
101*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei srcDepth) override;
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyTextureSubData(const gl::Context *context,
104*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Texture *srcTexture,
105*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcLevel,
106*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcX,
107*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcY,
108*8975f5c5SAndroid Build Coastguard Worker                                      GLint srcZ,
109*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstLevel,
110*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstX,
111*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstY,
112*8975f5c5SAndroid Build Coastguard Worker                                      GLint dstZ,
113*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcWidth,
114*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcHeight,
115*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei srcDepth) override;
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker     angle::Result copyCompressedTexture(const gl::Context *context,
118*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Texture *source) override;
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorage(const gl::Context *context,
121*8975f5c5SAndroid Build Coastguard Worker                              gl::TextureType type,
122*8975f5c5SAndroid Build Coastguard Worker                              size_t levels,
123*8975f5c5SAndroid Build Coastguard Worker                              GLenum internalFormat,
124*8975f5c5SAndroid Build Coastguard Worker                              const gl::Extents &size) override;
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageExternalMemory(const gl::Context *context,
127*8975f5c5SAndroid Build Coastguard Worker                                            gl::TextureType type,
128*8975f5c5SAndroid Build Coastguard Worker                                            size_t levels,
129*8975f5c5SAndroid Build Coastguard Worker                                            GLenum internalFormat,
130*8975f5c5SAndroid Build Coastguard Worker                                            const gl::Extents &size,
131*8975f5c5SAndroid Build Coastguard Worker                                            gl::MemoryObject *memoryObject,
132*8975f5c5SAndroid Build Coastguard Worker                                            GLuint64 offset,
133*8975f5c5SAndroid Build Coastguard Worker                                            GLbitfield createFlags,
134*8975f5c5SAndroid Build Coastguard Worker                                            GLbitfield usageFlags,
135*8975f5c5SAndroid Build Coastguard Worker                                            const void *imageCreateInfoPNext) override;
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker     angle::Result setEGLImageTarget(const gl::Context *context,
138*8975f5c5SAndroid Build Coastguard Worker                                     gl::TextureType type,
139*8975f5c5SAndroid Build Coastguard Worker                                     egl::Image *image) override;
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker     angle::Result setImageExternal(const gl::Context *context,
142*8975f5c5SAndroid Build Coastguard Worker                                    gl::TextureType type,
143*8975f5c5SAndroid Build Coastguard Worker                                    egl::Stream *stream,
144*8975f5c5SAndroid Build Coastguard Worker                                    const egl::Stream::GLTextureDescription &desc) override;
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateMipmap(const gl::Context *context) override;
147*8975f5c5SAndroid Build Coastguard Worker 
148*8975f5c5SAndroid Build Coastguard Worker     angle::Result setBaseLevel(const gl::Context *context, GLuint baseLevel) override;
149*8975f5c5SAndroid Build Coastguard Worker 
150*8975f5c5SAndroid Build Coastguard Worker     angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) override;
151*8975f5c5SAndroid Build Coastguard Worker     angle::Result releaseTexImage(const gl::Context *context) override;
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const gl::Context *context,
154*8975f5c5SAndroid Build Coastguard Worker                             const gl::Texture::DirtyBits &dirtyBits,
155*8975f5c5SAndroid Build Coastguard Worker                             gl::Command source) override;
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     angle::Result setStorageMultisample(const gl::Context *context,
158*8975f5c5SAndroid Build Coastguard Worker                                         gl::TextureType type,
159*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei samples,
160*8975f5c5SAndroid Build Coastguard Worker                                         GLint internalformat,
161*8975f5c5SAndroid Build Coastguard Worker                                         const gl::Extents &size,
162*8975f5c5SAndroid Build Coastguard Worker                                         bool fixedSampleLocations) override;
163*8975f5c5SAndroid Build Coastguard Worker 
164*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeContents(const gl::Context *context,
165*8975f5c5SAndroid Build Coastguard Worker                                      GLenum binding,
166*8975f5c5SAndroid Build Coastguard Worker                                      const gl::ImageIndex &imageIndex) override;
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker     angle::Result getAttachmentRenderTarget(const gl::Context *context,
169*8975f5c5SAndroid Build Coastguard Worker                                             GLenum binding,
170*8975f5c5SAndroid Build Coastguard Worker                                             const gl::ImageIndex &imageIndex,
171*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei samples,
172*8975f5c5SAndroid Build Coastguard Worker                                             FramebufferAttachmentRenderTarget **rtOut) override;
173*8975f5c5SAndroid Build Coastguard Worker 
getImage()174*8975f5c5SAndroid Build Coastguard Worker     webgpu::ImageHelper *getImage() { return mImage; }
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker   private:
177*8975f5c5SAndroid Build Coastguard Worker     angle::Result setImageImpl(const gl::Context *context,
178*8975f5c5SAndroid Build Coastguard Worker                                GLenum internalFormat,
179*8975f5c5SAndroid Build Coastguard Worker                                GLenum type,
180*8975f5c5SAndroid Build Coastguard Worker                                const gl::ImageIndex &index,
181*8975f5c5SAndroid Build Coastguard Worker                                const gl::Extents &size,
182*8975f5c5SAndroid Build Coastguard Worker                                const gl::PixelUnpackState &unpack,
183*8975f5c5SAndroid Build Coastguard Worker                                const uint8_t *pixels);
184*8975f5c5SAndroid Build Coastguard Worker 
185*8975f5c5SAndroid Build Coastguard Worker     angle::Result setSubImageImpl(const gl::Context *context,
186*8975f5c5SAndroid Build Coastguard Worker                                   const webgpu::Format &webgpuFormat,
187*8975f5c5SAndroid Build Coastguard Worker                                   GLenum type,
188*8975f5c5SAndroid Build Coastguard Worker                                   const gl::ImageIndex &index,
189*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Box &area,
190*8975f5c5SAndroid Build Coastguard Worker                                   const gl::PixelUnpackState &unpack,
191*8975f5c5SAndroid Build Coastguard Worker                                   const uint8_t *pixels);
192*8975f5c5SAndroid Build Coastguard Worker 
193*8975f5c5SAndroid Build Coastguard Worker     angle::Result initializeImage(ContextWgpu *contextWgpu, ImageMipLevels mipLevels);
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     angle::Result redefineLevel(const gl::Context *context,
196*8975f5c5SAndroid Build Coastguard Worker                                 const webgpu::Format &webgpuFormat,
197*8975f5c5SAndroid Build Coastguard Worker                                 const gl::ImageIndex &index,
198*8975f5c5SAndroid Build Coastguard Worker                                 const gl::Extents &size);
199*8975f5c5SAndroid Build Coastguard Worker 
200*8975f5c5SAndroid Build Coastguard Worker     uint32_t getMipLevelCount(ImageMipLevels mipLevels) const;
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker     uint32_t getMaxLevelCount() const;
203*8975f5c5SAndroid Build Coastguard Worker     angle::Result respecifyImageStorageIfNecessary(ContextWgpu *contextWgpu, gl::Command source);
204*8975f5c5SAndroid Build Coastguard Worker     void prepareForGenerateMipmap(ContextWgpu *contextWgpu);
205*8975f5c5SAndroid Build Coastguard Worker     angle::Result maybeUpdateBaseMaxLevels(ContextWgpu *contextWgpu);
206*8975f5c5SAndroid Build Coastguard Worker     angle::Result initSingleLayerRenderTargets(ContextWgpu *contextWgpu,
207*8975f5c5SAndroid Build Coastguard Worker                                                GLuint layerCount,
208*8975f5c5SAndroid Build Coastguard Worker                                                gl::LevelIndex levelIndex,
209*8975f5c5SAndroid Build Coastguard Worker                                                gl::RenderToTextureImageIndex renderToTextureIndex);
210*8975f5c5SAndroid Build Coastguard Worker     const webgpu::Format &getBaseLevelFormat(ContextWgpu *contextWgpu) const;
211*8975f5c5SAndroid Build Coastguard Worker 
212*8975f5c5SAndroid Build Coastguard Worker     webgpu::ImageHelper *mImage;
213*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex mCurrentBaseLevel;
214*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex mCurrentMaxLevel;
215*8975f5c5SAndroid Build Coastguard Worker     gl::CubeFaceArray<gl::TexLevelMask> mRedefinedLevels;
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     // Render targets stored as array of vector of vectors
218*8975f5c5SAndroid Build Coastguard Worker     //
219*8975f5c5SAndroid Build Coastguard Worker     // - First dimension: only RenderToTextureImageIndex::Default for now.
220*8975f5c5SAndroid Build Coastguard Worker     // - Second dimension: level
221*8975f5c5SAndroid Build Coastguard Worker     // - Third dimension: layer
222*8975f5c5SAndroid Build Coastguard Worker     gl::RenderToTextureImageMap<std::vector<std::vector<RenderTargetWgpu>>>
223*8975f5c5SAndroid Build Coastguard Worker         mSingleLayerRenderTargets;
224*8975f5c5SAndroid Build Coastguard Worker };
225*8975f5c5SAndroid Build Coastguard Worker 
226*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_WGPU_TEXTUREWGPU_H_
229