/*
 * Copyright 2021 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "src/gpu/graphite/Renderer.h"

#include "include/core/SkPathTypes.h"
#include "include/core/SkVertices.h"
#include "src/gpu/graphite/render/CoverBoundsRenderStep.h"
#include "src/gpu/graphite/render/MiddleOutFanRenderStep.h"
#include "src/gpu/graphite/render/StencilAndCoverDSS.h"
#include "src/gpu/graphite/render/TessellateCurvesRenderStep.h"
#include "src/gpu/graphite/render/TessellateWedgesRenderStep.h"
#include "src/gpu/graphite/render/VerticesRenderStep.h"

namespace skgpu::graphite {

namespace {

const RenderStep* cover_step() {
    static const CoverBoundsRenderStep kFill{false};
    return &kFill;
}

const RenderStep* inverse_cover_step() {
    static const CoverBoundsRenderStep kInverseFill{true};
    return &kInverseFill;
}

static constexpr DepthStencilSettings kDirectShadingPass = {
        /*frontStencil=*/{},
        /*backStencil=*/ {},
        /*refValue=*/    0,
        /*stencilTest=*/ false,
        /*depthCompare=*/CompareOp::kGreater,
        /*depthTest=*/   true,
        /*depthWrite=*/  true
};

}  // namespace

const Renderer& Renderer::StencilTessellatedCurvesAndTris(SkPathFillType fillType) {
    // Because each fill type uses a different stencil settings, there is one Renderer per type.
    // However, at each stage (stencil vs. cover), there are only two RenderSteps to branch on.
    static const MiddleOutFanRenderStep kWindingStencilFan{false};
    static const MiddleOutFanRenderStep kEvenOddStencilFan{true};
    static const TessellateCurvesRenderStep kWindingStencilCurves{false};
    static const TessellateCurvesRenderStep kEvenOddStencilCurves{true};

    static const Renderer kWindingRenderer{"StencilTessellatedCurvesAndTris[winding]",
                                           &kWindingStencilFan,
                                           &kWindingStencilCurves,
                                           cover_step()};
    static const Renderer kInverseWindingRenderer{"StencilTessellatedCurvesAndTris[inverse-winding]",
                                                  &kWindingStencilFan,
                                                  &kWindingStencilCurves,
                                                  inverse_cover_step()};
    static const Renderer kEvenOddRenderer{"StencilTessellatedCurvesAndTris[evenodd]",
                                           &kEvenOddStencilFan,
                                           &kEvenOddStencilCurves,
                                           cover_step()};
    static const Renderer kInverseEvenOddRenderer{"StencilTessellatedCurvesAndTris[inverse-evenodd]",
                                                  &kEvenOddStencilFan,
                                                  &kEvenOddStencilCurves,
                                                  inverse_cover_step()};

    switch(fillType) {
        case SkPathFillType::kWinding: return kWindingRenderer;
        case SkPathFillType::kEvenOdd: return kEvenOddRenderer;
        case SkPathFillType::kInverseWinding: return kInverseWindingRenderer;
        case SkPathFillType::kInverseEvenOdd: return kInverseEvenOddRenderer;
    }
    SkUNREACHABLE;
}

const Renderer& Renderer::StencilTessellatedWedges(SkPathFillType fillType) {
    static const TessellateWedgesRenderStep kWindingStencilWedges{"winding",  kWindingStencilPass};
    static const TessellateWedgesRenderStep kEvenOddStencilWedges{"even-odd", kEvenOddStencilPass};

    static const Renderer kWindingRenderer{"StencilTessellatedWedges[winding]",
                                           &kWindingStencilWedges,
                                           cover_step()};
    static const Renderer kInverseWindingRenderer{"StencilTessellatedWedges[inverse-winding]",
                                                  &kWindingStencilWedges,
                                                  inverse_cover_step()};
    static const Renderer kEvenOddRenderer{"StencilTessellatedWedges[evenodd]",
                                           &kEvenOddStencilWedges,
                                           cover_step()};
    static const Renderer kInverseEvenOddRenderer{"StencilTessellatedWedges[inverse-evenodd]",
                                                  &kEvenOddStencilWedges,
                                                  inverse_cover_step()};

    switch(fillType) {
        case SkPathFillType::kWinding: return kWindingRenderer;
        case SkPathFillType::kEvenOdd: return kEvenOddRenderer;
        case SkPathFillType::kInverseWinding: return kInverseWindingRenderer;
        case SkPathFillType::kInverseEvenOdd: return kInverseEvenOddRenderer;
    }
    SkUNREACHABLE;
}

