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