1 /* 2 * Copyright 2021 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "experimental/graphite/src/Renderer.h" 9 10 #include "experimental/graphite/src/geom/Shape.h" 11 #include "src/gpu/BufferWriter.h" 12 13 namespace skgpu { 14 15 namespace { 16 17 // TODO: Hand off to csmartdalton, this should roughly correspond to the fStencilFanProgram and 18 // simple triangulator shader stage of the skgpu::v1::PathStencilCoverOp 19 /* 20 class StencilFanRenderStep : public RenderStep { 21 public: 22 StencilFanRenderStep() {} 23 24 ~StencilFanRenderStep() override {} 25 26 const char* name() const override { return "stencil-fan"; } 27 bool requiresStencil() const override { return true; } 28 bool requiresMSAA() const override { return true; } 29 bool performsShading() const override { return false; } 30 31 private: 32 }; 33 */ 34 35 // TODO: Hand off to csmartdalton, this should roughly correspond to the fStencilPathProgram stage 36 // of skgpu::v1::PathStencilCoverOp using the PathCurveTessellator 37 /* 38 class StencilCurvesRenderStep : public RenderStep { 39 public: 40 StencilCurvesRenderStep() {} 41 42 ~StencilCurvesRenderStep() override {} 43 44 const char* name() const override { return "stencil-curves"; } 45 bool requiresStencil() const override { return true; } 46 bool requiresMSAA() const override { return true; } 47 bool performsShading() const override { return false; } 48 49 private: 50 }; 51 */ 52 53 // TODO: Hand off to csmartdalton, this should roughly correspond to the fCoverBBoxProgram stage 54 // of skgpu::v1::PathStencilCoverOp. 55 class FillBoundsRenderStep : public RenderStep { 56 public: FillBoundsRenderStep()57 FillBoundsRenderStep() {} 58 59 ~FillBoundsRenderStep() override {} 60 61 const char* name() const override { return "fill-bounds"; } 62 // TODO: true when combined with a stencil step 63 bool requiresStencil() const override { return false; } 64 bool requiresMSAA() const override { return false; } 65 bool performsShading() const override { return true; } 66 67 size_t requiredVertexSpace(const Shape&) const override { 68 return 8 * sizeof(float); 69 } 70 71 size_t requiredIndexSpace(const Shape&) const override { 72 return 0; 73 } 74 75 void writeVertices(VertexWriter vertexWriter, 76 IndexWriter indexWriter, 77 const Shape& shape) const override { 78 vertexWriter.writeQuad(VertexWriter::TriStripFromRect(shape.bounds().asSkRect())); 79 } 80 81 82 private: 83 }; 84 85 } // anonymous namespace 86 StencilAndFillPath()87const Renderer& Renderer::StencilAndFillPath() { 88 // TODO: Uncomment and include in kRenderer to draw flattened paths instead of bboxes 89 // static const StencilFanRenderStep kStencilFan; 90 // TODO: Uncomment and include in kRenderer to draw curved paths 91 // static const StencilCurvesRenderStep kStencilCurves; 92 // TODO: This could move into a header and be reused across renderers 93 static const FillBoundsRenderStep kCover; 94 static const Renderer kRenderer("stencil-and-fill", 95 /*&kStencilFan,*/ /*&kStencilCurves,*/ &kCover); 96 97 return kRenderer; 98 } 99 100 } // namespace skgpu 101