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 13namespace skgpu { 14 15namespace { 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/* 20class StencilFanRenderStep : public RenderStep { 21public: 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 31private: 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/* 38class StencilCurvesRenderStep : public RenderStep { 39public: 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 49private: 50}; 51*/ 52 53// TODO: Hand off to csmartdalton, this should roughly correspond to the fCoverBBoxProgram stage 54// of skgpu::v1::PathStencilCoverOp. 55class FillBoundsRenderStep : public RenderStep { 56public: 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 82private: 83}; 84 85} // anonymous namespace 86 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