Skip to content

Commit 655e604

Browse files
Jonah Williamszhongwuzw
authored andcommitted
[Impeller] convert most filters to utilize entities instead of subpasses (flutter#40973)
[Impeller] convert most filters to utilize entities instead of subpasses
1 parent 7c389b9 commit 655e604

16 files changed

Lines changed: 389 additions & 295 deletions

impeller/entity/contents/filters/border_mask_blur_filter_contents.cc

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "impeller/entity/contents/filters/border_mask_blur_filter_contents.h"
66
#include "impeller/entity/contents/content_context.h"
77

8+
#include "impeller/entity/contents/anonymous_contents.h"
89
#include "impeller/entity/contents/contents.h"
910
#include "impeller/renderer/render_pass.h"
1011
#include "impeller/renderer/sampler_library.h"
@@ -68,50 +69,61 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(
6869
if (!input_snapshot.has_value()) {
6970
return std::nullopt;
7071
}
72+
7173
auto maybe_input_uvs = input_snapshot->GetCoverageUVs(coverage);
7274
if (!maybe_input_uvs.has_value()) {
7375
return std::nullopt;
7476
}
7577
auto input_uvs = maybe_input_uvs.value();
7678

7779
//----------------------------------------------------------------------------
78-
/// Render to texture.
80+
/// Create AnonymousContents for rendering.
7981
///
8082

81-
ContentContext::SubpassCallback callback = [&](const ContentContext& renderer,
82-
RenderPass& pass) {
83+
auto sigma = effect_transform * Vector2(sigma_x_.sigma, sigma_y_.sigma);
84+
RenderProc render_proc = [coverage, input_snapshot, input_uvs = input_uvs,
85+
src_color_factor = src_color_factor_,
86+
inner_blur_factor = inner_blur_factor_,
87+
outer_blur_factor = outer_blur_factor_, sigma](
88+
const ContentContext& renderer,
89+
const Entity& entity, RenderPass& pass) -> bool {
8390
auto& host_buffer = pass.GetTransientsBuffer();
8491

8592
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
8693
vtx_builder.AddVertices({
87-
{Point(0, 0), input_uvs[0]},
88-
{Point(1, 0), input_uvs[1]},
89-
{Point(1, 1), input_uvs[3]},
90-
{Point(0, 0), input_uvs[0]},
91-
{Point(1, 1), input_uvs[3]},
92-
{Point(0, 1), input_uvs[2]},
94+
{coverage.origin, input_uvs[0]},
95+
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
96+
input_uvs[1]},
97+
{{coverage.origin.x + coverage.size.width,
98+
coverage.origin.y + coverage.size.height},
99+
input_uvs[3]},
100+
{coverage.origin, input_uvs[0]},
101+
{{coverage.origin.x + coverage.size.width,
102+
coverage.origin.y + coverage.size.height},
103+
input_uvs[3]},
104+
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
105+
input_uvs[2]},
93106
});
94107
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
95108

96109
Command cmd;
97110
cmd.label = "Border Mask Blur Filter";
98-
auto options = OptionsFromPass(pass);
99-
options.blend_mode = BlendMode::kSource;
111+
auto options = OptionsFromPassAndEntity(pass, entity);
112+
100113
cmd.pipeline = renderer.GetBorderMaskBlurPipeline(options);
101114
cmd.BindVertices(vtx_buffer);
115+
cmd.stencil_reference = entity.GetStencilDepth();
102116

103117
VS::FrameInfo frame_info;
104-
frame_info.mvp = Matrix::MakeOrthographic(ISize(1, 1));
118+
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
105119
frame_info.texture_sampler_y_coord_scale =
106120
input_snapshot->texture->GetYCoordScale();
107121

108-
auto sigma = effect_transform * Vector2(sigma_x_.sigma, sigma_y_.sigma);
109-
110122
FS::FragInfo frag_info;
111123
frag_info.sigma_uv = sigma.Abs() / input_snapshot->texture->GetSize();
112-
frag_info.src_factor = src_color_factor_;
113-
frag_info.inner_blur_factor = inner_blur_factor_;
114-
frag_info.outer_blur_factor = outer_blur_factor_;
124+
frag_info.src_factor = src_color_factor;
125+
frag_info.inner_blur_factor = inner_blur_factor;
126+
frag_info.outer_blur_factor = outer_blur_factor;
115127

116128
FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
117129
VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
@@ -122,17 +134,19 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(
122134
return pass.AddCommand(std::move(cmd));
123135
};
124136

125-
auto out_texture = renderer.MakeSubpass("Border Mask Blur Filter",
126-
ISize(coverage.size), callback);
127-
if (!out_texture) {
128-
return std::nullopt;
129-
}
137+
CoverageProc coverage_proc =
138+
[coverage](const Entity& entity) -> std::optional<Rect> {
139+
return coverage;
140+
};
141+
142+
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
130143

131-
return Entity::FromSnapshot(
132-
Snapshot{.texture = out_texture,
133-
.transform = Matrix::MakeTranslation(coverage.origin),
134-
.opacity = input_snapshot->opacity},
135-
entity.GetBlendMode(), entity.GetStencilDepth());
144+
Entity sub_entity;
145+
sub_entity.SetContents(std::move(contents));
146+
sub_entity.SetStencilDepth(entity.GetStencilDepth());
147+
sub_entity.SetTransformation(entity.GetTransformation());
148+
sub_entity.SetBlendMode(entity.GetBlendMode());
149+
return sub_entity;
136150
}
137151

138152
std::optional<Rect> BorderMaskBlurFilterContents::GetFilterCoverage(

impeller/entity/contents/filters/color_matrix_filter_contents.cc

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <optional>
88

9+
#include "impeller/entity/contents/anonymous_contents.h"
910
#include "impeller/entity/contents/content_context.h"
1011
#include "impeller/entity/contents/contents.h"
1112
#include "impeller/geometry/point.h"
@@ -46,38 +47,45 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
4647
}
4748

4849
//----------------------------------------------------------------------------
49-
/// Render to texture.
50+
/// Create AnonymousContents for rendering.
5051
///
51-
52-
ContentContext::SubpassCallback callback = [&](const ContentContext& renderer,
53-
RenderPass& pass) {
52+
RenderProc render_proc = [input_snapshot, color_matrix = matrix_, coverage,
53+
absorb_opacity = GetAbsorbOpacity()](
54+
const ContentContext& renderer,
55+
const Entity& entity, RenderPass& pass) -> bool {
5456
Command cmd;
5557
cmd.label = "Color Matrix Filter";
58+
cmd.stencil_reference = entity.GetStencilDepth();
5659

57-
auto options = OptionsFromPass(pass);
58-
options.blend_mode = BlendMode::kSource;
60+
auto options = OptionsFromPassAndEntity(pass, entity);
5961
cmd.pipeline = renderer.GetColorMatrixColorFilterPipeline(options);
6062

6163
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
6264
vtx_builder.AddVertices({
63-
{Point(0, 0)},
64-
{Point(1, 0)},
65-
{Point(1, 1)},
66-
{Point(0, 0)},
67-
{Point(1, 1)},
68-
{Point(0, 1)},
65+
{coverage.origin, Point(0, 0)},
66+
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
67+
Point(1, 0)},
68+
{{coverage.origin.x + coverage.size.width,
69+
coverage.origin.y + coverage.size.height},
70+
Point(1, 1)},
71+
{coverage.origin, Point(0, 0)},
72+
{{coverage.origin.x + coverage.size.width,
73+
coverage.origin.y + coverage.size.height},
74+
Point(1, 1)},
75+
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
76+
Point(0, 1)},
6977
});
7078
auto& host_buffer = pass.GetTransientsBuffer();
7179
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
7280
cmd.BindVertices(vtx_buffer);
7381

7482
VS::FrameInfo frame_info;
75-
frame_info.mvp = Matrix::MakeOrthographic(ISize(1, 1));
83+
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
7684
frame_info.texture_sampler_y_coord_scale =
7785
input_snapshot->texture->GetYCoordScale();
7886

7987
FS::FragInfo frag_info;
80-
const float* matrix = matrix_.array;
88+
const float* matrix = color_matrix.array;
8189
frag_info.color_v = Vector4(matrix[4], matrix[9], matrix[14], matrix[19]);
8290
// clang-format off
8391
frag_info.color_m = Matrix(
@@ -87,7 +95,7 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
8795
matrix[3], matrix[8], matrix[13], matrix[18]
8896
);
8997
// clang-format on
90-
frag_info.input_alpha = GetAbsorbOpacity() ? input_snapshot->opacity : 1.0f;
98+
frag_info.input_alpha = absorb_opacity ? input_snapshot->opacity : 1.0f;
9199
auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler({});
92100
FS::BindInputTexture(cmd, input_snapshot->texture, sampler);
93101
FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
@@ -97,18 +105,20 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
97105
return pass.AddCommand(std::move(cmd));
98106
};
99107

