5 #ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_GLES_PROC_TABLE_GLES_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_GLES_PROC_TABLE_GLES_H_
11 #include "flutter/fml/logging.h"
12 #include "flutter/fml/mapping.h"
34 if (error == GL_NO_ERROR) {
39 << error <<
")" <<
" encountered on call to " <<
name;
42 <<
")" <<
" encountered on call to " <<
name;
55 template <
class Type,
class... Rest>
64 template <
class... Type>
66 std::stringstream stream;
81 const char*
name =
nullptr;
108 template <
class... Args>
110 #if defined(IMPELLER_DEBUG) && !defined(NDEBUG)
115 FML_CHECK(
IsAvailable()) <<
"GL function " <<
name <<
" is not available. "
116 <<
"This is likely due to a missing extension.";
118 FML_LOG(IMPORTANT) <<
name
122 return function(std::forward<Args>(args)...);
125 constexpr
bool IsAvailable()
const {
return function !=
nullptr; }
133 #define FOR_EACH_IMPELLER_PROC(PROC) \
134 PROC(ActiveTexture); \
135 PROC(AttachShader); \
136 PROC(BindAttribLocation); \
138 PROC(BindFramebuffer); \
139 PROC(BindRenderbuffer); \
141 PROC(BindVertexArray); \
142 PROC(BlendEquationSeparate); \
143 PROC(BlendFuncSeparate); \
145 PROC(BufferSubData); \
146 PROC(CheckFramebufferStatus); \
149 PROC(ClearStencil); \
151 PROC(CompileShader); \
152 PROC(CreateProgram); \
153 PROC(CreateShader); \
155 PROC(DeleteBuffers); \
156 PROC(DeleteFramebuffers); \
157 PROC(DeleteProgram); \
158 PROC(DeleteRenderbuffers); \
159 PROC(DeleteShader); \
160 PROC(DeleteTextures); \
161 PROC(DeleteVertexArrays); \
164 PROC(DetachShader); \
166 PROC(DisableVertexAttribArray); \
168 PROC(DrawElements); \
170 PROC(EnableVertexAttribArray); \
173 PROC(FramebufferRenderbuffer); \
174 PROC(FramebufferTexture2D); \
177 PROC(GenerateMipmap); \
178 PROC(GenFramebuffers); \
179 PROC(GenRenderbuffers); \
181 PROC(GenVertexArrays); \
182 PROC(GetActiveUniform); \
185 PROC(GetFramebufferAttachmentParameteriv); \
187 PROC(GetProgramInfoLog); \
188 PROC(GetProgramiv); \
189 PROC(GetShaderInfoLog); \
193 PROC(GetUniformLocation); \
195 PROC(IsFramebuffer); \
197 PROC(IsRenderbuffer); \
202 PROC(RenderbufferStorage); \
204 PROC(ShaderBinary); \
205 PROC(ShaderSource); \
206 PROC(StencilFuncSeparate); \
207 PROC(StencilMaskSeparate); \
208 PROC(StencilOpSeparate); \
210 PROC(TexSubImage2D); \
211 PROC(TexParameteri); \
212 PROC(TexParameterfv); \
218 PROC(UniformMatrix4fv); \
220 PROC(VertexAttribPointer); \
222 PROC(GetShaderSource); \
229 #define FOR_EACH_IMPELLER_ES_ONLY_PROC(PROC) \
237 #define FOR_EACH_IMPELLER_DESKTOP_ONLY_PROC(PROC) \
241 #define FOR_EACH_IMPELLER_GLES3_PROC(PROC) \
244 PROC(GetActiveUniformBlockiv); \
245 PROC(GetActiveUniformBlockName); \
246 PROC(GetUniformBlockIndex); \
247 PROC(UniformBlockBinding); \
248 PROC(BindBufferRange); \
250 PROC(BlitFramebuffer);
252 #define FOR_EACH_IMPELLER_EXT_PROC(PROC) \
253 PROC(DebugMessageControlKHR); \
254 PROC(DiscardFramebufferEXT); \
255 PROC(FramebufferTexture2DMultisampleEXT); \
256 PROC(PushDebugGroupKHR); \
257 PROC(PopDebugGroupKHR); \
258 PROC(ObjectLabelKHR); \
259 PROC(RenderbufferStorageMultisampleEXT); \
260 PROC(GenQueriesEXT); \
261 PROC(DeleteQueriesEXT); \
262 PROC(GetQueryObjectui64vEXT); \
263 PROC(BeginQueryEXT); \
265 PROC(GetQueryObjectuivEXT);
279 using Resolver = std::function<
void*(
const char* function_name)>;
285 #define IMPELLER_PROC(name) \
286 GLProc<decltype(gl##name)> name = {"gl" #name, nullptr};
304 const fml::Mapping& mapping,
305 const std::vector<Scalar>& defines = {})
const;
309 const std::shared_ptr<const CapabilitiesGLES>&
GetCapabilities()
const;
321 std::string_view label)
const;
329 const fml::Mapping& mapping,
330 const std::vector<Scalar>& defines)
const;
333 bool is_valid_ =
false;
334 std::unique_ptr<DescriptionGLES> description_;
335 std::shared_ptr<const CapabilitiesGLES> capabilities_;
336 GLint debug_label_max_length_ = 0;
FOR_EACH_IMPELLER_ES_ONLY_PROC(IMPELLER_PROC)
ProcTableGLES(ProcTableGLES &&other)=default
std::optional< std::string > ComputeShaderWithDefines(const fml::Mapping &mapping, const std::vector< Scalar > &defines) const
void PopDebugGroup() const
bool SetDebugLabel(DebugResourceType type, GLint name, std::string_view label) const
FOR_EACH_IMPELLER_GLES3_PROC(IMPELLER_PROC)
std::function< void *(const char *function_name)> Resolver
void ShaderSourceMapping(GLuint shader, const fml::Mapping &mapping, const std::vector< Scalar > &defines={}) const
Set the source for the attached [shader].
FOR_EACH_IMPELLER_DESKTOP_ONLY_PROC(IMPELLER_PROC)
std::string GetProgramInfoLogString(GLuint program) const
bool SupportsDebugLabels() const
std::string DescribeCurrentFramebuffer() const
const std::shared_ptr< const CapabilitiesGLES > & GetCapabilities() const
bool IsCurrentFramebufferComplete() const
ProcTableGLES(Resolver resolver)
FOR_EACH_IMPELLER_PROC(IMPELLER_PROC)
FOR_EACH_IMPELLER_EXT_PROC(IMPELLER_PROC)
void PushDebugGroup(const std::string &string) const
const DescriptionGLES * GetDescription() const
void() glClearDepth(GLdouble depth)
bool GLErrorIsFatal(GLenum value)
void() glDepthRangef(GLfloat n, GLfloat f)
const char * GLErrorToString(GLenum value)
void BuildGLArgumentsStream(std::stringstream &stream, Type arg)
void() glDepthRange(GLdouble n, GLdouble f)
void() glClearDepthf(GLfloat depth)
std::string BuildGLArguments(Type... args)
#define IMPELLER_PROC(name)
AutoErrorCheck(PFNGLGETERRORPROC error, const char *name)
const PFNGLGETERRORPROC error_fn
auto operator()(Args &&... args) const
Call the GL function with the appropriate parameters. Lookup the documentation for the GL function be...
constexpr bool IsAvailable() const
PFNGLGETERRORPROC error_fn