blob: facb9aa0f22933d0854542777eebae7e6edcd496 [file] [log] [blame]
/*
* Copyright 2020 Google LLC.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrPathShader_DEFINED
#define GrPathShader_DEFINED
#include "src/gpu/GrGeometryProcessor.h"
#include "src/gpu/GrOpFlushState.h"
#include "src/gpu/GrOpsRenderPass.h"
#include "src/gpu/GrProgramInfo.h"
// This is a common base class for shaders in the GPU tessellator.
class GrPathShader : public GrGeometryProcessor {
public:
GrPathShader(ClassID classID, const SkMatrix& viewMatrix, GrPrimitiveType primitiveType,
int tessellationPatchVertexCount)
: GrGeometryProcessor(classID)
, fViewMatrix(viewMatrix)
, fPrimitiveType(primitiveType)
, fTessellationPatchVertexCount(tessellationPatchVertexCount) {
if (fTessellationPatchVertexCount) {
this->setWillUseTessellationShaders();
}
}
const SkMatrix& viewMatrix() const { return fViewMatrix; }
GrPrimitiveType primitiveType() const { return fPrimitiveType; }
int tessellationPatchVertexCount() const { return fTessellationPatchVertexCount; }
void issueDraw(GrOpFlushState* state, const GrPipeline* pipeline,
const GrPipeline::FixedDynamicState* fixedDynamicState,
sk_sp<const GrBuffer> vertexBuffer, int vertexCount, int baseVertex,
const SkRect& bounds) {
GrMesh mesh;
mesh.setNonIndexedNonInstanced(vertexCount);
mesh.setVertexData(std::move(vertexBuffer), baseVertex);
this->issueDraw(state, pipeline, fixedDynamicState, mesh, bounds);
}
void issueDraw(GrOpFlushState* state, const GrPipeline* pipeline,
const GrPipeline::FixedDynamicState* fixedDynamicState, const GrMesh& mesh,
const SkRect& bounds) {
GrProgramInfo programInfo(state->proxy()->numSamples(), state->proxy()->numStencilSamples(),
state->proxy()->backendFormat(), state->view()->origin(),
pipeline, this, fixedDynamicState, nullptr, 0,
fPrimitiveType, fTessellationPatchVertexCount);
state->opsRenderPass()->draw(programInfo, &mesh, 1, bounds);
}
private:
const SkMatrix fViewMatrix;
const GrPrimitiveType fPrimitiveType;
const int fTessellationPatchVertexCount;
class Impl;
};
#endif