100-
auto out_texture = renderer.MakeSubpass(
101-
"Color Matrix Filter", input_snapshot->texture->GetSize(), callback);
102-
if (!out_texture) {
103-
return std::nullopt;
104-
}
108+
CoverageProc coverage_proc =
109+
[coverage](const Entity& entity) -> std::optional<Rect> {
110+
return coverage;
111+
};
112+
113+
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
105114

106-
return Entity::FromSnapshot(
107-
Snapshot{.texture = out_texture,
108-
.transform = input_snapshot->transform,
109-
.sampler_descriptor = input_snapshot->sampler_descriptor,
110-
.opacity = GetAbsorbOpacity() ? 1.0f : input_snapshot->opacity},
111-
entity.GetBlendMode(), entity.GetStencilDepth());
115+
Entity sub_entity;
116+
sub_entity.SetContents(std::move(contents));
117+
sub_entity.SetStencilDepth(entity.GetStencilDepth());
118+
sub_entity.SetTransformation(Matrix::MakeTranslation(coverage.origin) *
119+
entity.GetTransformation());
120+
sub_entity.SetBlendMode(entity.GetBlendMode());
121+
return sub_entity;
112122
}
113123

114124
} // namespace impeller

impeller/entity/contents/filters/linear_to_srgb_filter_contents.cc

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "impeller/entity/contents/filters/linear_to_srgb_filter_contents.h"
66

