blob: f585142ba5b6f871f2622fb6927f4a29fd2cfb69 [file] [log] [blame]
/*
* 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;
}
}
}