@@ -76,57 +76,42 @@ bool SweepGradientContents::RenderSSBO(const ContentContext& renderer,
76
76
using VS = SweepGradientSSBOFillPipeline::VertexShader;
77
77
using FS = SweepGradientSSBOFillPipeline::FragmentShader;
78
78
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
-
95
79
VS::FrameInfo frame_info;
96
- frame_info.depth = entity.GetShaderClipDepth ();
97
- frame_info.mvp = pass.GetOrthographicTransform () * entity.GetTransform ();
98
80
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);
117
81
VS::BindFrameInfo (pass,
118
82
renderer.GetTransientsBuffer ().EmplaceUniform (frame_info));
119
83
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
+ });
130
115
}
131
116
132
117
bool SweepGradientContents::RenderTexture (const ContentContext& renderer,
@@ -142,59 +127,44 @@ bool SweepGradientContents::RenderTexture(const ContentContext& renderer,
142
127
return false ;
143
128
}
144
129
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
-
159
130
VS::FrameInfo frame_info;
160
- frame_info.depth = entity.GetShaderClipDepth ();
161
- frame_info.mvp = geometry_result.transform ;
162
131
frame_info.matrix = GetInverseEffectTransform ();
163
132
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
+ });
198
168
}
199
169
200
170
bool SweepGradientContents::ApplyColorFilter (
0 commit comments