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