blob: e86b564016a5cba414c48712d90f68466bcdaad1 [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef StrokeTessellator_DEFINED
#define StrokeTessellator_DEFINED
#include "include/core/SkPath.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkStrokeRec.h"
#include "include/private/SkColorData.h"
#include "src/gpu/ganesh/GrGpuBuffer.h"
#include "src/gpu/ganesh/GrVertexChunkArray.h"
#include "src/gpu/tessellate/Tessellation.h"
class GrMeshDrawTarget;
class GrOpFlushState;
class SkMatrix;
namespace skgpu::ganesh {
// Prepares GPU data for, and then draws a stroke's tessellated geometry. Renders strokes as
// fixed-count triangle strip instances. Any extra triangles not needed by the instance are emitted
// as degenerate triangles.
class StrokeTessellator {
public:
using PatchAttribs = tess::PatchAttribs;
struct PathStrokeList {
PathStrokeList(const SkPath& path, const SkStrokeRec& stroke, const SkPMColor4f& color)
: fPath(path), fStroke(stroke), fColor(color) {}
SkPath fPath;
SkStrokeRec fStroke;
SkPMColor4f fColor;
PathStrokeList* fNext = nullptr;
};
StrokeTessellator(PatchAttribs attribs) : fAttribs(attribs | PatchAttribs::kJoinControlPoint) {}
// Called before draw(). Prepares GPU buffers containing the geometry to tessellate.
//
// Returns the fixed number of edges the tessellator will draw per patch.
void prepare(GrMeshDrawTarget*,
const SkMatrix& shaderMatrix,
PathStrokeList*,
int totalCombinedStrokeVerbCnt);
// Issues draw calls for the tessellated stroke. The caller is responsible for creating and
// binding a pipeline that uses this class's shader() before calling draw().
void draw(GrOpFlushState*) const;
protected:
const PatchAttribs fAttribs;
GrVertexChunkArray fVertexChunkArray;
int fVertexCount = 0;
// Only used if sk_VertexID is not supported.
sk_sp<const GrGpuBuffer> fVertexBufferIfNoIDSupport;
};
} // namespace skgpu::ganesh
#endif // StrokeTessellator_DEFINED