1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 // BlitGL.h: Defines the BlitGL class, a helper for blitting textures 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_GL_BLITGL_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_GL_BLITGL_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/formatutilsgl.h" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker #include <map> 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Worker namespace angle 21*8975f5c5SAndroid Build Coastguard Worker { 22*8975f5c5SAndroid Build Coastguard Worker struct FeaturesGL; 23*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker namespace gl 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker class Framebuffer; 28*8975f5c5SAndroid Build Coastguard Worker class ImageIndex; 29*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker namespace rx 32*8975f5c5SAndroid Build Coastguard Worker { 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker class FramebufferGL; 35*8975f5c5SAndroid Build Coastguard Worker class FunctionsGL; 36*8975f5c5SAndroid Build Coastguard Worker class RenderbufferGL; 37*8975f5c5SAndroid Build Coastguard Worker class StateManagerGL; 38*8975f5c5SAndroid Build Coastguard Worker class TextureGL; 39*8975f5c5SAndroid Build Coastguard Worker struct VertexArrayStateGL; 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker class BlitGL : angle::NonCopyable 42*8975f5c5SAndroid Build Coastguard Worker { 43*8975f5c5SAndroid Build Coastguard Worker public: 44*8975f5c5SAndroid Build Coastguard Worker BlitGL(const FunctionsGL *functions, 45*8975f5c5SAndroid Build Coastguard Worker const angle::FeaturesGL &features, 46*8975f5c5SAndroid Build Coastguard Worker StateManagerGL *stateManager); 47*8975f5c5SAndroid Build Coastguard Worker ~BlitGL(); 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker angle::Result copyImageToLUMAWorkaroundTexture(const gl::Context *context, 50*8975f5c5SAndroid Build Coastguard Worker GLuint texture, 51*8975f5c5SAndroid Build Coastguard Worker gl::TextureType textureType, 52*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 53*8975f5c5SAndroid Build Coastguard Worker GLenum lumaFormat, 54*8975f5c5SAndroid Build Coastguard Worker size_t level, 55*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 56*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat, 57*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *source); 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker angle::Result copySubImageToLUMAWorkaroundTexture(const gl::Context *context, 60*8975f5c5SAndroid Build Coastguard Worker GLuint texture, 61*8975f5c5SAndroid Build Coastguard Worker gl::TextureType textureType, 62*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 63*8975f5c5SAndroid Build Coastguard Worker GLenum lumaFormat, 64*8975f5c5SAndroid Build Coastguard Worker size_t level, 65*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 66*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 67*8975f5c5SAndroid Build Coastguard Worker gl::Framebuffer *source); 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker angle::Result blitColorBufferWithShader(const gl::Context *context, 70*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *source, 71*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *dest, 72*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 73*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 74*8975f5c5SAndroid Build Coastguard Worker GLenum filter, 75*8975f5c5SAndroid Build Coastguard Worker bool writeAlpha); 76*8975f5c5SAndroid Build Coastguard Worker 77*8975f5c5SAndroid Build Coastguard Worker angle::Result blitColorBufferWithShader(const gl::Context *context, 78*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *source, 79*8975f5c5SAndroid Build Coastguard Worker const GLuint destFramebuffer, 80*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 81*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 82*8975f5c5SAndroid Build Coastguard Worker GLenum filter, 83*8975f5c5SAndroid Build Coastguard Worker bool writeAlpha); 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker angle::Result blitColorBufferWithShader(const gl::Context *context, 86*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer *source, 87*8975f5c5SAndroid Build Coastguard Worker const GLuint destTexture, 88*8975f5c5SAndroid Build Coastguard Worker const gl::TextureTarget destTarget, 89*8975f5c5SAndroid Build Coastguard Worker const size_t destLevel, 90*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 91*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 92*8975f5c5SAndroid Build Coastguard Worker GLenum filter, 93*8975f5c5SAndroid Build Coastguard Worker bool writeAlpha); 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker angle::Result copySubTexture(const gl::Context *context, 96*8975f5c5SAndroid Build Coastguard Worker TextureGL *source, 97*8975f5c5SAndroid Build Coastguard Worker size_t sourceLevel, 98*8975f5c5SAndroid Build Coastguard Worker GLenum sourceComponentType, 99*8975f5c5SAndroid Build Coastguard Worker GLuint destID, 100*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget destTarget, 101*8975f5c5SAndroid Build Coastguard Worker size_t destLevel, 102*8975f5c5SAndroid Build Coastguard Worker GLenum destComponentType, 103*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &sourceSize, 104*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 105*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 106*8975f5c5SAndroid Build Coastguard Worker bool needsLumaWorkaround, 107*8975f5c5SAndroid Build Coastguard Worker GLenum lumaFormat, 108*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 109*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 110*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha, 111*8975f5c5SAndroid Build Coastguard Worker bool transformLinearToSrgb, 112*8975f5c5SAndroid Build Coastguard Worker bool *copySucceededOut); 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard Worker angle::Result copySubTextureCPUReadback(const gl::Context *context, 115*8975f5c5SAndroid Build Coastguard Worker TextureGL *source, 116*8975f5c5SAndroid Build Coastguard Worker size_t sourceLevel, 117*8975f5c5SAndroid Build Coastguard Worker GLenum sourceSizedInternalFormat, 118*8975f5c5SAndroid Build Coastguard Worker TextureGL *dest, 119*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget destTarget, 120*8975f5c5SAndroid Build Coastguard Worker size_t destLevel, 121*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat, 122*8975f5c5SAndroid Build Coastguard Worker GLenum destType, 123*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &sourceSize, 124*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 125*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 126*8975f5c5SAndroid Build Coastguard Worker bool needsLumaWorkaround, 127*8975f5c5SAndroid Build Coastguard Worker GLenum lumaFormat, 128*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY, 129*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha, 130*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha); 131*8975f5c5SAndroid Build Coastguard Worker 132*8975f5c5SAndroid Build Coastguard Worker angle::Result copyTexSubImage(const gl::Context *context, 133*8975f5c5SAndroid Build Coastguard Worker TextureGL *source, 134*8975f5c5SAndroid Build Coastguard Worker size_t sourceLevel, 135*8975f5c5SAndroid Build Coastguard Worker TextureGL *dest, 136*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget destTarget, 137*8975f5c5SAndroid Build Coastguard Worker size_t destLevel, 138*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 139*8975f5c5SAndroid Build Coastguard Worker const gl::Offset &destOffset, 140*8975f5c5SAndroid Build Coastguard Worker bool *copySucceededOut); 141*8975f5c5SAndroid Build Coastguard Worker 142*8975f5c5SAndroid Build Coastguard Worker angle::Result clearRenderableTexture(const gl::Context *context, 143*8975f5c5SAndroid Build Coastguard Worker TextureGL *source, 144*8975f5c5SAndroid Build Coastguard Worker GLenum sizedInternalFormat, 145*8975f5c5SAndroid Build Coastguard Worker int numTextureLayers, 146*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &imageIndex, 147*8975f5c5SAndroid Build Coastguard Worker bool *clearSucceededOut); 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker angle::Result clearRenderbuffer(const gl::Context *context, 150*8975f5c5SAndroid Build Coastguard Worker RenderbufferGL *source, 151*8975f5c5SAndroid Build Coastguard Worker GLenum sizedInternalFormat); 152*8975f5c5SAndroid Build Coastguard Worker 153*8975f5c5SAndroid Build Coastguard Worker angle::Result clearFramebuffer(const gl::Context *context, 154*8975f5c5SAndroid Build Coastguard Worker const gl::DrawBufferMask &colorAttachments, 155*8975f5c5SAndroid Build Coastguard Worker bool depthClear, 156*8975f5c5SAndroid Build Coastguard Worker bool stencilClear, 157*8975f5c5SAndroid Build Coastguard Worker FramebufferGL *source); 158*8975f5c5SAndroid Build Coastguard Worker 159*8975f5c5SAndroid Build Coastguard Worker angle::Result clearRenderableTextureAlphaToOne(const gl::Context *context, 160*8975f5c5SAndroid Build Coastguard Worker GLuint texture, 161*8975f5c5SAndroid Build Coastguard Worker gl::TextureTarget target, 162*8975f5c5SAndroid Build Coastguard Worker size_t level); 163*8975f5c5SAndroid Build Coastguard Worker 164*8975f5c5SAndroid Build Coastguard Worker angle::Result generateMipmap(const gl::Context *context, 165*8975f5c5SAndroid Build Coastguard Worker TextureGL *source, 166*8975f5c5SAndroid Build Coastguard Worker GLuint baseLevel, 167*8975f5c5SAndroid Build Coastguard Worker GLuint levelCount, 168*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &sourceBaseLevelSize, 169*8975f5c5SAndroid Build Coastguard Worker const nativegl::TexImageFormat &format); 170*8975f5c5SAndroid Build Coastguard Worker angle::Result generateSRGBMipmap(const gl::Context *context, 171*8975f5c5SAndroid Build Coastguard Worker TextureGL *source, 172*8975f5c5SAndroid Build Coastguard Worker GLuint baseLevel, 173*8975f5c5SAndroid Build Coastguard Worker GLuint levelCount, 174*8975f5c5SAndroid Build Coastguard Worker const gl::Extents &sourceBaseLevelSize); 175*8975f5c5SAndroid Build Coastguard Worker 176*8975f5c5SAndroid Build Coastguard Worker angle::Result initializeResources(const gl::Context *context); 177*8975f5c5SAndroid Build Coastguard Worker 178*8975f5c5SAndroid Build Coastguard Worker private: 179*8975f5c5SAndroid Build Coastguard Worker angle::Result orphanScratchTextures(const gl::Context *context); 180*8975f5c5SAndroid Build Coastguard Worker angle::Result setScratchTextureParameter(const gl::Context *context, 181*8975f5c5SAndroid Build Coastguard Worker GLenum param, 182*8975f5c5SAndroid Build Coastguard Worker GLenum value); 183*8975f5c5SAndroid Build Coastguard Worker angle::Result setVAOState(const gl::Context *context); 184*8975f5c5SAndroid Build Coastguard Worker angle::Result initializeVAOState(const gl::Context *context); 185*8975f5c5SAndroid Build Coastguard Worker 186*8975f5c5SAndroid Build Coastguard Worker const FunctionsGL *mFunctions; 187*8975f5c5SAndroid Build Coastguard Worker const angle::FeaturesGL &mFeatures; 188*8975f5c5SAndroid Build Coastguard Worker StateManagerGL *mStateManager; 189*8975f5c5SAndroid Build Coastguard Worker 190*8975f5c5SAndroid Build Coastguard Worker struct BlitProgram 191*8975f5c5SAndroid Build Coastguard Worker { 192*8975f5c5SAndroid Build Coastguard Worker GLuint program = 0; 193*8975f5c5SAndroid Build Coastguard Worker GLint sourceTextureLocation = -1; 194*8975f5c5SAndroid Build Coastguard Worker GLint scaleLocation = -1; 195*8975f5c5SAndroid Build Coastguard Worker GLint offsetLocation = -1; 196*8975f5c5SAndroid Build Coastguard Worker GLint multiplyAlphaLocation = -1; 197*8975f5c5SAndroid Build Coastguard Worker GLint unMultiplyAlphaLocation = -1; 198*8975f5c5SAndroid Build Coastguard Worker GLint transformLinearToSrgbLocation = -1; 199*8975f5c5SAndroid Build Coastguard Worker }; 200*8975f5c5SAndroid Build Coastguard Worker 201*8975f5c5SAndroid Build Coastguard Worker angle::Result getBlitProgram(const gl::Context *context, 202*8975f5c5SAndroid Build Coastguard Worker gl::TextureType sourceTextureType, 203*8975f5c5SAndroid Build Coastguard Worker GLenum sourceComponentType, 204*8975f5c5SAndroid Build Coastguard Worker GLenum destComponentType, 205*8975f5c5SAndroid Build Coastguard Worker BlitProgram **program); 206*8975f5c5SAndroid Build Coastguard Worker 207*8975f5c5SAndroid Build Coastguard Worker bool mResourcesInitialized = false; 208*8975f5c5SAndroid Build Coastguard Worker 209*8975f5c5SAndroid Build Coastguard Worker // SourceType, SourceComponentType, DestComponentType 210*8975f5c5SAndroid Build Coastguard Worker using BlitProgramType = std::tuple<gl::TextureType, GLenum, GLenum>; 211*8975f5c5SAndroid Build Coastguard Worker std::map<BlitProgramType, BlitProgram> mBlitPrograms; 212*8975f5c5SAndroid Build Coastguard Worker 213*8975f5c5SAndroid Build Coastguard Worker GLuint mScratchTextures[2] = {0}; 214*8975f5c5SAndroid Build Coastguard Worker GLuint mScratchFBO = 0; 215*8975f5c5SAndroid Build Coastguard Worker 216*8975f5c5SAndroid Build Coastguard Worker GLuint mVAO = 0; 217*8975f5c5SAndroid Build Coastguard Worker VertexArrayStateGL *mVAOState = nullptr; 218*8975f5c5SAndroid Build Coastguard Worker bool mOwnsVAOState = false; 219*8975f5c5SAndroid Build Coastguard Worker 220*8975f5c5SAndroid Build Coastguard Worker const GLuint mTexcoordAttribLocation = 0; 221*8975f5c5SAndroid Build Coastguard Worker GLuint mVertexBuffer = 0; 222*8975f5c5SAndroid Build Coastguard Worker 223*8975f5c5SAndroid Build Coastguard Worker nativegl::TexImageFormat mSRGBMipmapGenerationFormat; 224*8975f5c5SAndroid Build Coastguard Worker }; 225*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 226*8975f5c5SAndroid Build Coastguard Worker 227*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_GL_BLITGL_H_ 228