const Renderer& Renderer::ConvexTessellatedWedges() {
    static const TessellateWedgesRenderStep kConvexWedges{"convex", kDirectShadingPass};
    static const Renderer kConvexWedgeRenderer{"ConvexTessellatedWedges", &kConvexWedges};
    return kConvexWedgeRenderer;
}

const Renderer& Renderer::Vertices(SkVertices::VertexMode mode, bool hasColors, bool hasTexCoords) {
    static const VerticesRenderStep kTrianglesStep{PrimitiveType::kTriangles,
                                                   "triangles",
                                                   /*hasColor=*/false,
                                                   /*hasTexture=*/false};
    static const VerticesRenderStep kTrianglesColorStep{PrimitiveType::kTriangles,
                                                        "triangles-color",
                                                        /*hasColor=*/true,
                                                        /*hasTexture=*/false};
    static const VerticesRenderStep kTrianglesTexStep{PrimitiveType::kTriangles,
                                                      "triangles-tex",
                                                      /*hasColor=*/false,
                                                      /*hasTexture=*/true};
    static const VerticesRenderStep kTrianglesColorTexStep{PrimitiveType::kTriangles,
                                                           "triangles-color-tex",
                                                           /*hasColor=*/true,
                                                           /*hasTexture=*/true};
    static const VerticesRenderStep kTriangleStripStep{PrimitiveType::kTriangleStrip,
                                                       "triangle-strip",
                                                       /*hasColor=*/false,
                                                       /*hasTexture=*/false};
    static const VerticesRenderStep kTriangleStripColorStep{PrimitiveType::kTriangleStrip,
                                                            "triangle-strip-color",
                                                            /*hasColor=*/true,
                                                            /*hasTexture=*/false};
    static const VerticesRenderStep kTriangleStripTexStep{PrimitiveType::kTriangleStrip,
                                                          "triangle-strip-tex",
                                                          /*hasColor=*/false,
                                                          /*hasTexture=*/true};
    static const VerticesRenderStep kTriangleStripColorTexStep{PrimitiveType::kTriangleStrip,
                                                               "triangle-strip-color-tex",
                                                               /*hasColor=*/true,
                                                               /*hasTexture=*/true};

    static const Renderer kTrianglesVerticesRenderer{"Vertices[triangles]", &kTrianglesStep};
    static const Renderer kTrianglesColorVerticesRenderer{"Vertices[triangles-color]",
                                                          &kTrianglesColorStep};
    static const Renderer kTrianglesTexVerticesRenderer{"Vertices[triangles-tex]",
                                                        &kTrianglesTexStep};
    static const Renderer kTrianglesColorTexVerticesRenderer{"Vertices[triangles-color-tex]",
                                                             &kTrianglesColorTexStep};
    static const Renderer kTriangleStripVerticesRenderer{"Vertices[triangle-strip]",
                                                         &kTriangleStripStep};
    static const Renderer kTriangleStripColorVerticesRenderer{"Vertices[triangle-strip-color]",
                                                              &kTriangleStripColorStep};
    static const Renderer kTriangleStripTexVerticesRenderer{"Vertices[triangle-strip-tex]",
                                                            &kTriangleStripTexStep};
    static const Renderer kTriangleStripColorTexVerticesRenderer{
                    "Vertices[triangle-strip-color-tex]",
                    &kTriangleStripColorTexStep};

    // Assert that the SkVertices builder has converted triangle fans to regular triangles.
    SkASSERT(mode != SkVertices::kTriangleFan_VertexMode);
    // There should now only be two possible primary types: triangles and triangle strips.
    const bool triangleStrips = mode == SkVertices::VertexMode::kTriangleStrip_VertexMode;
    if (hasColors && hasTexCoords) {
        return triangleStrips ? kTriangleStripColorTexVerticesRenderer
                              : kTrianglesColorTexVerticesRenderer;
    } else if (hasColors) {
        return triangleStrips ? kTriangleStripColorVerticesRenderer
                              : kTrianglesColorVerticesRenderer;
    } else if (hasTexCoords) {
        return triangleStrips ? kTriangleStripTexVerticesRenderer
                              : kTrianglesTexVerticesRenderer;
    } else {
        return triangleStrips ? kTriangleStripVerticesRenderer
                              : kTrianglesVerticesRenderer;
    }
}
}
