xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/BlitGL.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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