@@ -87,6 +87,7 @@ bool LinearGradientContents::Render(const ContentRenderer& renderer,
8787 Command cmd;
8888 cmd.label = " LinearGradientFill" ;
8989 cmd.pipeline = renderer.GetGradientFillPipeline ();
90+ cmd.stencil_reference = entity.GetStencilDepth ();
9091 cmd.BindVertices (vertices_builder.CreateVertexBuffer (
9192 *renderer.GetContext ()->GetPermanentsAllocator ()));
9293 cmd.primitive_type = PrimitiveType::kTriangle ;
@@ -112,6 +113,25 @@ const Color& SolidColorContents::GetColor() const {
112113 return color_;
113114}
114115
116+ static VertexBuffer CreateSolidFillVertices (const Path& path,
117+ HostBuffer& buffer) {
118+ using VS = SolidFillPipeline::VertexShader;
119+
120+ VertexBufferBuilder<VS::PerVertexData> vtx_builder;
121+
122+ auto tesselation_result = Tessellator{}.Tessellate (
123+ path.CreatePolyline (), [&vtx_builder](auto point) {
124+ VS::PerVertexData vtx;
125+ vtx.vertices = point;
126+ vtx_builder.AppendVertex (vtx);
127+ });
128+ if (!tesselation_result) {
129+ return {};
130+ }
131+
132+ return vtx_builder.CreateVertexBuffer (buffer);
133+ }
134+
115135bool SolidColorContents::Render (const ContentRenderer& renderer,
116136 const Entity& entity,
117137 const Surface& surface,
@@ -125,29 +145,9 @@ bool SolidColorContents::Render(const ContentRenderer& renderer,
125145 Command cmd;
126146 cmd.label = " SolidFill" ;
127147 cmd.pipeline = renderer.GetSolidFillPipeline ();
128- if (cmd.pipeline == nullptr ) {
129- return false ;
130- }
131-
132- VertexBufferBuilder<VS::PerVertexData> vtx_builder;
133- {
134- auto tesselation_result = Tessellator{}.Tessellate (
135- entity.GetPath ().CreatePolyline (), [&vtx_builder](auto point) {
136- VS::PerVertexData vtx;
137- vtx.vertices = point;
138- vtx_builder.AppendVertex (vtx);
139- });
140- if (!tesselation_result) {
141- return false ;
142- }
143- }
144-
145- if (!vtx_builder.HasVertices ()) {
146- return true ;
147- }
148-
149- cmd.BindVertices (vtx_builder.CreateVertexBuffer (
150- *renderer.GetContext ()->GetPermanentsAllocator ()));
148+ cmd.stencil_reference = entity.GetStencilDepth ();
149+ cmd.BindVertices (
150+ CreateSolidFillVertices (entity.GetPath (), pass.GetTransientsBuffer ()));
151151
152152 VS::FrameInfo frame_info;
153153 frame_info.mvp =
@@ -240,6 +240,7 @@ bool TextureContents::Render(const ContentRenderer& renderer,
240240 Command cmd;
241241 cmd.label = " TextureFill" ;
242242 cmd.pipeline = renderer.GetTexturePipeline ();
243+ cmd.stencil_reference = entity.GetStencilDepth ();
243244 cmd.BindVertices (vertex_builder.CreateVertexBuffer (host_buffer));
244245 VS::BindFrameInfo (cmd, host_buffer.EmplaceUniform (frame_info));
245246 FS::BindTextureSampler (
@@ -335,6 +336,7 @@ bool SolidStrokeContents::Render(const ContentRenderer& renderer,
335336 cmd.primitive_type = PrimitiveType::kTriangleStrip ;
336337 cmd.label = " SolidStroke" ;
337338 cmd.pipeline = renderer.GetSolidStrokePipeline ();
339+ cmd.stencil_reference = entity.GetStencilDepth ();
338340 cmd.BindVertices (
339341 CreateSolidStrokeVertices (entity.GetPath (), pass.GetTransientsBuffer ()));
340342 VS::BindFrameInfo (cmd, pass.GetTransientsBuffer ().EmplaceUniform (frame_info));
@@ -366,6 +368,23 @@ bool ClipContents::Render(const ContentRenderer& renderer,
366368 const Entity& entity,
367369 const Surface& surface,
368370 RenderPass& pass) const {
371+ using VS = ClipPipeline::VertexShader;
372+
373+ Command cmd;
374+ cmd.label = " Clip" ;
375+ cmd.pipeline = renderer.GetClipPipeline ();
376+ cmd.stencil_reference = entity.GetStencilDepth () + 1u ;
377+ cmd.BindVertices (
378+ CreateSolidFillVertices (entity.GetPath (), pass.GetTransientsBuffer ()));
379+
380+ VS::FrameInfo info;
381+ // The color really doesn't matter.
382+ info.color = Color::SkyBlue ();
383+ info.mvp = Matrix::MakeOrthographic (surface.GetSize ());
384+
385+ VS::BindFrameInfo (cmd, pass.GetTransientsBuffer ().EmplaceUniform (info));
386+
387+ pass.AddCommand (std::move (cmd));
369388 return true ;
370389}
371390
0 commit comments