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

source code of flutter_engine/third_party/angle/src/libANGLE/renderer/gl/BlitGL.h