1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 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 7*8975f5c5SAndroid Build Coastguard Worker // TextureImpl.h: Defines the abstract rx::TextureImpl classes. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_TEXTUREIMPL_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_TEXTUREIMPL_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include <stdint.h> 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ImageIndex.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Stream.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Texture.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h" 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker namespace egl 24*8975f5c5SAndroid Build Coastguard Worker { 25*8975f5c5SAndroid Build Coastguard Worker class Surface; 26*8975f5c5SAndroid Build Coastguard Worker class Image; 27*8975f5c5SAndroid Build Coastguard Worker } // namespace egl 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker namespace gl 30*8975f5c5SAndroid Build Coastguard Worker { 31*8975f5c5SAndroid Build Coastguard Worker class Framebuffer; 32*8975f5c5SAndroid Build Coastguard Worker class MemoryObject; 33*8975f5c5SAndroid Build Coastguard Worker struct PixelUnpackState; 34*8975f5c5SAndroid Build Coastguard Worker class TextureState; 35*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker namespace rx 38*8975f5c5SAndroid Build Coastguard Worker { 39*8975f5c5SAndroid Build Coastguard Worker class ContextImpl; 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker class TextureImpl : public FramebufferAttachmentObjectImpl 42*8975f5c5SAndroid Build Coastguard Worker { 43*8975f5c5SAndroid Build Coastguard Worker public: 44*8975f5c5SAndroid Build Coastguard Worker TextureImpl(const gl::TextureState &state); 45*8975f5c5SAndroid Build Coastguard Worker ~TextureImpl() override; 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker virtual void onDestroy(const gl::Context *context); 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setImage(const gl::Context *context, 50*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 51*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 52*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size, 53*8975f5c5SAndroid Build Coastguard Worker GLenum format, 54*8975f5c5SAndroid Build Coastguard Worker GLenum type, 55*8975f5c5SAndroid Build Coastguard Worker const gl::PixelUnpackState &unpack, 56*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *unpackBuffer, 57*8975f5c5SAndroid Build Coastguard Worker const uint8_t *pixels) = 0; 58*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setSubImage(const gl::Context *context, 59*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 60*8975f5c5SAndroid Build Coastguard Worker const gl::Box &area, 61*8975f5c5SAndroid Build Coastguard Worker GLenum format, 62*8975f5c5SAndroid Build Coastguard Worker GLenum type, 63*8975f5c5SAndroid Build Coastguard Worker const gl::PixelUnpackState &unpack, 64*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *unpackBuffer, 65*8975f5c5SAndroid Build Coastguard Worker const uint8_t *pixels) = 0; 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setCompressedImage(const gl::Context *context, 68*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 69*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 70*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size, 71*8975f5c5SAndroid Build Coastguard Worker const gl::PixelUnpackState &unpack, 72*8975f5c5SAndroid Build Coastguard Worker size_t imageSize, 73*8975f5c5SAndroid Build Coastguard Worker const uint8_t *pixels) = 0; 74*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setCompressedSubImage(const gl::Context *context, 75*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 76*8975f5c5SAndroid Build Coastguard Worker const gl::Box &area, 77*8975f5c5SAndroid Build Coastguard Worker GLenum format, 78*8975f5c5SAndroid Build Coastguard Worker const gl::PixelUnpackState &unpack, 79*8975f5c5SAndroid Build Coastguard Worker size_t imageSize, 80*8975f5c5SAndroid Build Coastguard Worker const uint8_t *pixels) = 0; 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyImage(const gl::Context *context, 83*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 84*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 85*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 86*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *source) = 0; 87*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copySubImage(const gl::Context *context, 88*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 89*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 90*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 91*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *source) = 0; 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyTexture(const gl::Context *context, 94*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 95*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 96*8975f5c5SAndroid Build Coastguard Worker GLenum type, 97*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel, 98*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 99*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 100*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha, 101*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source); 102*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copySubTexture(const gl::Context *context, 103*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 104*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 105*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel, 106*8975f5c5SAndroid Build Coastguard Worker const gl::Box &sourceBox, 107*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 108*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 109*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha, 110*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source); 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyRenderbufferSubData(const gl::Context *context, 113*8975f5c5SAndroid Build Coastguard Worker const gl::Renderbuffer *srcBuffer, 114*8975f5c5SAndroid Build Coastguard Worker GLint srcLevel, 115*8975f5c5SAndroid Build Coastguard Worker GLint srcX, 116*8975f5c5SAndroid Build Coastguard Worker GLint srcY, 117*8975f5c5SAndroid Build Coastguard Worker GLint srcZ, 118*8975f5c5SAndroid Build Coastguard Worker GLint dstLevel, 119*8975f5c5SAndroid Build Coastguard Worker GLint dstX, 120*8975f5c5SAndroid Build Coastguard Worker GLint dstY, 121*8975f5c5SAndroid Build Coastguard Worker GLint dstZ, 122*8975f5c5SAndroid Build Coastguard Worker GLsizei srcWidth, 123*8975f5c5SAndroid Build Coastguard Worker GLsizei srcHeight, 124*8975f5c5SAndroid Build Coastguard Worker GLsizei srcDepth); 125*8975f5c5SAndroid Build Coastguard Worker 126*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyTextureSubData(const gl::Context *context, 127*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *srcTexture, 128*8975f5c5SAndroid Build Coastguard Worker GLint srcLevel, 129*8975f5c5SAndroid Build Coastguard Worker GLint srcX, 130*8975f5c5SAndroid Build Coastguard Worker GLint srcY, 131*8975f5c5SAndroid Build Coastguard Worker GLint srcZ, 132*8975f5c5SAndroid Build Coastguard Worker GLint dstLevel, 133*8975f5c5SAndroid Build Coastguard Worker GLint dstX, 134*8975f5c5SAndroid Build Coastguard Worker GLint dstY, 135*8975f5c5SAndroid Build Coastguard Worker GLint dstZ, 136*8975f5c5SAndroid Build Coastguard Worker GLsizei srcWidth, 137*8975f5c5SAndroid Build Coastguard Worker GLsizei srcHeight, 138*8975f5c5SAndroid Build Coastguard Worker GLsizei srcDepth); 139*8975f5c5SAndroid Build Coastguard Worker 140*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copyCompressedTexture(const gl::Context *context, 141*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source); 142*8975f5c5SAndroid Build Coastguard Worker 143*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copy3DTexture(const gl::Context *context, 144*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 145*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 146*8975f5c5SAndroid Build Coastguard Worker GLenum type, 147*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel, 148*8975f5c5SAndroid Build Coastguard Worker GLint destLevel, 149*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 150*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 151*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha, 152*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source); 153*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result copy3DSubTexture(const gl::Context *context, 154*8975f5c5SAndroid Build Coastguard Worker const gl::TextureTarget target, 155*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 156*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel, 157*8975f5c5SAndroid Build Coastguard Worker GLint destLevel, 158*8975f5c5SAndroid Build Coastguard Worker const gl::Box &srcBox, 159*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 160*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 161*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha, 162*8975f5c5SAndroid Build Coastguard Worker const gl::Texture *source); 163*8975f5c5SAndroid Build Coastguard Worker 164*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setStorage(const gl::Context *context, 165*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 166*8975f5c5SAndroid Build Coastguard Worker size_t levels, 167*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 168*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size) = 0; 169*8975f5c5SAndroid Build Coastguard Worker 170*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setStorageMultisample(const gl::Context *context, 171*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 172*8975f5c5SAndroid Build Coastguard Worker GLsizei samples, 173*8975f5c5SAndroid Build Coastguard Worker GLint internalformat, 174*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size, 175*8975f5c5SAndroid Build Coastguard Worker bool fixedSampleLocations) = 0; 176*8975f5c5SAndroid Build Coastguard Worker 177*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setStorageAttribs(const gl::Context *context, 178*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 179*8975f5c5SAndroid Build Coastguard Worker size_t levels, 180*8975f5c5SAndroid Build Coastguard Worker GLint internalformat, 181*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size, 182*8975f5c5SAndroid Build Coastguard Worker const GLint *attribList); 183*8975f5c5SAndroid Build Coastguard Worker 184*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setStorageExternalMemory(const gl::Context *context, 185*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 186*8975f5c5SAndroid Build Coastguard Worker size_t levels, 187*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 188*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size, 189*8975f5c5SAndroid Build Coastguard Worker gl::MemoryObject *memoryObject, 190*8975f5c5SAndroid Build Coastguard Worker GLuint64 offset, 191*8975f5c5SAndroid Build Coastguard Worker GLbitfield createFlags, 192*8975f5c5SAndroid Build Coastguard Worker GLbitfield usageFlags, 193*8975f5c5SAndroid Build Coastguard Worker const void *imageCreateInfoPNext) = 0; 194*8975f5c5SAndroid Build Coastguard Worker 195*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setImageExternal(const gl::Context *context, 196*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index, 197*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 198*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &size, 199*8975f5c5SAndroid Build Coastguard Worker GLenum format, 200*8975f5c5SAndroid Build Coastguard Worker GLenum type); 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setEGLImageTarget(const gl::Context *context, 203*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 204*8975f5c5SAndroid Build Coastguard Worker egl::Image *image) = 0; 205*8975f5c5SAndroid Build Coastguard Worker 206*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setImageExternal(const gl::Context *context, 207*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type, 208*8975f5c5SAndroid Build Coastguard Worker egl::Stream *stream, 209*8975f5c5SAndroid Build Coastguard Worker const egl::Stream::GLTextureDescription &desc) = 0; 210*8975f5c5SAndroid Build Coastguard Worker 211*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setBuffer(const gl::Context *context, GLenum internalFormat); 212*8975f5c5SAndroid Build Coastguard Worker 213*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result generateMipmap(const gl::Context *context) = 0; 214*8975f5c5SAndroid Build Coastguard Worker 215*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result clearImage(const gl::Context *context, 216*8975f5c5SAndroid Build Coastguard Worker GLint level, 217*8975f5c5SAndroid Build Coastguard Worker GLenum format, 218*8975f5c5SAndroid Build Coastguard Worker GLenum type, 219*8975f5c5SAndroid Build Coastguard Worker const uint8_t *data); 220*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result clearSubImage(const gl::Context *context, 221*8975f5c5SAndroid Build Coastguard Worker GLint level, 222*8975f5c5SAndroid Build Coastguard Worker const gl::Box &area, 223*8975f5c5SAndroid Build Coastguard Worker GLenum format, 224*8975f5c5SAndroid Build Coastguard Worker GLenum type, 225*8975f5c5SAndroid Build Coastguard Worker const uint8_t *data); 226*8975f5c5SAndroid Build Coastguard Worker 227*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setBaseLevel(const gl::Context *context, GLuint baseLevel) = 0; 228*8975f5c5SAndroid Build Coastguard Worker 229*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result bindTexImage(const gl::Context *context, egl::Surface *surface) = 0; 230*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result releaseTexImage(const gl::Context *context) = 0; 231*8975f5c5SAndroid Build Coastguard Worker 232*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result onLabelUpdate(const gl::Context *context); 233*8975f5c5SAndroid Build Coastguard Worker 234*8975f5c5SAndroid Build Coastguard Worker // Override if accurate native memory size information is available 235*8975f5c5SAndroid Build Coastguard Worker virtual GLint getMemorySize() const; 236*8975f5c5SAndroid Build Coastguard Worker virtual GLint getLevelMemorySize(gl::TextureTarget target, GLint level); 237*8975f5c5SAndroid Build Coastguard Worker 238*8975f5c5SAndroid Build Coastguard Worker virtual GLint getNativeID() const; 239*8975f5c5SAndroid Build Coastguard Worker 240*8975f5c5SAndroid Build Coastguard Worker virtual GLint getImageCompressionRate(const gl::Context *context); 241*8975f5c5SAndroid Build Coastguard Worker virtual GLint getFormatSupportedCompressionRates(const gl::Context *context, 242*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat, 243*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize, 244*8975f5c5SAndroid Build Coastguard Worker GLint *rates); 245*8975f5c5SAndroid Build Coastguard Worker 246*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result syncState(const gl::Context *context, 247*8975f5c5SAndroid Build Coastguard Worker const gl::Texture::DirtyBits &dirtyBits, 248*8975f5c5SAndroid Build Coastguard Worker gl::Command source) = 0; 249*8975f5c5SAndroid Build Coastguard Worker 250*8975f5c5SAndroid Build Coastguard Worker virtual GLenum getColorReadFormat(const gl::Context *context); 251*8975f5c5SAndroid Build Coastguard Worker virtual GLenum getColorReadType(const gl::Context *context); 252*8975f5c5SAndroid Build Coastguard Worker 253*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result getTexImage(const gl::Context *context, 254*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &packState, 255*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBuffer, 256*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 257*8975f5c5SAndroid Build Coastguard Worker GLint level, 258*8975f5c5SAndroid Build Coastguard Worker GLenum format, 259*8975f5c5SAndroid Build Coastguard Worker GLenum type, 260*8975f5c5SAndroid Build Coastguard Worker void *pixels); 261*8975f5c5SAndroid Build Coastguard Worker 262*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result getCompressedTexImage(const gl::Context *context, 263*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &packState, 264*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBuffer, 265*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 266*8975f5c5SAndroid Build Coastguard Worker GLint level, 267*8975f5c5SAndroid Build Coastguard Worker void *pixels); 268*8975f5c5SAndroid Build Coastguard Worker 269*8975f5c5SAndroid Build Coastguard Worker virtual GLint getRequiredExternalTextureImageUnits(const gl::Context *context); 270*8975f5c5SAndroid Build Coastguard Worker getState()271*8975f5c5SAndroid Build Coastguard Worker const gl::TextureState &getState() const { return mState; } 272*8975f5c5SAndroid Build Coastguard Worker setContentsObservers(gl::TextureBufferContentsObservers * observers)273*8975f5c5SAndroid Build Coastguard Worker void setContentsObservers(gl::TextureBufferContentsObservers *observers) 274*8975f5c5SAndroid Build Coastguard Worker { 275*8975f5c5SAndroid Build Coastguard Worker mBufferContentsObservers = observers; 276*8975f5c5SAndroid Build Coastguard Worker } 277*8975f5c5SAndroid Build Coastguard Worker 278*8975f5c5SAndroid Build Coastguard Worker protected: 279*8975f5c5SAndroid Build Coastguard Worker const gl::TextureState &mState; 280*8975f5c5SAndroid Build Coastguard Worker gl::TextureBufferContentsObservers *mBufferContentsObservers = nullptr; 281*8975f5c5SAndroid Build Coastguard Worker }; 282*8975f5c5SAndroid Build Coastguard Worker 283*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 284*8975f5c5SAndroid Build Coastguard Worker 285*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_TEXTUREIMPL_H_ 286