blob: 0aa0b5983b429bdf23f00ebc81e0394f22bf5b7e [file] [log] [blame]
/*
* Copyright 2019 Google LLC.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrStencilPathShader_DEFINED
#define GrStencilPathShader_DEFINED
#include "src/gpu/tessellate/GrPathShader.h"
// This is the base class for shaders that stencil path elements, namely, triangles, standalone
// cubics, and wedges.
class GrStencilPathShader : public GrPathShader {
public:
GrStencilPathShader(ClassID classID, const SkMatrix& viewMatrix, GrPrimitiveType primitiveType,
int tessellationPatchVertexCount = 0)
: GrPathShader(classID, viewMatrix, primitiveType, tessellationPatchVertexCount) {
constexpr static Attribute kPointAttrib = {
"point", kFloat2_GrVertexAttribType, kFloat2_GrSLType};
this->setVertexAttributes(&kPointAttrib, 1);
}
private:
void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder* b) const final {
b->add32(this->viewMatrix().isIdentity());
}
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const final;
class Impl;
};
// Draws simple triangles to the stencil buffer.
class GrStencilTriangleShader : public GrStencilPathShader {
public:
GrStencilTriangleShader(const SkMatrix& viewMatrix) : GrStencilPathShader(
kTessellate_GrStencilTriangleShader_ClassID, viewMatrix, GrPrimitiveType::kTriangles) {}
const char* name() const override { return "tessellate_GrStencilTriangleShader"; }
};
// Uses GPU tessellation shaders to linearize, triangulate, and render standalone cubics. Here, a
// "cubic" is a standalone closed contour consisting of a single cubic bezier.
// TODO: Eventually we want to use rational cubic wedges in order to support perspective and conics.
class GrStencilCubicShader : public GrStencilPathShader {
public:
GrStencilCubicShader(const SkMatrix& viewMatrix) : GrStencilPathShader(
kTessellate_GrStencilCubicShader_ClassID, viewMatrix, GrPrimitiveType::kPatches, 4) {}
const char* name() const override { return "tessellate_GrStencilCubicShader"; }
private:
SkString getTessControlShaderGLSL(const char* versionAndExtensionDecls,
const GrShaderCaps&) const override;
SkString getTessEvaluationShaderGLSL(const char* versionAndExtensionDecls,
const GrShaderCaps&) const override;
};
// Uses GPU tessellation shaders to linearize, triangulate, and render cubic "wedge" patches. A
// wedge is a 5-point patch consisting of 4 cubic control points, plus an anchor point fanning from
// the center of the curve's resident contour.
// TODO: Eventually we want to use rational cubic wedges in order to support perspective and conics.
class GrStencilWedgeShader : public GrStencilPathShader {
public:
GrStencilWedgeShader(const SkMatrix& viewMatrix) : GrStencilPathShader(
kTessellate_GrStencilWedgeShader_ClassID, viewMatrix, GrPrimitiveType::kPatches, 5) {}
const char* name() const override { return "tessellate_GrStencilWedgeShader"; }
private:
SkString getTessControlShaderGLSL(const char* versionAndExtensionDecls,
const GrShaderCaps&) const override;
SkString getTessEvaluationShaderGLSL(const char* versionAndExtensionDecls,
const GrShaderCaps&) const override;
};
#endif