Skip to content

Commit 2933ce9

Browse files
chinmaygardeAmir Hardon
authored andcommitted
Allow embedders to specify a custom GL proc address resolver. (flutter#6204)
This updates the embedder API but introduces no breaking ABI/API changes.
1 parent 56d413e commit 2933ce9

6 files changed

Lines changed: 48 additions & 8 deletions

File tree

shell/gpu/gpu_surface_gl.cc

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "third_party/skia/include/core/SkSurface.h"
1212
#include "third_party/skia/include/gpu/GrBackendSurface.h"
1313
#include "third_party/skia/include/gpu/GrContextOptions.h"
14+
#include "third_party/skia/include/gpu/gl/GrGLAssembleInterface.h"
1415
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
1516

1617
// These are common defines present on all OpenGL headers. However, we don't
@@ -42,14 +43,27 @@ GPUSurfaceGL::GPUSurfaceGL(GPUSurfaceGLDelegate* delegate)
4243
return;
4344
}
4445

46+
proc_resolver_ = delegate_->GetGLProcResolver();
47+
4548
GrContextOptions options;
4649
options.fAvoidStencilBuffers = true;
4750

4851
// To get video playback on the widest range of devices, we limit Skia to
4952
// ES2 shading language when the ES3 external image extension is missing.
5053
options.fPreferExternalImagesOverES3 = true;
5154

52-
auto context = GrContext::MakeGL(GrGLMakeNativeInterface(), options);
55+
auto interface =
56+
proc_resolver_
57+
? GrGLMakeAssembledGLESInterface(
58+
this /* context */,
59+
[](void* context, const char gl_proc_name[]) -> GrGLFuncPtr {
60+
return reinterpret_cast<GrGLFuncPtr>(
61+
reinterpret_cast<GPUSurfaceGL*>(context)->proc_resolver_(
62+
gl_proc_name));
63+
})
64+
: GrGLMakeNativeInterface();
65+
66+
auto context = GrContext::MakeGL(interface, options);
5367

5468
if (context == nullptr) {
5569
FML_LOG(ERROR) << "Failed to setup Skia Gr context.";

shell/gpu/gpu_surface_gl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#ifndef SHELL_GPU_GPU_SURFACE_GL_H_
66
#define SHELL_GPU_GPU_SURFACE_GL_H_
77

8+
#include <functional>
89
#include <memory>
910

1011
#include "flutter/fml/macros.h"
@@ -33,6 +34,10 @@ class GPUSurfaceGLDelegate {
3334
matrix.setIdentity();
3435
return matrix;
3536
}
37+
38+
using GLProcResolver =
39+
std::function<void* /* proc name */ (const char* /* proc address */)>;
40+
virtual GLProcResolver GetGLProcResolver() const { return nullptr; }
3641
};
3742

3843
class GPUSurfaceGL : public Surface {
@@ -55,6 +60,7 @@ class GPUSurfaceGL : public Surface {
5560

5661
private:
5762
GPUSurfaceGLDelegate* delegate_;
63+
GPUSurfaceGLDelegate::GLProcResolver proc_resolver_;
5864
sk_sp<GrContext> context_;
5965
sk_sp<SkSurface> onscreen_surface_;
6066
sk_sp<SkSurface> offscreen_surface_;

shell/platform/embedder/embedder.cc

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,25 @@ InferOpenGLPlatformViewCreationCallback(
138138
};
139139
}
140140

141+
shell::GPUSurfaceGLDelegate::GLProcResolver gl_proc_resolver = nullptr;
142+
if (SAFE_ACCESS(open_gl_config, gl_proc_resolver, nullptr) != nullptr) {
143+
gl_proc_resolver = [ptr = config->open_gl.gl_proc_resolver,
144+
user_data](const char* gl_proc_name) {
145+
return ptr(user_data, gl_proc_name);
146+
};
147+
}
148+
141149
bool fbo_reset_after_present =
142150
SAFE_ACCESS(open_gl_config, fbo_reset_after_present, false);
143151

144152
shell::EmbedderSurfaceGL::GLDispatchTable gl_dispatch_table = {
145-
gl_make_current, // gl_make_current_callback
146-
gl_clear_current, // gl_clear_current_callback
147-
gl_present, // gl_present_callback
148-
gl_fbo_callback, // gl_fbo_callback
149-
gl_make_resource_current_callback, // gl_make_resource_current_callback
150-
gl_surface_transformation_callback // gl_surface_transformation_callback
153+
gl_make_current, // gl_make_current_callback
154+
gl_clear_current, // gl_clear_current_callback
155+
gl_present, // gl_present_callback
156+
gl_fbo_callback, // gl_fbo_callback
157+
gl_make_resource_current_callback, // gl_make_resource_current_callback
158+
gl_surface_transformation_callback, // gl_surface_transformation_callback
159+
gl_proc_resolver, // gl_proc_resolver
151160
};
152161

153162
return [gl_dispatch_table, fbo_reset_after_present,

shell/platform/embedder/embedder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ typedef bool (*SoftwareSurfacePresentCallback)(void* /* user data */,
6060
const void* /* allocation */,
6161
size_t /* row bytes */,
6262
size_t /* height */);
63+
typedef void* (*ProcResolver)(void* /* user data */, const char* /* name */);
6364

6465
typedef struct {
6566
// The size of this struct. Must be sizeof(FlutterOpenGLRendererConfig).
@@ -77,6 +78,7 @@ typedef struct {
7778
// The transformation to apply to the render target before any rendering
7879
// operations. This callback is optional.
7980
TransformationCallback surface_transformation;
81+
ProcResolver gl_proc_resolver;
8082
} FlutterOpenGLRendererConfig;
8183

8284
typedef struct {

shell/platform/embedder/embedder_surface_gl.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ SkMatrix EmbedderSurfaceGL::GLContextSurfaceTransformation() const {
7070
return callback();
7171
}
7272

73+
// |shell::GPUSurfaceGLDelegate|
74+
EmbedderSurfaceGL::GLProcResolver EmbedderSurfaceGL::GetGLProcResolver() const {
75+
return gl_dispatch_table_.gl_proc_resolver;
76+
}
77+
7378
// |shell::EmbedderSurface|
7479
std::unique_ptr<Surface> EmbedderSurfaceGL::CreateGPUSurface() {
7580
return std::make_unique<GPUSurfaceGL>(this);

shell/platform/embedder/embedder_surface_gl.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class EmbedderSurfaceGL final : public EmbedderSurface,
2121
std::function<intptr_t(void)> gl_fbo_callback; // required
2222
std::function<bool(void)> gl_make_resource_current_callback; // optional
2323
std::function<SkMatrix(void)>
24-
gl_surface_transformation_callback; // optional
24+
gl_surface_transformation_callback; // optional
25+
std::function<void*(const char*)> gl_proc_resolver; // optional
2526
};
2627

2728
EmbedderSurfaceGL(GLDispatchTable gl_dispatch_table,
@@ -61,6 +62,9 @@ class EmbedderSurfaceGL final : public EmbedderSurface,
6162
// |shell::GPUSurfaceGLDelegate|
6263
SkMatrix GLContextSurfaceTransformation() const override;
6364

65+
// |shell::GPUSurfaceGLDelegate|
66+
GLProcResolver GetGLProcResolver() const override;
67+
6468
FML_DISALLOW_COPY_AND_ASSIGN(EmbedderSurfaceGL);
6569
};
6670

0 commit comments

Comments
 (0)