Flutter Engine
The Flutter Engine
embedder_surface_gl_skia.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "flutter/shell/platform/embedder/embedder_surface_gl_skia.h"
6
7#include <utility>
8
9#include "flutter/shell/common/shell_io_manager.h"
10
11namespace flutter {
12
14 GLDispatchTable gl_dispatch_table,
15 bool fbo_reset_after_present,
16 std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder)
17 : gl_dispatch_table_(std::move(gl_dispatch_table)),
18 fbo_reset_after_present_(fbo_reset_after_present),
19 external_view_embedder_(std::move(external_view_embedder)) {
20 // Make sure all required members of the dispatch table are checked.
21 if (!gl_dispatch_table_.gl_make_current_callback ||
22 !gl_dispatch_table_.gl_clear_current_callback ||
23 !gl_dispatch_table_.gl_present_callback ||
24 !gl_dispatch_table_.gl_fbo_callback ||
25 !gl_dispatch_table_.gl_populate_existing_damage) {
26 return;
27 }
28
29 valid_ = true;
30}
31
33
34// |EmbedderSurface|
35bool EmbedderSurfaceGLSkia::IsValid() const {
36 return valid_;
37}
38
39// |GPUSurfaceGLDelegate|
40std::unique_ptr<GLContextResult> EmbedderSurfaceGLSkia::GLContextMakeCurrent() {
41 return std::make_unique<GLContextDefaultResult>(
42 gl_dispatch_table_.gl_make_current_callback());
43}
44
45// |GPUSurfaceGLDelegate|
46bool EmbedderSurfaceGLSkia::GLContextClearCurrent() {
47 return gl_dispatch_table_.gl_clear_current_callback();
48}
49
50// |GPUSurfaceGLDelegate|
51bool EmbedderSurfaceGLSkia::GLContextPresent(
52 const GLPresentInfo& present_info) {
53 // Pass the present information to the embedder present callback.
54 return gl_dispatch_table_.gl_present_callback(present_info);
55}
56
57// |GPUSurfaceGLDelegate|
58GLFBOInfo EmbedderSurfaceGLSkia::GLContextFBO(GLFrameInfo frame_info) const {
59 // Get the FBO ID using the gl_fbo_callback and then get exiting damage by
60 // passing that ID to the gl_populate_existing_damage.
61 return gl_dispatch_table_.gl_populate_existing_damage(
62 gl_dispatch_table_.gl_fbo_callback(frame_info));
63}
64
65// |GPUSurfaceGLDelegate|
66bool EmbedderSurfaceGLSkia::GLContextFBOResetAfterPresent() const {
67 return fbo_reset_after_present_;
68}
69
70// |GPUSurfaceGLDelegate|
71SkMatrix EmbedderSurfaceGLSkia::GLContextSurfaceTransformation() const {
72 auto callback = gl_dispatch_table_.gl_surface_transformation_callback;
73 if (!callback) {
75 matrix.setIdentity();
76 return matrix;
77 }
78 return callback();
79}
80
81// |GPUSurfaceGLDelegate|
82EmbedderSurfaceGLSkia::GLProcResolver EmbedderSurfaceGLSkia::GetGLProcResolver()
83 const {
84 return gl_dispatch_table_.gl_proc_resolver;
85}
86
87// |GPUSurfaceGLDelegate|
88SurfaceFrame::FramebufferInfo EmbedderSurfaceGLSkia::GLContextFramebufferInfo()
89 const {
90 // Enable partial repaint by default on the embedders.
91 auto info = SurfaceFrame::FramebufferInfo{};
92 info.supports_readback = true;
93 info.supports_partial_repaint =
94 gl_dispatch_table_.gl_populate_existing_damage != nullptr;
95 return info;
96}
97
98// |EmbedderSurface|
99std::unique_ptr<Surface> EmbedderSurfaceGLSkia::CreateGPUSurface() {
100 const bool render_to_surface = !external_view_embedder_;
101 return std::make_unique<GPUSurfaceGLSkia>(
102 this, // GPU surface GL delegate
103 render_to_surface // render to surface
104 );
105}
106
107// |EmbedderSurface|
108sk_sp<GrDirectContext> EmbedderSurfaceGLSkia::CreateResourceContext() const {
109 auto callback = gl_dispatch_table_.gl_make_resource_current_callback;
110 if (callback && callback()) {
113 return context;
114 } else {
116 << "Internal error: Resource context available but could not create "
117 "a compatible Skia context.";
118 return nullptr;
119 }
120 }
121
122 // The callback was not available or failed.
124 << "Could not create a resource context for async texture uploads. "
125 "Expect degraded performance. Set a valid make_resource_current "
126 "callback on FlutterOpenGLRendererConfig.";
127 return nullptr;
128}
129
130} // namespace flutter
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition: DM.cpp:213
EmbedderSurfaceGLSkia(GLDispatchTable gl_dispatch_table, bool fbo_reset_after_present, std::shared_ptr< EmbedderExternalViewEmbedder > external_view_embedder)
std::function< void *(const char *)> GLProcResolver
virtual sk_sp< const GrGLInterface > GetGLInterface() const
static sk_sp< GrDirectContext > CreateCompatibleResourceLoadingContext(GrBackendApi backend, const sk_sp< const GrGLInterface > &gl_interface)
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
#define FML_LOG(severity)
Definition: logging.h:82
unsigned useCenter Optional< SkMatrix > matrix
Definition: SkRecords.h:258
Definition: ref_ptr.h:256
std::function< GLFBOInfo(intptr_t)> gl_populate_existing_damage
std::function< intptr_t(GLFrameInfo)> gl_fbo_callback
std::function< bool(GLPresentInfo)> gl_present_callback
std::function< void *(const char *)> gl_proc_resolver
std::function< SkMatrix(void)> gl_surface_transformation_callback
#define ERROR(message)
Definition: elf_loader.cc:260