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