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

Commit ccd8718

Browse files
committed
Migrate SweepGradientContents
1 parent ffd2196 commit ccd8718

File tree

1 file changed

+66
-96
lines changed

1 file changed

+66
-96
lines changed

impeller/entity/contents/sweep_gradient_contents.cc

Lines changed: 66 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -76,57 +76,42 @@ bool SweepGradientContents::RenderSSBO(const ContentContext& renderer,
7676
using VS = SweepGradientSSBOFillPipeline::VertexShader;
7777
using FS = SweepGradientSSBOFillPipeline::FragmentShader;
7878

79-
FS::FragInfo frag_info;
80-
frag_info.center = center_;
81-
frag_info.bias = bias_;
82-
frag_info.scale = scale_;
83-
frag_info.tile_mode = static_cast<Scalar>(tile_mode_);
84-
frag_info.decal_border_color = decal_border_color_;
85-
frag_info.alpha = GetOpacityFactor();
86-
87-
auto& host_buffer = renderer.GetTransientsBuffer();
88-
auto colors = CreateGradientColors(colors_, stops_);
89-
90-
frag_info.colors_length = colors.size();
91-
auto color_buffer =
92-
host_buffer.Emplace(colors.data(), colors.size() * sizeof(StopData),
93-
DefaultUniformAlignment());
94-
9579
VS::FrameInfo frame_info;
96-
frame_info.depth = entity.GetShaderClipDepth();
97-
frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform();
9880
frame_info.matrix = GetInverseEffectTransform();
99-
100-
auto geometry_result =
101-
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
102-
103-
auto options = OptionsFromPassAndEntity(pass, entity);
104-
if (geometry_result.prevent_overdraw) {
105-
options.stencil_mode =
106-
ContentContextOptions::StencilMode::kLegacyClipIncrement;
107-
}
108-
options.primitive_type = geometry_result.type;
109-
110-
pass.SetCommandLabel("SweepGradientSSBOFill");
111-
pass.SetStencilReference(entity.GetClipDepth());
112-
pass.SetPipeline(renderer.GetSweepGradientSSBOFillPipeline(options));
113-
pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
114-
FS::BindFragInfo(pass,
115-
renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
116-
FS::BindColorData(pass, color_buffer);
11781
VS::BindFrameInfo(pass,
11882
renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
11983

120-
if (!pass.Draw().ok()) {
121-
return false;
122-
}
123-
124-
if (geometry_result.prevent_overdraw) {
125-
auto restore = ClipRestoreContents();
126-
restore.SetRestoreCoverage(GetCoverage(entity));
127-
return restore.Render(renderer, entity, pass);
128-
}
129-
return true;
84+
PipelineBuilderCallback pipeline_callback =
85+
[&renderer](ContentContextOptions options) {
86+
return renderer.GetSweepGradientSSBOFillPipeline(options);
87+
};
88+
return ColorSourceContents::DrawPositions<VS>(
89+
renderer, entity, pass, pipeline_callback, frame_info,
90+
[this, &renderer](RenderPass& pass) {
91+
FS::FragInfo frag_info;
92+
frag_info.center = center_;
93+
frag_info.bias = bias_;
94+
frag_info.scale = scale_;
95+
frag_info.tile_mode = static_cast<Scalar>(tile_mode_);
96+
frag_info.decal_border_color = decal_border_color_;
97+
frag_info.alpha = GetOpacityFactor();
98+
99+
auto& host_buffer = renderer.GetTransientsBuffer();
100+
auto colors = CreateGradientColors(colors_, stops_);
101+
102+
frag_info.colors_length = colors.size();
103+
auto color_buffer =
104+
host_buffer.Emplace(colors.data(), colors.size() * sizeof(StopData),
105+
DefaultUniformAlignment());
106+
107+
pass.SetCommandLabel("SweepGradientSSBOFill");
108+
109+
FS::BindFragInfo(
110+
pass, renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
111+
FS::BindColorData(pass, color_buffer);
112+
113+
return true;
114+
});
130115
}
131116

132117
bool SweepGradientContents::RenderTexture(const ContentContext& renderer,
@@ -142,59 +127,44 @@ bool SweepGradientContents::RenderTexture(const ContentContext& renderer,
142127
return false;
143128
}
144129

145-
FS::FragInfo frag_info;
146-
frag_info.center = center_;
147-
frag_info.bias = bias_;
148-
frag_info.scale = scale_;
149-
frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
150-
frag_info.tile_mode = static_cast<Scalar>(tile_mode_);
151-
frag_info.decal_border_color = decal_border_color_;
152-
frag_info.alpha = GetOpacityFactor();
153-
frag_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
154-
0.5 / gradient_texture->GetSize().height);
155-
156-
auto geometry_result =
157-
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
158-
159130
VS::FrameInfo frame_info;
160-
frame_info.depth = entity.GetShaderClipDepth();
161-
frame_info.mvp = geometry_result.transform;
162131
frame_info.matrix = GetInverseEffectTransform();
163132

164-
auto options = OptionsFromPassAndEntity(pass, entity);
165-
if (geometry_result.prevent_overdraw) {
166-
options.stencil_mode =
167-
ContentContextOptions::StencilMode::kLegacyClipIncrement;
168-
}
169-
options.primitive_type = geometry_result.type;
170-
171-
SamplerDescriptor sampler_desc;
172-
sampler_desc.min_filter = MinMagFilter::kLinear;
173-
sampler_desc.mag_filter = MinMagFilter::kLinear;
174-
175-
pass.SetCommandLabel("SweepGradientFill");
176-
pass.SetStencilReference(entity.GetClipDepth());
177-
pass.SetPipeline(renderer.GetSweepGradientFillPipeline(options));
178-
pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer));
179-
180-
FS::BindFragInfo(pass,
181-
renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
182-
VS::BindFrameInfo(pass,
183-
renderer.GetTransientsBuffer().EmplaceUniform(frame_info));
184-
FS::BindTextureSampler(
185-
pass, gradient_texture,
186-
renderer.GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
187-
188-
if (!pass.Draw().ok()) {
189-
return false;
190-
}
191-
192-
if (geometry_result.prevent_overdraw) {
193-
auto restore = ClipRestoreContents();
194-
restore.SetRestoreCoverage(GetCoverage(entity));
195-
return restore.Render(renderer, entity, pass);
196-
}
197-
return true;
133+
PipelineBuilderCallback pipeline_callback =
134+
[&renderer](ContentContextOptions options) {
135+
return renderer.GetSweepGradientFillPipeline(options);
136+
};
137+
return ColorSourceContents::DrawPositions<VS>(
138+
renderer, entity, pass, pipeline_callback, frame_info,
139+
[this, &renderer, &gradient_texture](RenderPass& pass) {
140+
FS::FragInfo frag_info;
141+
frag_info.center = center_;
142+
frag_info.bias = bias_;
143+
frag_info.scale = scale_;
144+
frag_info.texture_sampler_y_coord_scale =
145+
gradient_texture->GetYCoordScale();
146+
frag_info.tile_mode = static_cast<Scalar>(tile_mode_);
147+
frag_info.decal_border_color = decal_border_color_;
148+
frag_info.alpha = GetOpacityFactor();
149+
frag_info.half_texel =
150+
Vector2(0.5 / gradient_texture->GetSize().width,
151+
0.5 / gradient_texture->GetSize().height);
152+
153+
SamplerDescriptor sampler_desc;
154+
sampler_desc.min_filter = MinMagFilter::kLinear;
155+
sampler_desc.mag_filter = MinMagFilter::kLinear;
156+
157+
pass.SetCommandLabel("SweepGradientFill");
158+
159+
FS::BindFragInfo(
160+
pass, renderer.GetTransientsBuffer().EmplaceUniform(frag_info));
161+
FS::BindTextureSampler(
162+
pass, gradient_texture,
163+
renderer.GetContext()->GetSamplerLibrary()->GetSampler(
164+
sampler_desc));
165+
166+
return true;
167+
});
198168
}
199169

200170
bool SweepGradientContents::ApplyColorFilter(

0 commit comments

Comments
 (0)