7+
#include "impeller/entity/contents/anonymous_contents.h"
78
#include "impeller/entity/contents/content_context.h"
89
#include "impeller/entity/contents/contents.h"
910
#include "impeller/geometry/point.h"
@@ -35,36 +36,53 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
3536
return std::nullopt;
3637
}
3738

38-
ContentContext::SubpassCallback callback = [&](const ContentContext& renderer,
39-
RenderPass& pass) {
39+
auto maybe_input_uvs = input_snapshot->GetCoverageUVs(coverage);
40+
if (!maybe_input_uvs.has_value()) {
41+
return std::nullopt;
42+
}
43+
auto input_uvs = maybe_input_uvs.value();
44+
45+
//----------------------------------------------------------------------------
46+
/// Create AnonymousContents for rendering.
47+
///
48+
RenderProc render_proc = [input_snapshot, coverage, input_uvs,
49+
absorb_opacity = GetAbsorbOpacity()](
50+
const ContentContext& renderer,
51+
const Entity& entity, RenderPass& pass) -> bool {
4052
Command cmd;
4153
cmd.label = "Linear to sRGB Filter";
54+
cmd.stencil_reference = entity.GetStencilDepth();
4255

43-
auto options = OptionsFromPass(pass);
44-
options.blend_mode = BlendMode::kSource;
56+
auto options = OptionsFromPassAndEntity(pass, entity);
4557
cmd.pipeline = renderer.GetLinearToSrgbFilterPipeline(options);
4658

4759
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
4860
vtx_builder.AddVertices({
49-
{Point(0, 0)},
50-
{Point(1, 0)},
51-
{Point(1, 1)},
52-
{Point(0, 0)},
53-
{Point(1, 1)},
54-
{Point(0, 1)},
61+
{coverage.origin, input_uvs[0]},
62+
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
63+
input_uvs[1]},
64+
{{coverage.origin.x + coverage.size.width,
65+
coverage.origin.y + coverage.size.height},
66+
input_uvs[3]},
67+
{coverage.origin, input_uvs[0]},
68+
{{coverage.origin.x + coverage.size.width,
69+
coverage.origin.y + coverage.size.height},
70+
input_uvs[3]},
71+
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
72+
input_uvs[2]},
5573
});
5674

5775
auto& host_buffer = pass.GetTransientsBuffer();
5876
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
5977
cmd.BindVertices(vtx_buffer);
6078

6179
VS::FrameInfo frame_info;
62-
frame_info.mvp = Matrix::MakeOrthographic(ISize(1, 1));
80+
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
6381
frame_info.texture_sampler_y_coord_scale =
6482
input_snapshot->texture->GetYCoordScale();
6583

6684
FS::FragInfo frag_info;
67-
frag_info.input_alpha = GetAbsorbOpacity() ? input_snapshot->opacity : 1.0f;
85+
frag_info.input_alpha = absorb_opacity ? input_snapshot->opacity : 1.0f;
6886

6987
auto sampler = renderer.GetContext()->GetSamplerLibrary()->GetSampler({});
7088
FS::BindInputTexture(cmd, input_snapshot->texture, sampler);
@@ -74,18 +92,19 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
7492
return pass.AddCommand(std::move(cmd));
7593
};
7694

77-
auto out_texture = renderer.MakeSubpass(
78-
"Linear to sRGB Filter", input_snapshot->texture->GetSize(), callback);
79-
if (!out_texture) {
80-
return std::nullopt;
81-
}
95+
CoverageProc coverage_proc =
96+
[coverage](const Entity& entity) -> std::optional<Rect> {
97+
return coverage;
98+
};
99+
100+
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
82101

83-
return Entity::FromSnapshot(
84-
Snapshot{.texture = out_texture,
85-
.transform = input_snapshot->transform,
86-
.sampler_descriptor = input_snapshot->sampler_descriptor,
87-
.opacity = GetAbsorbOpacity() ? 1.0f : input_snapshot->opacity},
88-
entity.GetBlendMode(), entity.GetStencilDepth());
102+
Entity sub_entity;
103+
sub_entity.SetContents(std::move(contents));
104+
sub_entity.SetStencilDepth(entity.GetStencilDepth());
105+
sub_entity.SetTransformation(entity.GetTransformation());
106+
sub_entity.SetBlendMode(entity.GetBlendMode());
107+
return sub_entity;
89108
}
90109

91110
} // namespace impeller

0 commit comments

Comments
 (0)