Skip to content

Commit e478f1b

Browse files
author
Jonah Williams
authored
[Impeller] Add support to embedder for Impeller on GL (via Angle on Windows). (flutter#43388)
Actually works now, though there is some issue with the default fbo stencil so I've filled flutter#130048 Other issues: * ~~Rendering looks wrong~~ * ~~Resizing window hangs~~ * ~~Reactor isn't set up correctly and all blit passes are currently failing.~~ * ~~Needs to handle falling back to sample count of 1 like we do on Android~~.
1 parent 8d03c4f commit e478f1b

20 files changed

+548
-65
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2822,6 +2822,8 @@ ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface.cc + ../../../
28222822
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface.h + ../../../flutter/LICENSE
28232823
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl.cc + ../../../flutter/LICENSE
28242824
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl.h + ../../../flutter/LICENSE
2825+
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc + ../../../flutter/LICENSE
2826+
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.h + ../../../flutter/LICENSE
28252827
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal.h + ../../../flutter/LICENSE
28262828
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal.mm + ../../../flutter/LICENSE
28272829
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.h + ../../../flutter/LICENSE
@@ -5526,6 +5528,8 @@ FILE: ../../../flutter/shell/platform/embedder/embedder_surface.cc
55265528
FILE: ../../../flutter/shell/platform/embedder/embedder_surface.h
55275529
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl.cc
55285530
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl.h
5531+
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.cc
5532+
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_gl_impeller.h
55295533
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal.h
55305534
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal.mm
55315535
FILE: ../../../flutter/shell/platform/embedder/embedder_surface_metal_impeller.h

impeller/renderer/backend/gles/render_pass_gles.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@ struct RenderPassData {
454454

455455
if (gl.DiscardFramebufferEXT.IsAvailable()) {
456456
std::vector<GLenum> attachments;
457+
457458
if (pass_data.discard_color_attachment) {
458459
attachments.push_back(is_default_fbo ? GL_COLOR_EXT
459460
: GL_COLOR_ATTACHMENT0);
@@ -462,7 +463,15 @@ struct RenderPassData {
462463
attachments.push_back(is_default_fbo ? GL_DEPTH_EXT
463464
: GL_DEPTH_ATTACHMENT);
464465
}
466+
467+
// TODO(jonahwilliams): discarding the stencil on the default fbo when running
468+
// on Windows causes Angle to discard the entire render target. Until we know
469+
// the reason, default to storing.
470+
#ifdef FML_OS_WIN
471+
if (pass_data.discard_stencil_attachment && !is_default_fbo) {
472+
#else
465473
if (pass_data.discard_stencil_attachment) {
474+
#endif
466475
attachments.push_back(is_default_fbo ? GL_STENCIL_EXT
467476
: GL_STENCIL_ATTACHMENT);
468477
}

shell/common/rasterizer.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,6 @@ RasterStatus Rasterizer::DrawToSurfaceUnsafe(
552552

553553
auto root_surface_canvas =
554554
embedder_root_canvas ? embedder_root_canvas : frame->Canvas();
555-
556555
auto compositor_frame = compositor_context_->AcquireFrame(
557556
surface_->GetContext(), // skia GrContext
558557
root_surface_canvas, // root surface canvas

shell/gpu/gpu_surface_gl_delegate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class GPUSurfaceGLDelegate {
5858
virtual std::unique_ptr<GLContextResult> GLContextMakeCurrent() = 0;
5959

6060
// Called to clear the current GL context on the thread. This may be called on
61-
// either the GPU or IO threads.
61+
// either the Raster or IO threads.
6262
virtual bool GLContextClearCurrent() = 0;
6363

6464
// Inform the GL Context that there's going to be no writing beyond

shell/gpu/gpu_surface_gl_impeller.cc

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
6161
delegate = delegate_]() -> bool {
6262
if (weak) {
6363
GLPresentInfo present_info = {
64-
.fbo_id = 0,
64+
.fbo_id = 0u,
6565
.frame_damage = std::nullopt,
6666
// TODO (https://github.com/flutter/flutter/issues/105597): wire-up
6767
// presentation time to impeller backend.
@@ -80,10 +80,14 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
8080
return nullptr;
8181
}
8282

83+
GLFrameInfo frame_info = {static_cast<uint32_t>(size.width()),
84+
static_cast<uint32_t>(size.height())};
85+
const GLFBOInfo fbo_info = delegate_->GLContextFBO(frame_info);
86+
8387
auto surface = impeller::SurfaceGLES::WrapFBO(
8488
impeller_context_, // context
8589
swap_callback, // swap_callback
86-
0u, // fbo
90+
fbo_info.fbo_id, // fbo
8791
impeller::PixelFormat::kR8G8B8A8UNormInt, // color_format
8892
impeller::ISize{size.width(), size.height()} // fbo_size
8993
);
@@ -122,12 +126,12 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceGLImpeller::AcquireFrame(
122126
});
123127

124128
return std::make_unique<SurfaceFrame>(
125-
nullptr, // surface
126-
SurfaceFrame::FramebufferInfo{}, // framebuffer info
127-
submit_callback, // submit callback
128-
size, // frame size
129-
std::move(context_switch), // context result
130-
true // display list fallback
129+
nullptr, // surface
130+
delegate_->GLContextFramebufferInfo(), // framebuffer info
131+
submit_callback, // submit callback
132+
size, // frame size
133+
std::move(context_switch), // context result
134+
true // display list fallback
131135
);
132136
}
133137

shell/platform/embedder/BUILD.gn

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,6 @@ template("embedder_source_set") {
9595
]
9696

9797
public_deps = [ ":embedder_headers" ]
98-
99-
if (embedder_enable_gl) {
100-
sources += [
101-
"embedder_external_texture_gl.cc",
102-
"embedder_external_texture_gl.h",
103-
"embedder_surface_gl.cc",
104-
"embedder_surface_gl.h",
105-
]
106-
}
107-
10898
deps = [
10999
":embedder_gpu_configuration",
110100
"//flutter/assets",
@@ -121,13 +111,33 @@ template("embedder_source_set") {
121111
"//third_party/skia",
122112
]
123113

114+
if (embedder_enable_gl) {
115+
sources += [
116+
"embedder_external_texture_gl.cc",
117+
"embedder_external_texture_gl.h",
118+
"embedder_surface_gl.cc",
119+
"embedder_surface_gl.h",
120+
]
121+
122+
if (impeller_supports_rendering) {
123+
sources += [
124+
"embedder_surface_gl_impeller.cc",
125+
"embedder_surface_gl_impeller.h",
126+
]
127+
deps += [ "//flutter/impeller/renderer/backend/gles" ]
128+
}
129+
}
130+
124131
if (impeller_supports_rendering) {
125132
sources += [
126133
"embedder_render_target_impeller.cc",
127134
"embedder_render_target_impeller.h",
128135
]
129136

130-
deps += [ "//flutter/impeller" ]
137+
deps += [
138+
"//flutter/impeller",
139+
"//flutter/impeller/renderer",
140+
]
131141
}
132142

133143
if (embedder_enable_metal) {
@@ -143,6 +153,7 @@ template("embedder_source_set") {
143153
"embedder_surface_metal_impeller.h",
144154
"embedder_surface_metal_impeller.mm",
145155
]
156+
deps += [ "//flutter/impeller/renderer/backend/metal" ]
146157
}
147158

148159
cflags_objc = flutter_cflags_objc

shell/platform/embedder/embedder.cc

Lines changed: 108 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,20 @@ extern const intptr_t kPlatformStrongDillSize;
6464
#include "rapidjson/rapidjson.h"
6565
#include "rapidjson/writer.h"
6666

67+
// Note: the IMPELLER_SUPPORTS_RENDERING may be defined even when the
68+
// embedder/BUILD.gn variable impeller_supports_rendering is disabled.
6769
#ifdef SHELL_ENABLE_GL
6870
#include "flutter/shell/platform/embedder/embedder_external_texture_gl.h"
69-
#endif
71+
#ifdef IMPELLER_SUPPORTS_RENDERING
72+
#include "flutter/shell/platform/embedder/embedder_render_target_impeller.h" // nogncheck
73+
#include "flutter/shell/platform/embedder/embedder_surface_gl_impeller.h" // nogncheck
74+
#include "impeller/core/texture.h" // nogncheck
75+
#include "impeller/renderer/backend/gles/context_gles.h" // nogncheck
76+
#include "impeller/renderer/backend/gles/texture_gles.h" // nogncheck
77+
#include "impeller/renderer/context.h" // nogncheck
78+
#include "impeller/renderer/render_target.h" // nogncheck
79+
#endif // IMPELLER_SUPPORTS_RENDERING
80+
#endif // SHELL_ENABLE_GL
7081

7182
#ifdef SHELL_ENABLE_METAL
7283
#include "flutter/shell/platform/embedder/embedder_surface_metal.h"
@@ -265,7 +276,8 @@ InferOpenGLPlatformViewCreationCallback(
265276
const flutter::PlatformViewEmbedder::PlatformDispatchTable&
266277
platform_dispatch_table,
267278
std::unique_ptr<flutter::EmbedderExternalViewEmbedder>
268-
external_view_embedder) {
279+
external_view_embedder,
280+
bool enable_impeller) {
269281
#ifdef SHELL_ENABLE_GL
270282
if (config->type != kOpenGL) {
271283
return nullptr;
@@ -441,15 +453,30 @@ InferOpenGLPlatformViewCreationCallback(
441453

442454
return fml::MakeCopyable(
443455
[gl_dispatch_table, fbo_reset_after_present, platform_dispatch_table,
456+
enable_impeller,
444457
external_view_embedder =
445458
std::move(external_view_embedder)](flutter::Shell& shell) mutable {
459+
std::shared_ptr<flutter::EmbedderExternalViewEmbedder> view_embedder =
460+
std::move(external_view_embedder);
461+
if (enable_impeller) {
462+
return std::make_unique<flutter::PlatformViewEmbedder>(
463+
shell, // delegate
464+
shell.GetTaskRunners(), // task runners
465+
std::make_unique<flutter::EmbedderSurfaceGLImpeller>(
466+
gl_dispatch_table, fbo_reset_after_present,
467+
view_embedder), // embedder_surface
468+
platform_dispatch_table, // embedder platform dispatch table
469+
view_embedder // external view embedder
470+
);
471+
}
446472
return std::make_unique<flutter::PlatformViewEmbedder>(
447-
shell, // delegate
448-
shell.GetTaskRunners(), // task runners
449-
gl_dispatch_table, // embedder GL dispatch table
450-
fbo_reset_after_present, // fbo reset after present
473+
shell, // delegate
474+
shell.GetTaskRunners(), // task runners
475+
std::make_unique<flutter::EmbedderSurfaceGL>(
476+
gl_dispatch_table, fbo_reset_after_present,
477+
view_embedder), // embedder_surface
451478
platform_dispatch_table, // embedder platform dispatch table
452-
std::move(external_view_embedder) // external view embedder
479+
view_embedder // external view embedder
453480
);
454481
});
455482
#else
@@ -686,7 +713,7 @@ InferPlatformViewCreationCallback(
686713
case kOpenGL:
687714
return InferOpenGLPlatformViewCreationCallback(
688715
config, user_data, platform_dispatch_table,
689-
std::move(external_view_embedder));
716+
std::move(external_view_embedder), enable_impeller);
690717
case kSoftware:
691718
return InferSoftwarePlatformViewCreationCallback(
692719
config, user_data, platform_dispatch_table,
@@ -924,6 +951,66 @@ static sk_sp<SkSurface> MakeSkSurfaceFromBackingStore(
924951
#endif
925952
}
926953

954+
static std::unique_ptr<flutter::EmbedderRenderTarget>
955+
MakeRenderTargetFromBackingStoreImpeller(
956+
FlutterBackingStore backing_store,
957+
const fml::closure& on_release,
958+
const std::shared_ptr<impeller::AiksContext>& aiks_context,
959+
const FlutterBackingStoreConfig& config,
960+
const FlutterOpenGLFramebuffer* framebuffer) {
961+
#if defined(SHELL_ENABLE_GL) && defined(IMPELLER_SUPPORTS_RENDERING)
962+
963+
const auto& gl_context =
964+
impeller::ContextGLES::Cast(*aiks_context->GetContext());
965+
const auto size = impeller::ISize(config.size.width, config.size.height);
966+
967+
impeller::TextureDescriptor color0_tex;
968+
color0_tex.type = impeller::TextureType::kTexture2D;
969+
color0_tex.format = impeller::PixelFormat::kR8G8B8A8UNormInt;
970+
color0_tex.size = size;
971+
color0_tex.usage = static_cast<impeller::TextureUsageMask>(
972+
impeller::TextureUsage::kRenderTarget);
973+
color0_tex.sample_count = impeller::SampleCount::kCount1;
974+
color0_tex.storage_mode = impeller::StorageMode::kDevicePrivate;
975+
976+
impeller::ColorAttachment color0;
977+
color0.texture = std::make_shared<impeller::TextureGLES>(
978+
gl_context.GetReactor(), color0_tex,
979+
impeller::TextureGLES::IsWrapped::kWrapped);
980+
color0.clear_color = impeller::Color::DarkSlateGray();
981+
color0.load_action = impeller::LoadAction::kClear;
982+
color0.store_action = impeller::StoreAction::kStore;
983+
984+
impeller::TextureDescriptor stencil0_tex;
985+
stencil0_tex.type = impeller::TextureType::kTexture2D;
986+
stencil0_tex.format = impeller::PixelFormat::kR8G8B8A8UNormInt;
987+
stencil0_tex.size = size;
988+
stencil0_tex.usage = static_cast<impeller::TextureUsageMask>(
989+
impeller::TextureUsage::kRenderTarget);
990+
stencil0_tex.sample_count = impeller::SampleCount::kCount1;
991+
992+
impeller::StencilAttachment stencil0;
993+
stencil0.clear_stencil = 0;
994+
stencil0.texture = std::make_shared<impeller::TextureGLES>(
995+
gl_context.GetReactor(), stencil0_tex,
996+
impeller::TextureGLES::IsWrapped::kWrapped);
997+
stencil0.load_action = impeller::LoadAction::kClear;
998+
stencil0.store_action = impeller::StoreAction::kDontCare;
999+
1000+
impeller::RenderTarget render_target_desc;
1001+
1002+
render_target_desc.SetColorAttachment(color0, framebuffer->target);
1003+
render_target_desc.SetStencilAttachment(stencil0);
1004+
1005+
return std::make_unique<flutter::EmbedderRenderTargetImpeller>(
1006+
backing_store, aiks_context,
1007+
std::make_unique<impeller::RenderTarget>(std::move(render_target_desc)),
1008+
on_release);
1009+
#else
1010+
return nullptr;
1011+
#endif
1012+
}
1013+
9271014
static std::unique_ptr<flutter::EmbedderRenderTarget>
9281015
MakeRenderTargetFromBackingStoreImpeller(
9291016
FlutterBackingStore backing_store,
@@ -1113,12 +1200,19 @@ CreateEmbedderRenderTarget(
11131200
break;
11141201
}
11151202
case kFlutterOpenGLTargetTypeFramebuffer: {
1116-
auto skia_surface = MakeSkSurfaceFromBackingStore(
1117-
context, config, &backing_store.open_gl.framebuffer);
1118-
render_target = MakeRenderTargetFromSkSurface(
1119-
backing_store, std::move(skia_surface),
1120-
collect_callback.Release());
1121-
break;
1203+
if (enable_impeller) {
1204+
render_target = MakeRenderTargetFromBackingStoreImpeller(
1205+
backing_store, collect_callback.Release(), aiks_context, config,
1206+
&backing_store.open_gl.framebuffer);
1207+
break;
1208+
} else {
1209+
auto skia_surface = MakeSkSurfaceFromBackingStore(
1210+
context, config, &backing_store.open_gl.framebuffer);
1211+
render_target = MakeRenderTargetFromSkSurface(
1212+
backing_store, std::move(skia_surface),
1213+
collect_callback.Release());
1214+
break;
1215+
}
11221216
}
11231217
}
11241218
break;

0 commit comments

Comments
 (0)