@@ -64,62 +64,45 @@ bool ConicalGradientContents::RenderSSBO(const ContentContext& renderer,
6464 using VS = ConicalGradientSSBOFillPipeline::VertexShader;
6565 using FS = ConicalGradientSSBOFillPipeline::FragmentShader;
6666
67- FS::FragInfo frag_info;
68- frag_info.center = center_;
69- frag_info.radius = radius_;
70- frag_info.tile_mode = static_cast <Scalar>(tile_mode_);
71- frag_info.decal_border_color = decal_border_color_;
72- frag_info.alpha = GetOpacityFactor ();
73- if (focus_) {
74- frag_info.focus = focus_.value ();
75- frag_info.focus_radius = focus_radius_;
76- } else {
77- frag_info.focus = center_;
78- frag_info.focus_radius = 0.0 ;
79- }
80-
81- auto & host_buffer = renderer.GetTransientsBuffer ();
82- auto colors = CreateGradientColors (colors_, stops_);
83-
84- frag_info.colors_length = colors.size ();
85- auto color_buffer =
86- host_buffer.Emplace (colors.data (), colors.size () * sizeof (StopData),
87- DefaultUniformAlignment ());
88-
8967 VS::FrameInfo frame_info;
90- frame_info.depth = entity.GetShaderClipDepth ();
91- frame_info.mvp = pass.GetOrthographicTransform () * entity.GetTransform ();
9268 frame_info.matrix = GetInverseEffectTransform ();
9369
94- auto geometry_result =
95- GetGeometry ()->GetPositionBuffer (renderer, entity, pass);
96- auto options = OptionsFromPassAndEntity (pass, entity);
97- if (geometry_result.prevent_overdraw ) {
98- options.stencil_mode =
99- ContentContextOptions::StencilMode::kLegacyClipIncrement ;
100- }
101- options.primitive_type = geometry_result.type ;
102-
103- pass.SetCommandLabel (" ConicalGradientSSBOFill" );
104- pass.SetStencilReference (entity.GetClipDepth ());
105- pass.SetPipeline (renderer.GetConicalGradientSSBOFillPipeline (options));
106- pass.SetVertexBuffer (std::move (geometry_result.vertex_buffer ));
107- FS::BindFragInfo (pass,
108- renderer.GetTransientsBuffer ().EmplaceUniform (frag_info));
109- FS::BindColorData (pass, color_buffer);
110- VS::BindFrameInfo (pass,
111- renderer.GetTransientsBuffer ().EmplaceUniform (frame_info));
112-
113- if (!pass.Draw ().ok ()) {
114- return false ;
115- }
116-
117- if (geometry_result.prevent_overdraw ) {
118- auto restore = ClipRestoreContents ();
119- restore.SetRestoreCoverage (GetCoverage (entity));
120- return restore.Render (renderer, entity, pass);
121- }
122- return true ;
70+ PipelineBuilderCallback pipeline_callback =
71+ [&renderer](ContentContextOptions options) {
72+ return renderer.GetConicalGradientSSBOFillPipeline (options);
73+ };
74+ return ColorSourceContents::DrawPositions<VS>(
75+ renderer, entity, pass, pipeline_callback, frame_info,
76+ [this , &renderer](RenderPass& pass) {
77+ FS::FragInfo frag_info;
78+ frag_info.center = center_;
79+ frag_info.radius = radius_;
80+ frag_info.tile_mode = static_cast <Scalar>(tile_mode_);
81+ frag_info.decal_border_color = decal_border_color_;
82+ frag_info.alpha = GetOpacityFactor ();
83+ if (focus_) {
84+ frag_info.focus = focus_.value ();
85+ frag_info.focus_radius = focus_radius_;
86+ } else {
87+ frag_info.focus = center_;
88+ frag_info.focus_radius = 0.0 ;
89+ }
90+
91+ auto & host_buffer = renderer.GetTransientsBuffer ();
92+ auto colors = CreateGradientColors (colors_, stops_);
93+
94+ frag_info.colors_length = colors.size ();
95+ auto color_buffer =
96+ host_buffer.Emplace (colors.data (), colors.size () * sizeof (StopData),
97+ DefaultUniformAlignment ());
98+
99+ FS::BindFragInfo (
100+ pass, renderer.GetTransientsBuffer ().EmplaceUniform (frag_info));
101+ FS::BindColorData (pass, color_buffer);
102+
103+ pass.SetCommandLabel (" ConicalGradientSSBOFill" );
104+ return true ;
105+ });
123106}
124107
125108bool ConicalGradientContents::RenderTexture (const ContentContext& renderer,
@@ -135,64 +118,52 @@ bool ConicalGradientContents::RenderTexture(const ContentContext& renderer,
135118 return false ;
136119 }
137120
138- FS::FragInfo frag_info;
139- frag_info.center = center_;
140- frag_info.radius = radius_;
141- frag_info.tile_mode = static_cast <Scalar>(tile_mode_);
142- frag_info.decal_border_color = decal_border_color_;
143- frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale ();
144- frag_info.alpha = GetOpacityFactor ();
145- frag_info.half_texel = Vector2 (0.5 / gradient_texture->GetSize ().width ,
146- 0.5 / gradient_texture->GetSize ().height );
147- if (focus_) {
148- frag_info.focus = focus_.value ();
149- frag_info.focus_radius = focus_radius_;
150- } else {
151- frag_info.focus = center_;
152- frag_info.focus_radius = 0.0 ;
153- }
154-
155121 auto geometry_result =
156122 GetGeometry ()->GetPositionBuffer (renderer, entity, pass);
157123
158124 VS::FrameInfo frame_info;
159- frame_info.depth = entity.GetShaderClipDepth ();
160- frame_info.mvp = geometry_result.transform ;
161125 frame_info.matrix = GetInverseEffectTransform ();
162126
163- pass.SetCommandLabel (" ConicalGradientFill" );
164- pass.SetStencilReference (entity.GetClipDepth ());
165-
166- auto options = OptionsFromPassAndEntity (pass, entity);
167- if (geometry_result.prevent_overdraw ) {
168- options.stencil_mode =
169- ContentContextOptions::StencilMode::kLegacyClipIncrement ;
170- }
171- options.primitive_type = geometry_result.type ;
172- pass.SetPipeline (renderer.GetConicalGradientFillPipeline (options));
173-
174- pass.SetVertexBuffer (std::move (geometry_result.vertex_buffer ));
175- FS::BindFragInfo (pass,
176- renderer.GetTransientsBuffer ().EmplaceUniform (frag_info));
177- SamplerDescriptor sampler_desc;
178- sampler_desc.min_filter = MinMagFilter::kLinear ;
179- sampler_desc.mag_filter = MinMagFilter::kLinear ;
180- FS::BindTextureSampler (
181- pass, gradient_texture,
182- renderer.GetContext ()->GetSamplerLibrary ()->GetSampler (sampler_desc));
183- VS::BindFrameInfo (pass,
184- renderer.GetTransientsBuffer ().EmplaceUniform (frame_info));
185-
186- if (!pass.Draw ().ok ()) {
187- return false ;
188- }
189-
190- if (geometry_result.prevent_overdraw ) {
191- auto restore = ClipRestoreContents ();
192- restore.SetRestoreCoverage (GetCoverage (entity));
193- return restore.Render (renderer, entity, pass);
194- }
195- return true ;
127+ PipelineBuilderCallback pipeline_callback =
128+ [&renderer](ContentContextOptions options) {
129+ return renderer.GetConicalGradientFillPipeline (options);
130+ };
131+ return ColorSourceContents::DrawPositions<VS>(
132+ renderer, entity, pass, pipeline_callback, frame_info,
133+ [this , &renderer, &gradient_texture](RenderPass& pass) {
134+ FS::FragInfo frag_info;
135+ frag_info.center = center_;
136+ frag_info.radius = radius_;
137+ frag_info.tile_mode = static_cast <Scalar>(tile_mode_);
138+ frag_info.decal_border_color = decal_border_color_;
139+ frag_info.texture_sampler_y_coord_scale =
140+ gradient_texture->GetYCoordScale ();
141+ frag_info.alpha = GetOpacityFactor ();
142+ frag_info.half_texel =
143+ Vector2 (0.5 / gradient_texture->GetSize ().width ,
144+ 0.5 / gradient_texture->GetSize ().height );
145+ if (focus_) {
146+ frag_info.focus = focus_.value ();
147+ frag_info.focus_radius = focus_radius_;
148+ } else {
149+ frag_info.focus = center_;
150+ frag_info.focus_radius = 0.0 ;
151+ }
152+
153+ pass.SetCommandLabel (" ConicalGradientFill" );
154+
155+ FS::BindFragInfo (
156+ pass, renderer.GetTransientsBuffer ().EmplaceUniform (frag_info));
157+ SamplerDescriptor sampler_desc;
158+ sampler_desc.min_filter = MinMagFilter::kLinear ;
159+ sampler_desc.mag_filter = MinMagFilter::kLinear ;
160+ FS::BindTextureSampler (
161+ pass, gradient_texture,
162+ renderer.GetContext ()->GetSamplerLibrary ()->GetSampler (
163+ sampler_desc));
164+
165+ return true ;
166+ });
196167}
197168
198169bool ConicalGradientContents::ApplyColorFilter (
0 commit comments