Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 7a55478

Browse files
[Impeller] wire up bdf and blend detection in experimental canvas. (#53151)
Use the flags in #53104 + context capabilities to determine if we need to begin the first pass as an offscreen. Part of flutter/flutter#142054
1 parent 3dd4015 commit 7a55478

File tree

6 files changed

+33
-14
lines changed

6 files changed

+33
-14
lines changed

impeller/display_list/dl_dispatcher.cc

+20-5
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
#include "impeller/display_list/dl_vertices_geometry.h"
1919
#include "impeller/display_list/nine_patch_converter.h"
2020
#include "impeller/display_list/skia_conversions.h"
21+
#include "impeller/entity/contents/content_context.h"
2122
#include "impeller/entity/contents/filters/filter_contents.h"
2223
#include "impeller/entity/contents/filters/inputs/filter_input.h"
2324
#include "impeller/entity/contents/runtime_effect_contents.h"
2425
#include "impeller/entity/entity.h"
26+
#include "impeller/geometry/color.h"
2527
#include "impeller/geometry/path.h"
2628
#include "impeller/geometry/path_builder.h"
2729
#include "impeller/geometry/scalar.h"
@@ -1170,11 +1172,24 @@ Canvas& DlDispatcher::GetCanvas() {
11701172
return canvas_;
11711173
}
11721174

1173-
ExperimentalDlDispatcher::ExperimentalDlDispatcher(ContentContext& renderer,
1174-
RenderTarget& render_target,
1175-
bool requires_readback,
1176-
IRect cull_rect)
1177-
: canvas_(renderer, render_target, requires_readback, cull_rect) {}
1175+
static bool RequiresReadbackForBlends(
1176+
const ContentContext& renderer,
1177+
flutter::DlBlendMode max_root_blend_mode) {
1178+
return !renderer.GetDeviceCapabilities().SupportsFramebufferFetch() &&
1179+
ToBlendMode(max_root_blend_mode) > Entity::kLastPipelineBlendMode;
1180+
}
1181+
1182+
ExperimentalDlDispatcher::ExperimentalDlDispatcher(
1183+
ContentContext& renderer,
1184+
RenderTarget& render_target,
1185+
bool has_root_backdrop_filter,
1186+
flutter::DlBlendMode max_root_blend_mode,
1187+
IRect cull_rect)
1188+
: canvas_(renderer,
1189+
render_target,
1190+
has_root_backdrop_filter ||
1191+
RequiresReadbackForBlends(renderer, max_root_blend_mode),
1192+
cull_rect) {}
11781193

11791194
Canvas& ExperimentalDlDispatcher::GetCanvas() {
11801195
return canvas_;

impeller/display_list/dl_dispatcher.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "impeller/aiks/experimental_canvas.h"
1313
#include "impeller/aiks/paint.h"
1414
#include "impeller/entity/contents/content_context.h"
15+
#include "impeller/geometry/color.h"
1516

1617
namespace impeller {
1718

@@ -291,7 +292,8 @@ class ExperimentalDlDispatcher : public DlDispatcherBase {
291292
public:
292293
ExperimentalDlDispatcher(ContentContext& renderer,
293294
RenderTarget& render_target,
294-
bool requires_readback,
295+
bool has_root_backdrop_filter,
296+
flutter::DlBlendMode max_root_blend_mode,
295297
IRect cull_rect);
296298

297299
~ExperimentalDlDispatcher() = default;

impeller/display_list/dl_playground.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ bool DlPlayground::OpenPlaygroundHere(DisplayListPlaygroundCallback callback) {
5555
list->Dispatch(collector);
5656

5757
ExperimentalDlDispatcher impeller_dispatcher(
58-
context.GetContentContext(), render_target, IRect::MakeMaximum());
58+
context.GetContentContext(), render_target,
59+
display_list->root_has_backdrop_filter(),
60+
display_list->max_root_blend_mode(), IRect::MakeMaximum());
5961
list->Dispatch(impeller_dispatcher);
6062
impeller_dispatcher.FinishRecording();
6163
context.GetContentContext().GetTransientsBuffer().Reset();

shell/gpu/gpu_surface_metal_impeller.mm

+3-3
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,6 @@
164164

165165
impeller::IRect cull_rect = surface->coverage();
166166
SkIRect sk_cull_rect = SkIRect::MakeWH(cull_rect.GetWidth(), cull_rect.GetHeight());
167-
[[maybe_unused]] auto supports_readback =
168-
surface_frame.framebuffer_info().supports_readback;
169167

170168
#if ENABLE_EXPERIMENTAL_CANVAS
171169
impeller::TextFrameDispatcher collector(aiks_context->GetContentContext(),
@@ -176,7 +174,9 @@
176174
fml::MakeCopyable([aiks_context, &display_list, &cull_rect,
177175
&sk_cull_rect](impeller::RenderTarget& render_target) -> bool {
178176
impeller::ExperimentalDlDispatcher impeller_dispatcher(
179-
aiks_context->GetContentContext(), render_target, supports_readback, cull_rect);
177+
aiks_context->GetContentContext(), render_target,
178+
display_list->root_has_backdrop_filter(), display_list->max_root_blend_mode(),
179+
cull_rect);
180180
display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
181181
impeller_dispatcher.FinishRecording();
182182
aiks_context->GetContentContext().GetTransientsBuffer().Reset();

shell/gpu/gpu_surface_vulkan_impeller.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
8484

8585
auto cull_rect =
8686
surface->GetTargetRenderPassDescriptor().GetRenderTargetSize();
87-
[[maybe_unused]] auto supports_readback =
88-
surface_frame.framebuffer_info().supports_readback;
8987

9088
return renderer->Render(
9189
std::move(surface),
@@ -99,7 +97,8 @@ std::unique_ptr<SurfaceFrame> GPUSurfaceVulkanImpeller::AcquireFrame(
9997
SkIRect::MakeWH(cull_rect.width, cull_rect.height));
10098
impeller::ExperimentalDlDispatcher impeller_dispatcher(
10199
aiks_context->GetContentContext(), render_target,
102-
supports_readback,
100+
display_list->root_has_backdrop_filter(),
101+
display_list->max_root_blend_mode(),
103102
impeller::IRect::RoundOut(
104103
impeller::Rect::MakeSize(cull_rect)));
105104
display_list->Dispatch(

shell/platform/embedder/embedder_external_view.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ bool EmbedderExternalView::Render(const EmbedderRenderTarget& render_target,
117117

118118
impeller::ExperimentalDlDispatcher impeller_dispatcher(
119119
aiks_context->GetContentContext(), *impeller_target,
120-
/*supports_readback=*/false, cull_rect);
120+
display_list->root_has_backdrop_filter(),
121+
display_list->max_root_blend_mode(), cull_rect);
121122
display_list->Dispatch(impeller_dispatcher, sk_cull_rect);
122123
impeller_dispatcher.FinishRecording();
123124
aiks_context->GetContentContext().GetTransientsBuffer().Reset();

0 commit comments

Comments
 (0)