Flutter Engine
 
Loading...
Searching...
No Matches
embedder_test_backingstore_producer_gl.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
6
9#include "third_party/skia/include/core/SkColorSpace.h"
10#include "third_party/skia/include/gpu/ganesh/GrBackendSurface.h"
11#include "third_party/skia/include/gpu/ganesh/SkSurfaceGanesh.h"
12#include "third_party/skia/include/gpu/ganesh/gl/GrGLBackendSurface.h"
13#include "third_party/skia/include/gpu/ganesh/gl/GrGLTypes.h"
14
15namespace flutter::testing {
16
17namespace {
18struct UserData {
19 sk_sp<SkSurface> surface;
20 std::unique_ptr<TestGLOnscreenOnlySurface> gl_surface;
21};
22} // namespace
23
25 sk_sp<GrDirectContext> context,
27 std::shared_ptr<TestEGLContext> egl_context)
28 : EmbedderTestBackingStoreProducer(std::move(context), type),
29 test_egl_context_(std::move(egl_context)) {}
30
32 default;
33
35 const FlutterBackingStoreConfig* config,
36 FlutterBackingStore* backing_store_out) {
37 switch (type_) {
39 return CreateTexture(config, backing_store_out);
41 return CreateFramebuffer(config, backing_store_out);
43 return CreateSurface(config, backing_store_out);
44 default:
45 return false;
46 };
47}
48
50 const FlutterBackingStore* backing_store) const {
51 UserData* user_data = reinterpret_cast<UserData*>(backing_store->user_data);
52 return user_data->surface;
53}
54
56 const FlutterBackingStore* backing_store) const {
57 UserData* user_data = reinterpret_cast<UserData*>(backing_store->user_data);
58 if (user_data->gl_surface != nullptr) {
59 // This backing store is an OpenGL Surface.
60 // We need to make it current so we can snapshot it.
61 user_data->gl_surface->MakeCurrent();
62
63 // GetRasterSurfaceSnapshot() does two
64 // gl_surface->makeImageSnapshot()'s. Doing a single
65 // ->makeImageSnapshot() will not work.
66 return user_data->gl_surface->GetRasterSurfaceSnapshot();
67 }
68
69 // Otherwise, it's a GL Texture or FrameBuffer.
70 return user_data->surface->makeImageSnapshot();
71}
72
73bool EmbedderTestBackingStoreProducerGL::CreateFramebuffer(
74 const FlutterBackingStoreConfig* config,
75 FlutterBackingStore* backing_store_out) {
76 const auto image_info =
77 SkImageInfo::MakeN32Premul(config->size.width, config->size.height);
78
79 auto surface =
80 SkSurfaces::RenderTarget(context_.get(), // context
81 skgpu::Budgeted::kNo, // budgeted
82 image_info, // image info
83 1, // sample count
84 kBottomLeft_GrSurfaceOrigin, // surface origin
85 nullptr, // surface properties
86 false // mipmaps
87 );
88
89 if (!surface) {
90 FML_LOG(ERROR) << "Could not create render target for compositor layer.";
91 return false;
92 }
93
94 GrBackendRenderTarget render_target = SkSurfaces::GetBackendRenderTarget(
95 surface.get(), SkSurfaces::BackendHandleAccess::kDiscardWrite);
96
97 if (!render_target.isValid()) {
98 FML_LOG(ERROR) << "Backend render target was invalid.";
99 return false;
100 }
101
102 GrGLFramebufferInfo framebuffer_info = {};
103 if (!GrBackendRenderTargets::GetGLFramebufferInfo(render_target,
104 &framebuffer_info)) {
105 FML_LOG(ERROR) << "Could not access backend framebuffer info.";
106 return false;
107 }
108
109 auto user_data = new UserData{.surface = surface};
110 backing_store_out->type = kFlutterBackingStoreTypeOpenGL;
111 backing_store_out->user_data = user_data;
113 backing_store_out->open_gl.framebuffer.target = framebuffer_info.fFormat;
114 backing_store_out->open_gl.framebuffer.name = framebuffer_info.fFBOID;
115 backing_store_out->open_gl.framebuffer.user_data = user_data;
116 backing_store_out->open_gl.framebuffer.destruction_callback =
117 [](void* user_data) { delete reinterpret_cast<UserData*>(user_data); };
118
119 return true;
120}
121
122bool EmbedderTestBackingStoreProducerGL::CreateTexture(
123 const FlutterBackingStoreConfig* config,
124 FlutterBackingStore* backing_store_out) {
125 const auto image_info =
126 SkImageInfo::MakeN32Premul(config->size.width, config->size.height);
127
128 auto surface =
129 SkSurfaces::RenderTarget(context_.get(), // context
130 skgpu::Budgeted::kNo, // budgeted
131 image_info, // image info
132 1, // sample count
133 kBottomLeft_GrSurfaceOrigin, // surface origin
134 nullptr, // surface properties
135 false // mipmaps
136 );
137
138 if (!surface) {
139 FML_LOG(ERROR) << "Could not create render target for compositor layer.";
140 return false;
141 }
142
143 GrBackendTexture render_texture = SkSurfaces::GetBackendTexture(
144 surface.get(), SkSurfaces::BackendHandleAccess::kDiscardWrite);
145
146 if (!render_texture.isValid()) {
147 FML_LOG(ERROR) << "Backend render texture was invalid.";
148 return false;
149 }
150
151 GrGLTextureInfo texture_info = {};
152 if (!GrBackendTextures::GetGLTextureInfo(render_texture, &texture_info)) {
153 FML_LOG(ERROR) << "Could not access backend texture info.";
154 return false;
155 }
156
157 auto user_data = new UserData{.surface = surface};
158 backing_store_out->type = kFlutterBackingStoreTypeOpenGL;
159 backing_store_out->user_data = user_data;
160 backing_store_out->open_gl.type = kFlutterOpenGLTargetTypeTexture;
161 backing_store_out->open_gl.texture.target = texture_info.fTarget;
162 backing_store_out->open_gl.texture.name = texture_info.fID;
163 backing_store_out->open_gl.texture.format = texture_info.fFormat;
164 backing_store_out->open_gl.texture.user_data = user_data;
165 backing_store_out->open_gl.texture.destruction_callback =
166 [](void* user_data) { delete reinterpret_cast<UserData*>(user_data); };
167
168 return true;
169}
170
171bool EmbedderTestBackingStoreProducerGL::CreateSurface(
172 const FlutterBackingStoreConfig* config,
173 FlutterBackingStore* backing_store_out) {
174 FML_CHECK(test_egl_context_);
175 auto surface = std::make_unique<TestGLOnscreenOnlySurface>(
176 test_egl_context_,
177 DlISize(std::round(config->size.width), std::round(config->size.height)));
178
179 auto make_current = [](void* user_data, bool* invalidate_state) -> bool {
180 *invalidate_state = false;
181 return reinterpret_cast<UserData*>(user_data)->gl_surface->MakeCurrent();
182 };
183
184 auto clear_current = [](void* user_data, bool* invalidate_state) -> bool {
185 *invalidate_state = false;
186 // return
187 // reinterpret_cast<GLUserData*>(user_data)->gl_surface->ClearCurrent();
188 return true;
189 };
190
191 auto destruction_callback = [](void* user_data) {
192 delete reinterpret_cast<UserData*>(user_data);
193 };
194
195 auto sk_surface = surface->GetOnscreenSurface();
196
197 auto user_data = new UserData{
198 .surface = sk_surface,
199 .gl_surface = std::move(surface),
200 };
201 backing_store_out->type = kFlutterBackingStoreTypeOpenGL;
202 backing_store_out->user_data = user_data;
203 backing_store_out->open_gl.type = kFlutterOpenGLTargetTypeSurface;
204 backing_store_out->open_gl.surface.user_data = user_data;
205 backing_store_out->open_gl.surface.make_current_callback = make_current;
206 backing_store_out->open_gl.surface.clear_current_callback = clear_current;
207 backing_store_out->open_gl.surface.destruction_callback =
208 destruction_callback;
209 backing_store_out->open_gl.surface.format = 0x93A1 /* GL_BGRA8_EXT */;
210
211 return true;
212}
213
214} // namespace flutter::testing
GLenum type
EmbedderTestBackingStoreProducerGL(sk_sp< GrDirectContext > context, RenderTargetType type, std::shared_ptr< TestEGLContext > egl_context)
bool Create(const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out) override
sk_sp< SkImage > MakeImageSnapshot(const FlutterBackingStore *backing_store) const override
sk_sp< SkSurface > GetSurface(const FlutterBackingStore *backing_store) const override
@ kFlutterOpenGLTargetTypeFramebuffer
Definition embedder.h:417
@ kFlutterOpenGLTargetTypeSurface
Definition embedder.h:420
@ kFlutterOpenGLTargetTypeTexture
Definition embedder.h:414
@ kFlutterBackingStoreTypeOpenGL
Definition embedder.h:2051
std::unique_ptr< TestGLOnscreenOnlySurface > gl_surface
VkSurfaceKHR surface
Definition main.cc:65
#define FML_LOG(severity)
Definition logging.h:101
#define FML_CHECK(condition)
Definition logging.h:104
impeller::ISize32 DlISize
Definition ref_ptr.h:261
FlutterSize size
The size of the render target the engine expects to render into.
Definition embedder.h:2093
FlutterBackingStoreType type
Specifies the type of backing store.
Definition embedder.h:2071
FlutterOpenGLBackingStore open_gl
The description of the OpenGL backing store.
Definition embedder.h:2077
FlutterOpenGLSurface surface
Definition embedder.h:1923
FlutterOpenGLTexture texture
A texture for Flutter to render into.
Definition embedder.h:1917
FlutterOpenGLTargetType type
Definition embedder.h:1914
FlutterOpenGLFramebuffer framebuffer
Definition embedder.h:1920
uint32_t name
The name of the framebuffer.
Definition embedder.h:544
VoidCallback destruction_callback
Definition embedder.h:551
void * user_data
User data to be returned on the invocation of the destruction callback.
Definition embedder.h:547
VoidCallback destruction_callback
Definition embedder.h:600
FlutterOpenGLSurfaceCallback clear_current_callback
Definition embedder.h:594
FlutterOpenGLSurfaceCallback make_current_callback
Definition embedder.h:577
uint32_t name
The name of the texture.
Definition embedder.h:514
VoidCallback destruction_callback
Definition embedder.h:521
void * user_data
User data to be returned on the invocation of the destruction callback.
Definition embedder.h:518
uint32_t format
The texture format (example GL_RGBA8).
Definition embedder.h:516
double height
Definition embedder.h:629
double width
Definition embedder.h:628