Create an skgpu::tess namespace
This is just a bunch of renaming, and for now the tessellate/shaders
directory remains untouched. The next steps will be to clean up and
remove all Ganesh v1 dependencies from tessellation.
Bug: skia:12524
Change-Id: I8cc166c0c78f9fb160de807131fa53fcc0765818
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/458876
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/bench/TessellateBench.cpp b/bench/TessellateBench.cpp
index 7681d90..f83a98f 100644
--- a/bench/TessellateBench.cpp
+++ b/bench/TessellateBench.cpp
@@ -12,11 +12,11 @@
#include "src/gpu/GrDirectContextPriv.h"
#include "src/gpu/geometry/GrWangsFormula.h"
#include "src/gpu/mock/GrMockOpTarget.h"
-#include "src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h"
-#include "src/gpu/tessellate/GrPathCurveTessellator.h"
-#include "src/gpu/tessellate/GrPathWedgeTessellator.h"
-#include "src/gpu/tessellate/GrStrokeFixedCountTessellator.h"
-#include "src/gpu/tessellate/GrStrokeHardwareTessellator.h"
+#include "src/gpu/tessellate/MiddleOutPolygonTriangulator.h"
+#include "src/gpu/tessellate/PathCurveTessellator.h"
+#include "src/gpu/tessellate/PathWedgeTessellator.h"
+#include "src/gpu/tessellate/StrokeFixedCountTessellator.h"
+#include "src/gpu/tessellate/StrokeHardwareTessellator.h"
#include "tools/ToolUtils.h"
#include <vector>
@@ -119,10 +119,14 @@
SkArenaAlloc arena(1024);
GrPipeline noVaryingsPipeline(GrScissorTest::kDisabled, SkBlendMode::kSrcOver,
GrSwizzle::RGBA());
- auto tess = GrPathCurveTessellator::Make(&arena, fMatrix, SK_PMColor4fTRANSPARENT,
- GrPathCurveTessellator::DrawInnerFan::kNo,
- fTarget->caps().minPathVerbsForHwTessellation(),
- noVaryingsPipeline, fTarget->caps());
+ auto tess = skgpu::tess::PathCurveTessellator::Make(
+ &arena,
+ fMatrix,
+ SK_PMColor4fTRANSPARENT,
+ skgpu::tess::PathCurveTessellator::DrawInnerFan::kNo,
+ fTarget->caps().minPathVerbsForHwTessellation(),
+ noVaryingsPipeline,
+ fTarget->caps());
tess->prepare(fTarget.get(), SkRectPriv::MakeLargest(), {gAlmostIdentity, fPath},
fPath.countVerbs());
}
@@ -131,16 +135,20 @@
SkArenaAlloc arena(1024);
GrPipeline noVaryingsPipeline(GrScissorTest::kDisabled, SkBlendMode::kSrcOver,
GrSwizzle::RGBA());
- auto tess = GrPathWedgeTessellator::Make(&arena, fMatrix, SK_PMColor4fTRANSPARENT,
- fTarget->caps().minPathVerbsForHwTessellation(),
- noVaryingsPipeline, fTarget->caps());
+ auto tess = skgpu::tess::PathWedgeTessellator::Make(
+ &arena,
+ fMatrix,
+ SK_PMColor4fTRANSPARENT,
+ fTarget->caps().minPathVerbsForHwTessellation(),
+ noVaryingsPipeline,
+ fTarget->caps());
tess->prepare(fTarget.get(), SkRectPriv::MakeLargest(), {gAlmostIdentity, fPath},
fPath.countVerbs());
}
static void benchmark_wangs_formula_cubic_log2(const SkMatrix& matrix, const SkPath& path) {
int sum = 0;
- GrVectorXform xform(matrix);
+ skgpu::tess::VectorXform xform(matrix);
for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
if (verb == SkPathVerb::kCubic) {
sum += GrWangsFormula::cubic_log2(4, pts, xform);
@@ -168,7 +176,7 @@
static void benchmark_wangs_formula_conic(const SkMatrix& matrix, const SkPath& path) {
int sum = 0;
- GrVectorXform xform(matrix);
+ skgpu::tess::VectorXform xform(matrix);
for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
if (verb == SkPathVerb::kConic) {
sum += GrWangsFormula::conic(4, pts, *w, xform);
@@ -182,7 +190,7 @@
static void benchmark_wangs_formula_conic_log2(const SkMatrix& matrix, const SkPath& path) {
int sum = 0;
- GrVectorXform xform(matrix);
+ skgpu::tess::VectorXform xform(matrix);
for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
if (verb == SkPathVerb::kConic) {
sum += GrWangsFormula::conic_log2(4, pts, *w, xform);
@@ -210,32 +218,40 @@
GrVertexWriter vertexWriter = static_cast<SkPoint*>(fTarget->makeVertexSpace(
sizeof(SkPoint), kNumCubicsInChalkboard, &buffer, &baseVertex));
int numTrianglesWritten;
- GrMiddleOutPolygonTriangulator::WritePathInnerFan(std::move(vertexWriter), 0, 0,
- gAlmostIdentity, fPath, &numTrianglesWritten);
+ skgpu::tess::MiddleOutPolygonTriangulator::WritePathInnerFan(std::move(vertexWriter),
+ 0,
+ 0,
+ gAlmostIdentity,
+ fPath,
+ &numTrianglesWritten);
}
-using PathStrokeList = GrStrokeTessellator::PathStrokeList;
-using MakeTessellatorFn = std::unique_ptr<GrStrokeTessellator>(*)(ShaderFlags, const GrShaderCaps&,
- const SkMatrix&, PathStrokeList*,
- std::array<float, 2>, const
- SkRect&);
+using PathStrokeList = skgpu::tess::StrokeTessellator::PathStrokeList;
+using MakeTessellatorFn = std::unique_ptr<skgpu::tess::StrokeTessellator>(*)(ShaderFlags,
+ const GrShaderCaps&,
+ const SkMatrix&,
+ PathStrokeList*,
+ std::array<float, 2>,
+ const SkRect&);
-static std::unique_ptr<GrStrokeTessellator> make_hw_tessellator(
+static std::unique_ptr<skgpu::tess::StrokeTessellator> make_hw_tessellator(
ShaderFlags shaderFlags, const GrShaderCaps& shaderCaps, const SkMatrix& viewMatrix,
PathStrokeList* pathStrokeList, std::array<float, 2> matrixMinMaxScales,
const SkRect& strokeCullBounds) {
- return std::make_unique<GrStrokeHardwareTessellator>(shaderCaps, shaderFlags, viewMatrix,
- pathStrokeList, matrixMinMaxScales,
- strokeCullBounds);
+ return std::make_unique<skgpu::tess::StrokeHardwareTessellator>(shaderCaps, shaderFlags,
+ viewMatrix, pathStrokeList,
+ matrixMinMaxScales,
+ strokeCullBounds);
}
-static std::unique_ptr<GrStrokeTessellator> make_fixed_count_tessellator(
+static std::unique_ptr<skgpu::tess::StrokeTessellator> make_fixed_count_tessellator(
ShaderFlags shaderFlags, const GrShaderCaps& shaderCaps, const SkMatrix& viewMatrix,
PathStrokeList* pathStrokeList, std::array<float, 2> matrixMinMaxScales,
const SkRect& strokeCullBounds) {
- return std::make_unique<GrStrokeFixedCountTessellator>(shaderCaps, shaderFlags, viewMatrix,
- pathStrokeList, matrixMinMaxScales,
- strokeCullBounds);
+ return std::make_unique<skgpu::tess::StrokeFixedCountTessellator>(shaderCaps, shaderFlags,
+ viewMatrix, pathStrokeList,
+ matrixMinMaxScales,
+ strokeCullBounds);
}
using MakePathStrokesFn = std::vector<PathStrokeList>(*)();
@@ -355,7 +371,7 @@
float fMatrixScale;
std::unique_ptr<GrMockOpTarget> fTarget;
std::vector<PathStrokeList> fPathStrokes;
- std::unique_ptr<GrStrokeTessellator> fTessellator;
+ std::unique_ptr<skgpu::tess::StrokeTessellator> fTessellator;
SkArenaAlloc fPersistentArena{1024};
int fTotalVerbCount = 0;
};
diff --git a/gn/gpu.gni b/gn/gpu.gni
index 8745221..7a46b8e 100644
--- a/gn/gpu.gni
+++ b/gn/gpu.gni
@@ -325,22 +325,22 @@
"$_src/gpu/gradients/GrGradientShader.h",
# tessellate
- "$_src/gpu/tessellate/GrCullTest.h",
- "$_src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h",
- "$_src/gpu/tessellate/GrPathCurveTessellator.cpp",
- "$_src/gpu/tessellate/GrPathCurveTessellator.h",
- "$_src/gpu/tessellate/GrPathTessellator.h",
- "$_src/gpu/tessellate/GrPathWedgeTessellator.cpp",
- "$_src/gpu/tessellate/GrPathWedgeTessellator.h",
- "$_src/gpu/tessellate/GrPathXform.h",
- "$_src/gpu/tessellate/GrStrokeFixedCountTessellator.cpp",
- "$_src/gpu/tessellate/GrStrokeFixedCountTessellator.h",
- "$_src/gpu/tessellate/GrStrokeHardwareTessellator.cpp",
- "$_src/gpu/tessellate/GrStrokeHardwareTessellator.h",
- "$_src/gpu/tessellate/GrStrokeIterator.h",
- "$_src/gpu/tessellate/GrStrokeTessellator.h",
- "$_src/gpu/tessellate/GrTessTypes.h",
- "$_src/gpu/tessellate/GrVectorXform.h",
+ "$_src/gpu/tessellate/CullTest.h",
+ "$_src/gpu/tessellate/MiddleOutPolygonTriangulator.h",
+ "$_src/gpu/tessellate/PathCurveTessellator.cpp",
+ "$_src/gpu/tessellate/PathCurveTessellator.h",
+ "$_src/gpu/tessellate/PathTessellator.h",
+ "$_src/gpu/tessellate/PathWedgeTessellator.cpp",
+ "$_src/gpu/tessellate/PathWedgeTessellator.h",
+ "$_src/gpu/tessellate/PathXform.h",
+ "$_src/gpu/tessellate/StrokeFixedCountTessellator.cpp",
+ "$_src/gpu/tessellate/StrokeFixedCountTessellator.h",
+ "$_src/gpu/tessellate/StrokeHardwareTessellator.cpp",
+ "$_src/gpu/tessellate/StrokeHardwareTessellator.h",
+ "$_src/gpu/tessellate/StrokeIterator.h",
+ "$_src/gpu/tessellate/StrokeTessellator.h",
+ "$_src/gpu/tessellate/TessTypes.h",
+ "$_src/gpu/tessellate/VectorXform.h",
# tessellate/shaders
"$_src/gpu/tessellate/shaders/GrPathTessellationShader.cpp",
diff --git a/samplecode/SamplePathTessellators.cpp b/samplecode/SamplePathTessellators.cpp
index 109e84c..a147887 100644
--- a/samplecode/SamplePathTessellators.cpp
+++ b/samplecode/SamplePathTessellators.cpp
@@ -17,8 +17,8 @@
#include "src/gpu/ops/GrDrawOp.h"
#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
#include "src/gpu/ops/TessellationPathRenderer.h"
-#include "src/gpu/tessellate/GrPathCurveTessellator.h"
-#include "src/gpu/tessellate/GrPathWedgeTessellator.h"
+#include "src/gpu/tessellate/PathCurveTessellator.h"
+#include "src/gpu/tessellate/PathWedgeTessellator.h"
#include "src/gpu/tessellate/shaders/GrPathTessellationShader.h"
#include "src/gpu/v1/SurfaceDrawContext_v1.h"
@@ -83,28 +83,41 @@
auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState, std::move(fProcessors),
fPipelineFlags);
switch (fMode) {
- using DrawInnerFan = GrPathCurveTessellator::DrawInnerFan;
+ using DrawInnerFan = skgpu::tess::PathCurveTessellator::DrawInnerFan;
case Mode::kWedgeMiddleOut:
- fTessellator = GrPathWedgeTessellator::Make(alloc, shaderMatrix, kCyan,
- numVerbsToGetMiddleOut, *pipeline,
- caps);
+ fTessellator = skgpu::tess::PathWedgeTessellator::Make(alloc,
+ shaderMatrix,
+ kCyan,
+ numVerbsToGetMiddleOut,
+ *pipeline,
+
+ caps);
break;
case Mode::kCurveMiddleOut:
- fTessellator = GrPathCurveTessellator::Make(alloc, shaderMatrix, kCyan,
- DrawInnerFan::kYes,
- numVerbsToGetMiddleOut, *pipeline,
- caps);
+ fTessellator = skgpu::tess::PathCurveTessellator::Make(alloc,
+ shaderMatrix,
+ kCyan,
+ DrawInnerFan::kYes,
+ numVerbsToGetMiddleOut,
+ *pipeline,
+ caps);
break;
case Mode::kWedgeTessellate:
- fTessellator = GrPathWedgeTessellator::Make(alloc, shaderMatrix, kCyan,
- numVerbsToGetTessellation, *pipeline,
- caps);
+ fTessellator = skgpu::tess::PathWedgeTessellator::Make(alloc,
+ shaderMatrix,
+ kCyan,
+ numVerbsToGetTessellation,
+ *pipeline,
+ caps);
break;
case Mode::kCurveTessellate:
- fTessellator = GrPathCurveTessellator::Make(alloc, shaderMatrix, kCyan,
- DrawInnerFan::kYes,
- numVerbsToGetTessellation, *pipeline,
- caps);
+ fTessellator = skgpu::tess::PathCurveTessellator::Make(alloc,
+ shaderMatrix,
+ kCyan,
+ DrawInnerFan::kYes,
+ numVerbsToGetTessellation,
+ *pipeline,
+ caps);
break;
}
fTessellator->prepare(flushState, this->bounds(), {pathMatrix, fPath}, fPath.countVerbs());
@@ -125,7 +138,7 @@
const SkMatrix fMatrix;
const GrPipeline::InputFlags fPipelineFlags;
const Mode fMode;
- GrPathTessellator* fTessellator = nullptr;
+ skgpu::tess::PathTessellator* fTessellator = nullptr;
GrProgramInfo* fProgram;
GrProcessorSet fProcessors{SkBlendMode::kSrcOver};
diff --git a/src/gpu/geometry/GrWangsFormula.h b/src/gpu/geometry/GrWangsFormula.h
index d2e3862..797a6d6 100644
--- a/src/gpu/geometry/GrWangsFormula.h
+++ b/src/gpu/geometry/GrWangsFormula.h
@@ -12,7 +12,7 @@
#include "include/core/SkString.h"
#include "include/private/SkFloatingPoint.h"
#include "src/gpu/GrVx.h"
-#include "src/gpu/tessellate/GrVectorXform.h"
+#include "src/gpu/tessellate/VectorXform.h"
// Wang's formula gives the minimum number of evenly spaced (in the parametric sense) line segments
// that a bezier curve must be chopped into in order to guarantee all lines stay within a distance
@@ -26,6 +26,8 @@
// to Curves and Surfaces for Geometric Modeling". Morgan Kaufmann Publishers.)
namespace GrWangsFormula {
+using skgpu::tess::VectorXform;
+
// Returns the value by which to multiply length in Wang's formula. (See above.)
template<int Degree> constexpr float length_term(float precision) {
return (Degree * (Degree - 1) / 8.f) * precision;
@@ -56,7 +58,7 @@
// Returns Wang's formula, raised to the 4th power, specialized for a quadratic curve.
SK_ALWAYS_INLINE static float quadratic_pow4(float precision, const SkPoint pts[],
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
using grvx::float2, skvx::bit_pun;
float2 p0 = bit_pun<float2>(pts[0]);
float2 p1 = bit_pun<float2>(pts[1]);
@@ -69,21 +71,21 @@
// Returns Wang's formula specialized for a quadratic curve.
SK_ALWAYS_INLINE static float quadratic(float precision, const SkPoint pts[],
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
return root4(quadratic_pow4(precision, pts, vectorXform));
}
// Returns the log2 value of Wang's formula specialized for a quadratic curve, rounded up to the
// next int.
SK_ALWAYS_INLINE static int quadratic_log2(float precision, const SkPoint pts[],
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
// nextlog16(x) == ceil(log2(sqrt(sqrt(x))))
return nextlog16(quadratic_pow4(precision, pts, vectorXform));
}
// Returns Wang's formula, raised to the 4th power, specialized for a cubic curve.
SK_ALWAYS_INLINE static float cubic_pow4(float precision, const SkPoint pts[],
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
using grvx::float4;
float4 p01 = float4::Load(pts);
float4 p12 = float4::Load(pts + 1);
@@ -96,14 +98,14 @@
// Returns Wang's formula specialized for a cubic curve.
SK_ALWAYS_INLINE static float cubic(float precision, const SkPoint pts[],
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
return root4(cubic_pow4(precision, pts, vectorXform));
}
// Returns the log2 value of Wang's formula specialized for a cubic curve, rounded up to the next
// int.
SK_ALWAYS_INLINE static int cubic_log2(float precision, const SkPoint pts[],
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
// nextlog16(x) == ceil(log2(sqrt(sqrt(x))))
return nextlog16(cubic_pow4(precision, pts, vectorXform));
}
@@ -132,7 +134,7 @@
// J. Zheng, T. Sederberg. "Estimating Tessellation Parameter Intervals for
// Rational Curves and Surfaces." ACM Transactions on Graphics 19(1). 2000.
SK_ALWAYS_INLINE static float conic_pow2(float precision, const SkPoint pts[], float w,
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
using grvx::dot, grvx::float2, grvx::float4, skvx::bit_pun;
float2 p0 = vectorXform(bit_pun<float2>(pts[0]));
float2 p1 = vectorXform(bit_pun<float2>(pts[1]));
@@ -168,14 +170,14 @@
// Returns the value of Wang's formula specialized for a conic curve.
SK_ALWAYS_INLINE static float conic(float tolerance, const SkPoint pts[], float w,
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
return sqrtf(conic_pow2(tolerance, pts, w, vectorXform));
}
// Returns the log2 value of Wang's formula specialized for a conic curve, rounded up to the next
// int.
SK_ALWAYS_INLINE static int conic_log2(float tolerance, const SkPoint pts[], float w,
- const GrVectorXform& vectorXform = GrVectorXform()) {
+ const VectorXform& vectorXform = VectorXform()) {
// nextlog4(x) == ceil(log2(sqrt(x)))
return nextlog4(conic_pow2(tolerance, pts, w, vectorXform));
}
diff --git a/src/gpu/ops/AtlasRenderTask.cpp b/src/gpu/ops/AtlasRenderTask.cpp
index e05908e..4e82d40 100644
--- a/src/gpu/ops/AtlasRenderTask.cpp
+++ b/src/gpu/ops/AtlasRenderTask.cpp
@@ -101,7 +101,7 @@
pathList->pathCount(),
GrPaint(),
GrAAType::kMSAA,
- GrTessellationPathFlags::kStencilOnly,
+ skgpu::tess::TessellationPathFlags::kStencilOnly,
drawRect);
this->addAtlasDrawOp(std::move(op), caps);
}
diff --git a/src/gpu/ops/AtlasRenderTask.h b/src/gpu/ops/AtlasRenderTask.h
index 7846966..f08a7e2 100644
--- a/src/gpu/ops/AtlasRenderTask.h
+++ b/src/gpu/ops/AtlasRenderTask.h
@@ -12,7 +12,7 @@
#include "src/core/SkTBlockList.h"
#include "src/gpu/GrDynamicAtlas.h"
#include "src/gpu/ops/OpsTask.h"
-#include "src/gpu/tessellate/GrPathTessellator.h"
+#include "src/gpu/tessellate/PathTessellator.h"
struct SkIPoint16;
@@ -61,7 +61,8 @@
const std::unique_ptr<GrDynamicAtlas> fDynamicAtlas;
// Allocate enough inline entries for 16 atlas path draws, then spill to the heap.
- using PathDrawAllocator = SkTBlockList<GrPathTessellator::PathDrawList, 16>;
+ using PathDrawList = skgpu::tess::PathTessellator::PathDrawList;
+ using PathDrawAllocator = SkTBlockList<PathDrawList, 16>;
PathDrawAllocator fPathDrawAllocator{64, SkBlockAllocator::GrowthPolicy::kFibonacci};
class AtlasPathList : SkNoncopyable {
@@ -75,12 +76,12 @@
fTotalCombinedPathVerbCnt += path.countVerbs();
++fPathCount;
}
- const GrPathTessellator::PathDrawList* pathDrawList() const { return fPathDrawList; }
+ const PathDrawList* pathDrawList() const { return fPathDrawList; }
int totalCombinedPathVerbCnt() const { return fTotalCombinedPathVerbCnt; }
int pathCount() const { return fPathCount; }
private:
- GrPathTessellator::PathDrawList* fPathDrawList = nullptr;
+ PathDrawList* fPathDrawList = nullptr;
int fTotalCombinedPathVerbCnt = 0;
int fPathCount = 0;
};
diff --git a/src/gpu/ops/PathInnerTriangulateOp.cpp b/src/gpu/ops/PathInnerTriangulateOp.cpp
index 9e8d1b8..759a882 100644
--- a/src/gpu/ops/PathInnerTriangulateOp.cpp
+++ b/src/gpu/ops/PathInnerTriangulateOp.cpp
@@ -13,10 +13,10 @@
#include "src/gpu/GrRecordingContextPriv.h"
#include "src/gpu/GrResourceProvider.h"
#include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
-#include "src/gpu/tessellate/GrPathCurveTessellator.h"
+#include "src/gpu/tessellate/PathCurveTessellator.h"
#include "src/gpu/tessellate/shaders/GrPathTessellationShader.h"
-using PathFlags = GrTessellationPathFlags;
+using PathFlags = skgpu::tess::TessellationPathFlags;
namespace {
@@ -242,11 +242,14 @@
// Pass 1: Tessellate the outer curves into the stencil buffer.
if (!isLinear) {
- fTessellator = GrPathCurveTessellator::Make(args.fArena, fViewMatrix,
- SK_PMColor4fTRANSPARENT,
- GrPathCurveTessellator::DrawInnerFan::kNo,
- fPath.countVerbs(), *pipelineForStencils,
- *args.fCaps);
+ fTessellator = skgpu::tess::PathCurveTessellator::Make(
+ args.fArena,
+ fViewMatrix,
+ SK_PMColor4fTRANSPARENT,
+ skgpu::tess::PathCurveTessellator::DrawInnerFan::kNo,
+ fPath.countVerbs(),
+ *pipelineForStencils,
+ *args.fCaps);
const GrUserStencilSettings* stencilPathSettings =
GrPathTessellationShader::StencilPathSettings(GrFillRuleForSkPath(fPath));
fStencilCurvesProgram = GrTessellationShader::MakeProgram(args, fTessellator->shader(),
diff --git a/src/gpu/ops/PathInnerTriangulateOp.h b/src/gpu/ops/PathInnerTriangulateOp.h
index 6a7c45e..5380ae0 100644
--- a/src/gpu/ops/PathInnerTriangulateOp.h
+++ b/src/gpu/ops/PathInnerTriangulateOp.h
@@ -10,10 +10,14 @@
#include "src/gpu/geometry/GrInnerFanTriangulator.h"
#include "src/gpu/ops/GrDrawOp.h"
-#include "src/gpu/tessellate/GrTessTypes.h"
+#include "src/gpu/tessellate/TessTypes.h"
#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
-class GrPathCurveTessellator;
+namespace skgpu::tess {
+
+class PathCurveTessellator;
+
+};
namespace skgpu::v1 {
@@ -29,8 +33,11 @@
private:
DEFINE_OP_CLASS_ID
- PathInnerTriangulateOp(const SkMatrix& viewMatrix, const SkPath& path, GrPaint&& paint,
- GrAAType aaType, GrTessellationPathFlags pathFlags,
+ PathInnerTriangulateOp(const SkMatrix& viewMatrix,
+ const SkPath& path,
+ GrPaint&& paint,
+ GrAAType aaType,
+ skgpu::tess::TessellationPathFlags pathFlags,
const SkRect& drawBounds)
: GrDrawOp(ClassID())
, fPathFlags(pathFlags)
@@ -59,7 +66,7 @@
void onPrepare(GrOpFlushState*) override;
void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
- const GrTessellationPathFlags fPathFlags;
+ const skgpu::tess::TessellationPathFlags fPathFlags;
const SkMatrix fViewMatrix;
const SkPath fPath;
const GrAAType fAAType;
@@ -75,7 +82,7 @@
const GrPipeline* fPipelineForFills = nullptr;
// Tessellates the outer curves.
- GrPathCurveTessellator* fTessellator = nullptr;
+ skgpu::tess::PathCurveTessellator* fTessellator = nullptr;
// Pass 1: Tessellate the outer curves into the stencil buffer.
const GrProgramInfo* fStencilCurvesProgram = nullptr;
diff --git a/src/gpu/ops/PathStencilCoverOp.cpp b/src/gpu/ops/PathStencilCoverOp.cpp
index 15cd7f8..e279e07 100644
--- a/src/gpu/ops/PathStencilCoverOp.cpp
+++ b/src/gpu/ops/PathStencilCoverOp.cpp
@@ -16,12 +16,12 @@
#include "src/gpu/glsl/GrGLSLVarying.h"
#include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
-#include "src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h"
-#include "src/gpu/tessellate/GrPathCurveTessellator.h"
-#include "src/gpu/tessellate/GrPathWedgeTessellator.h"
+#include "src/gpu/tessellate/MiddleOutPolygonTriangulator.h"
+#include "src/gpu/tessellate/PathCurveTessellator.h"
+#include "src/gpu/tessellate/PathWedgeTessellator.h"
#include "src/gpu/tessellate/shaders/GrPathTessellationShader.h"
-using PathFlags = GrTessellationPathFlags;
+using PathFlags = skgpu::tess::TessellationPathFlags;
namespace {
@@ -154,20 +154,21 @@
shader,
stencilPipeline,
stencilSettings);
- fTessellator = GrPathCurveTessellator::Make(args.fArena,
- shaderMatrix,
- SK_PMColor4fTRANSPARENT,
- GrPathCurveTessellator::DrawInnerFan::kNo,
- fTotalCombinedPathVerbCnt,
- *stencilPipeline,
- *args.fCaps);
+ fTessellator = skgpu::tess::PathCurveTessellator::Make(
+ args.fArena,
+ shaderMatrix,
+ SK_PMColor4fTRANSPARENT,
+ skgpu::tess::PathCurveTessellator::DrawInnerFan::kNo,
+ fTotalCombinedPathVerbCnt,
+ *stencilPipeline,
+ *args.fCaps);
} else {
- fTessellator = GrPathWedgeTessellator::Make(args.fArena,
- shaderMatrix,
- SK_PMColor4fTRANSPARENT,
- fTotalCombinedPathVerbCnt,
- *stencilPipeline,
- *args.fCaps);
+ fTessellator = skgpu::tess::PathWedgeTessellator::Make(args.fArena,
+ shaderMatrix,
+ SK_PMColor4fTRANSPARENT,
+ fTotalCombinedPathVerbCnt,
+ *stencilPipeline,
+ *args.fCaps);
}
fStencilPathProgram = GrTessellationShader::MakeProgram(args,
fTessellator->shader(),
@@ -236,8 +237,8 @@
// The inner fan isn't built into the tessellator. Generate a standard Redbook fan with a
// middle-out topology.
GrEagerDynamicVertexAllocator vertexAlloc(flushState, &fFanBuffer, &fFanBaseVertex);
- int maxCombinedFanEdges =
- GrPathTessellator::MaxCombinedFanEdgesInPathDrawList(fTotalCombinedPathVerbCnt);
+ int maxCombinedFanEdges = skgpu::tess::PathTessellator::MaxCombinedFanEdgesInPathDrawList(
+ fTotalCombinedPathVerbCnt);
// A single n-sided polygon is fanned by n-2 triangles. Multiple polygons with a combined
// edge count of n are fanned by strictly fewer triangles.
int maxTrianglesInFans = std::max(maxCombinedFanEdges - 2, 0);
@@ -245,7 +246,7 @@
int fanTriangleCount = 0;
for (auto [pathMatrix, path] : *fPathDrawList) {
int numTrianglesWritten;
- triangleVertexWriter = GrMiddleOutPolygonTriangulator::WritePathInnerFan(
+ triangleVertexWriter = skgpu::tess::MiddleOutPolygonTriangulator::WritePathInnerFan(
std::move(triangleVertexWriter),
0,
0,
diff --git a/src/gpu/ops/PathStencilCoverOp.h b/src/gpu/ops/PathStencilCoverOp.h
index 6a45298..45a82be 100644
--- a/src/gpu/ops/PathStencilCoverOp.h
+++ b/src/gpu/ops/PathStencilCoverOp.h
@@ -9,8 +9,8 @@
#define PathStencilCoverOp_DEFINED
#include "src/gpu/ops/GrDrawOp.h"
-#include "src/gpu/tessellate/GrPathTessellator.h"
-#include "src/gpu/tessellate/GrTessTypes.h"
+#include "src/gpu/tessellate/PathTessellator.h"
+#include "src/gpu/tessellate/TessTypes.h"
#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
namespace skgpu::v1 {
@@ -22,7 +22,7 @@
private:
DEFINE_OP_CLASS_ID
- using PathDrawList = GrPathTessellator::PathDrawList;
+ using PathDrawList = skgpu::tess::PathTessellator::PathDrawList;
// If the path is inverse filled, drawBounds must be the entire backing store dimensions of the
// render target.
@@ -31,7 +31,7 @@
const SkPath& path,
GrPaint&& paint,
GrAAType aaType,
- GrTessellationPathFlags pathFlags,
+ skgpu::tess::TessellationPathFlags pathFlags,
const SkRect& drawBounds)
: GrDrawOp(ClassID())
, fPathDrawList(arena->make<PathDrawList>(viewMatrix, path))
@@ -47,13 +47,13 @@
// Constructs a PathStencilCoverOp from an existing draw list.
// FIXME: The only user of this method is the atlas. We should move the GrProgramInfos into
- // GrPathTessellator so the atlas can use that directly instead of going through this class.
+ // PathTessellator so the atlas can use that directly instead of going through this class.
PathStencilCoverOp(const PathDrawList* pathDrawList,
int totalCombinedVerbCnt,
int pathCount,
GrPaint&& paint,
GrAAType aaType,
- GrTessellationPathFlags pathFlags,
+ skgpu::tess::TessellationPathFlags pathFlags,
const SkRect& drawBounds)
: GrDrawOp(ClassID())
, fPathDrawList(pathDrawList)
@@ -89,14 +89,14 @@
const PathDrawList* fPathDrawList;
const int fTotalCombinedPathVerbCnt;
const int fPathCount;
- const GrTessellationPathFlags fPathFlags;
+ const skgpu::tess::TessellationPathFlags fPathFlags;
const GrAAType fAAType;
SkPMColor4f fColor;
GrProcessorSet fProcessors;
SkDEBUGCODE(SkRect fOriginalDrawBounds;)
// Decided during prePreparePrograms.
- GrPathTessellator* fTessellator = nullptr;
+ skgpu::tess::PathTessellator* fTessellator = nullptr;
const GrProgramInfo* fStencilFanProgram = nullptr;
const GrProgramInfo* fStencilPathProgram = nullptr;
const GrProgramInfo* fCoverBBoxProgram = nullptr;
diff --git a/src/gpu/ops/PathTessellateOp.cpp b/src/gpu/ops/PathTessellateOp.cpp
index 6249a22..402efe2 100644
--- a/src/gpu/ops/PathTessellateOp.cpp
+++ b/src/gpu/ops/PathTessellateOp.cpp
@@ -9,7 +9,7 @@
#include "src/gpu/GrAppliedClip.h"
#include "src/gpu/GrOpFlushState.h"
-#include "src/gpu/tessellate/GrPathWedgeTessellator.h"
+#include "src/gpu/tessellate/PathWedgeTessellator.h"
#include "src/gpu/tessellate/shaders/GrPathTessellationShader.h"
namespace skgpu::v1 {
@@ -35,8 +35,9 @@
SkASSERT(!fTessellationProgram);
auto* pipeline = GrTessellationShader::MakePipeline(args, fAAType, std::move(appliedClip),
std::move(fProcessors));
- fTessellator = GrPathWedgeTessellator::Make(args.fArena, fViewMatrix, fColor,
- fPath.countVerbs(), *pipeline, *args.fCaps);
+ fTessellator = skgpu::tess::PathWedgeTessellator::Make(args.fArena, fViewMatrix, fColor,
+ fPath.countVerbs(), *pipeline,
+ *args.fCaps);
fTessellationProgram = GrTessellationShader::MakeProgram(args, fTessellator->shader(), pipeline,
fStencil);
}
diff --git a/src/gpu/ops/PathTessellateOp.h b/src/gpu/ops/PathTessellateOp.h
index d265ac2..905ffd7 100644
--- a/src/gpu/ops/PathTessellateOp.h
+++ b/src/gpu/ops/PathTessellateOp.h
@@ -11,7 +11,11 @@
#include "src/gpu/ops/GrDrawOp.h"
#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
-class GrPathTessellator;
+namespace skgpu::tess {
+
+class PathTessellator;
+
+};
namespace skgpu::v1 {
@@ -56,7 +60,7 @@
GrProcessorSet fProcessors;
// Decided during prepareTessellator.
- GrPathTessellator* fTessellator = nullptr;
+ skgpu::tess::PathTessellator* fTessellator = nullptr;
const GrProgramInfo* fTessellationProgram = nullptr;
friend class GrOp; // For ctor.
diff --git a/src/gpu/ops/StrokeTessellateOp.cpp b/src/gpu/ops/StrokeTessellateOp.cpp
index a755802..aff5ee6 100644
--- a/src/gpu/ops/StrokeTessellateOp.cpp
+++ b/src/gpu/ops/StrokeTessellateOp.cpp
@@ -11,8 +11,8 @@
#include "src/gpu/GrAppliedClip.h"
#include "src/gpu/GrOpFlushState.h"
#include "src/gpu/GrRecordingContextPriv.h"
-#include "src/gpu/tessellate/GrStrokeFixedCountTessellator.h"
-#include "src/gpu/tessellate/GrStrokeHardwareTessellator.h"
+#include "src/gpu/tessellate/StrokeFixedCountTessellator.h"
+#include "src/gpu/tessellate/StrokeHardwareTessellator.h"
#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
using DynamicStroke = GrStrokeTessellationShader::DynamicStroke;
@@ -199,15 +199,19 @@
if (can_use_hardware_tessellation(fTotalCombinedVerbCnt, *pipeline, caps)) {
// Only use hardware tessellation if we're drawing a somewhat large number of verbs.
// Otherwise we seem to be better off using instanced draws.
- fTessellator = arena->make<GrStrokeHardwareTessellator>(*caps.shaderCaps(), fShaderFlags,
- fViewMatrix, &fPathStrokeList,
- matrixMinMaxScales,
- strokeCullBounds);
+ fTessellator = arena->make<skgpu::tess::StrokeHardwareTessellator>(*caps.shaderCaps(),
+ fShaderFlags,
+ fViewMatrix,
+ &fPathStrokeList,
+ matrixMinMaxScales,
+ strokeCullBounds);
} else {
- fTessellator = arena->make<GrStrokeFixedCountTessellator>(*caps.shaderCaps(), fShaderFlags,
- fViewMatrix, &fPathStrokeList,
- matrixMinMaxScales,
- strokeCullBounds);
+ fTessellator = arena->make<skgpu::tess::StrokeFixedCountTessellator>(*caps.shaderCaps(),
+ fShaderFlags,
+ fViewMatrix,
+ &fPathStrokeList,
+ matrixMinMaxScales,
+ strokeCullBounds);
}
auto fillStencil = &GrUserStencilSettings::kUnused;
diff --git a/src/gpu/ops/StrokeTessellateOp.h b/src/gpu/ops/StrokeTessellateOp.h
index 73b5784..9bb2bb1 100644
--- a/src/gpu/ops/StrokeTessellateOp.h
+++ b/src/gpu/ops/StrokeTessellateOp.h
@@ -10,7 +10,7 @@
#include "include/core/SkStrokeRec.h"
#include "src/gpu/ops/GrDrawOp.h"
-#include "src/gpu/tessellate/GrStrokeTessellator.h"
+#include "src/gpu/tessellate/StrokeTessellator.h"
#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
class GrRecordingContext;
@@ -25,7 +25,7 @@
private:
using ShaderFlags = GrStrokeTessellationShader::ShaderFlags;
- using PathStrokeList = GrStrokeTessellator::PathStrokeList;
+ using PathStrokeList = skgpu::tess::StrokeTessellator::PathStrokeList;
DEFINE_OP_CLASS_ID
SkStrokeRec& headStroke() { return fPathStrokeList.fStroke; }
@@ -74,7 +74,7 @@
GrProcessorSet fProcessors;
bool fNeedsStencil;
- GrStrokeTessellator* fTessellator = nullptr;
+ skgpu::tess::StrokeTessellator* fTessellator = nullptr;
const GrProgramInfo* fStencilProgram = nullptr; // Only used if the stroke has transparency.
const GrProgramInfo* fFillProgram = nullptr;
};
diff --git a/src/gpu/ops/TessellationPathRenderer.cpp b/src/gpu/ops/TessellationPathRenderer.cpp
index b7beb93..90ff692 100644
--- a/src/gpu/ops/TessellationPathRenderer.cpp
+++ b/src/gpu/ops/TessellationPathRenderer.cpp
@@ -25,7 +25,7 @@
GrOp::Owner make_non_convex_fill_op(GrRecordingContext* rContext,
SkArenaAlloc* arena,
- GrTessellationPathFlags pathFlags,
+ skgpu::tess::TessellationPathFlags pathFlags,
GrAAType aaType,
const SkRect& drawBounds,
const SkMatrix& viewMatrix,
@@ -150,7 +150,7 @@
: pathDevBounds;
auto op = make_non_convex_fill_op(args.fContext,
args.fSurfaceDrawContext->arenaAlloc(),
- GrTessellationPathFlags::kNone,
+ skgpu::tess::TessellationPathFlags::kNone,
args.fAAType,
drawBounds,
*args.fViewMatrix,
@@ -194,7 +194,7 @@
auto op = make_non_convex_fill_op(args.fContext,
args.fSurfaceDrawContext->arenaAlloc(),
- GrTessellationPathFlags::kStencilOnly,
+ skgpu::tess::TessellationPathFlags::kStencilOnly,
aaType,
pathDevBounds,
*args.fViewMatrix,
diff --git a/src/gpu/tessellate/GrCullTest.h b/src/gpu/tessellate/CullTest.h
similarity index 93%
rename from src/gpu/tessellate/GrCullTest.h
rename to src/gpu/tessellate/CullTest.h
index 768f1cb..77e3726 100644
--- a/src/gpu/tessellate/GrCullTest.h
+++ b/src/gpu/tessellate/CullTest.h
@@ -5,13 +5,15 @@
* found in the LICENSE file.
*/
-#ifndef GrCullTest_DEFINED
-#define GrCullTest_DEFINED
+#ifndef tessellate_CullTest_DEFINED
+#define tessellate_CullTest_DEFINED
#include "include/core/SkMatrix.h"
#include "include/private/SkVx.h"
#include "src/gpu/GrVx.h"
+namespace skgpu::tess {
+
// This class determines whether the given local-space points will be contained in the cull bounds
// post transform. For the versions that take >1 point, it returns whether any region of their
// device-space bounding box will be in the cull bounds.
@@ -19,11 +21,11 @@
// NOTE: Our view matrix is not a normal matrix. M*p maps to the float4 [x, y, -x, -y] in device
// space. We do this to aid in quick bounds calculations. The matrix also does not have a
// translation element. Instead we unapply the translation to the cull bounds ahead of time.
-class GrCullTest {
+class CullTest {
public:
- GrCullTest() = default;
+ CullTest() = default;
- GrCullTest(const SkRect& devCullBounds, const SkMatrix& m) {
+ CullTest(const SkRect& devCullBounds, const SkMatrix& m) {
this->set(devCullBounds, m);
}
@@ -101,4 +103,6 @@
grvx::float4 fCullBounds; // [l, t, -r, -b]
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_CullTest_DEFINED
diff --git a/src/gpu/tessellate/GrStrokeFixedCountTessellator.h b/src/gpu/tessellate/GrStrokeFixedCountTessellator.h
deleted file mode 100644
index 8b67dc0..0000000
--- a/src/gpu/tessellate/GrStrokeFixedCountTessellator.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2021 Google LLC.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef GrStrokeFixedCountTessellator_DEFINED
-#define GrStrokeFixedCountTessellator_DEFINED
-
-#include "src/gpu/GrVertexChunkArray.h"
-#include "src/gpu/tessellate/GrStrokeTessellator.h"
-
-// Renders strokes as fixed-count triangle strip instances. Any extra triangles not needed by the
-// instance are emitted as degenerate triangles.
-class GrStrokeFixedCountTessellator : public GrStrokeTessellator {
-public:
- GrStrokeFixedCountTessellator(const GrShaderCaps&, ShaderFlags, const SkMatrix&,
- PathStrokeList*, std::array<float, 2> matrixMinMaxScales,
- const SkRect& strokeCullBounds);
-
- void prepare(GrMeshDrawTarget*, int totalCombinedVerbCnt) override;
-#if SK_GPU_V1
- void draw(GrOpFlushState*) const override;
-#endif
-
-private:
- GrVertexChunkArray fInstanceChunks;
- int fFixedVertexCount = 0;
-
- // Only used if sk_VertexID is not supported.
- sk_sp<const GrGpuBuffer> fVertexBufferIfNoIDSupport;
-};
-
-#endif
diff --git a/src/gpu/tessellate/GrStrokeHardwareTessellator.h b/src/gpu/tessellate/GrStrokeHardwareTessellator.h
deleted file mode 100644
index 45eb84c..0000000
--- a/src/gpu/tessellate/GrStrokeHardwareTessellator.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 GrStrokeHardwareTessellator_DEFINED
-#define GrStrokeHardwareTessellator_DEFINED
-
-#include "src/gpu/GrVertexChunkArray.h"
-#include "src/gpu/tessellate/GrStrokeTessellator.h"
-
-// Renders opaque, constant-color strokes by decomposing them into standalone tessellation patches.
-// Each patch is either a "cubic" (single stroked bezier curve with butt caps) or a "join". Requires
-// MSAA if antialiasing is desired.
-class GrStrokeHardwareTessellator : public GrStrokeTessellator {
-public:
- GrStrokeHardwareTessellator(const GrShaderCaps& shaderCaps, ShaderFlags shaderFlags,
- const SkMatrix& viewMatrix, PathStrokeList* pathStrokeList,
- std::array<float,2> matrixMinMaxScales,
- const SkRect& strokeCullBounds);
-
- void prepare(GrMeshDrawTarget*, int totalCombinedVerbCnt) override;
-#if SK_GPU_V1
- void draw(GrOpFlushState*) const override;
-#endif
-
-private:
- GrVertexChunkArray fPatchChunks;
-};
-
-#endif
diff --git a/src/gpu/tessellate/GrTessTypes.h b/src/gpu/tessellate/GrTessTypes.h
deleted file mode 100644
index e14e79c..0000000
--- a/src/gpu/tessellate/GrTessTypes.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2021 Google LLC
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef GrTessTypes_DEFINED
-#define GrTessTypes_DEFINED
-
-#include "include/gpu/GrTypes.h"
-
-// We send these flags to the internal path filling Ops to control how a path gets rendered.
-enum class GrTessellationPathFlags {
- kNone = 0,
- kStencilOnly = (1 << 0),
- kWireframe = (1 << 1)
-};
-
-GR_MAKE_BITFIELD_CLASS_OPS(GrTessellationPathFlags)
-
-#endif
diff --git a/src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h b/src/gpu/tessellate/MiddleOutPolygonTriangulator.h
similarity index 93%
rename from src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h
rename to src/gpu/tessellate/MiddleOutPolygonTriangulator.h
index 2fc1806..a05f9c2 100644
--- a/src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h
+++ b/src/gpu/tessellate/MiddleOutPolygonTriangulator.h
@@ -5,8 +5,8 @@
* found in the LICENSE file.
*/
-#ifndef GrMiddleOutPolygonTriangulator_DEFINED
-#define GrMiddleOutPolygonTriangulator_DEFINED
+#ifndef tessellate_MiddleOutPolygonTriangulator_DEFINED
+#define tessellate_MiddleOutPolygonTriangulator_DEFINED
#include "include/core/SkPath.h"
#include "include/core/SkPoint.h"
@@ -14,7 +14,9 @@
#include "src/core/SkMathPriv.h"
#include "src/core/SkPathPriv.h"
#include "src/gpu/GrVertexWriter.h"
-#include "src/gpu/tessellate/GrPathXform.h"
+#include "src/gpu/tessellate/PathXform.h"
+
+namespace skgpu::tess {
// This class emits a polygon triangulation with a "middle-out" topology. Conceptually, middle-out
// emits one large triangle with vertices on both endpoints and a middle point, then recurses on
@@ -42,13 +44,13 @@
// This class is designed to not know or store all the vertices in the polygon at once. The caller
// pushes each vertex in linear order (perhaps while parsing a path), then rather than relying on
// recursion, we manipulate an O(log N) stack to determine the correct middle-out triangulation.
-class GrMiddleOutPolygonTriangulator {
+class MiddleOutPolygonTriangulator {
public:
// Writes out 3 SkPoints per triangle to "vertexWriter". Additionally writes out "pad32Count"
// repetitions of "pad32Value" after each triangle. Set pad32Count to 0 if the triangles are
// to be tightly packed.
- GrMiddleOutPolygonTriangulator(GrVertexWriter&& vertexWriter, int pad32Count,
- uint32_t pad32Value, int maxPushVertexCalls)
+ MiddleOutPolygonTriangulator(GrVertexWriter&& vertexWriter, int pad32Count,
+ uint32_t pad32Value, int maxPushVertexCalls)
: fVertexWriter(std::move(vertexWriter))
, fPad32Count(pad32Count)
, fPad32Value(pad32Value) {
@@ -128,10 +130,10 @@
static GrVertexWriter WritePathInnerFan(GrVertexWriter&& vertexWriter,
int pad32Count,
uint32_t pad32Value,
- const GrPathXform& pathXform,
+ const PathXform& pathXform,
const SkPath& path,
int* numTrianglesWritten) {
- GrMiddleOutPolygonTriangulator middleOut(std::move(vertexWriter),
+ MiddleOutPolygonTriangulator middleOut(std::move(vertexWriter),
pad32Count,
pad32Value,
path.countVerbs());
@@ -197,4 +199,6 @@
int fTotalClosedTriangleCount = 0;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_MiddleOutPolygonTriangulator_DEFINED
diff --git a/src/gpu/tessellate/GrPathCurveTessellator.cpp b/src/gpu/tessellate/PathCurveTessellator.cpp
similarity index 90%
rename from src/gpu/tessellate/GrPathCurveTessellator.cpp
rename to src/gpu/tessellate/PathCurveTessellator.cpp
index 0d8da9c..1bcd4c0 100644
--- a/src/gpu/tessellate/GrPathCurveTessellator.cpp
+++ b/src/gpu/tessellate/PathCurveTessellator.cpp
@@ -5,18 +5,24 @@
* found in the LICENSE file.
*/
-#include "src/gpu/tessellate/GrPathCurveTessellator.h"
+#include "src/gpu/tessellate/PathCurveTessellator.h"
#include "src/core/SkUtils.h"
#include "src/gpu/GrMeshDrawTarget.h"
#include "src/gpu/GrResourceProvider.h"
#include "src/gpu/geometry/GrPathUtils.h"
#include "src/gpu/geometry/GrWangsFormula.h"
-#include "src/gpu/tessellate/GrCullTest.h"
-#include "src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h"
-#include "src/gpu/tessellate/GrPathXform.h"
+#include "src/gpu/tessellate/CullTest.h"
+#include "src/gpu/tessellate/MiddleOutPolygonTriangulator.h"
+#include "src/gpu/tessellate/PathXform.h"
#include "src/gpu/tessellate/shaders/GrPathTessellationShader.h"
+#if SK_GPU_V1
+#include "src/gpu/GrOpFlushState.h"
+#endif
+
+namespace skgpu::tess {
+
namespace {
constexpr static float kPrecision = GrTessellationShader::kLinearizationPrecision;
@@ -151,9 +157,9 @@
}
}
- GrCullTest fCullTest;
- GrVectorXform fTotalVectorXform;
- GrPathXform fPathXform;
+ CullTest fCullTest;
+ VectorXform fTotalVectorXform;
+ PathXform fPathXform;
const float fMaxSegments_pow2;
const float fMaxSegments_pow4;
@@ -165,12 +171,13 @@
} // namespace
-GrPathCurveTessellator* GrPathCurveTessellator::Make(SkArenaAlloc* arena,
- const SkMatrix& viewMatrix,
- const SkPMColor4f& color,
- DrawInnerFan drawInnerFan, int numPathVerbs,
- const GrPipeline& pipeline,
- const GrCaps& caps) {
+PathCurveTessellator* PathCurveTessellator::Make(SkArenaAlloc* arena,
+ const SkMatrix& viewMatrix,
+ const SkPMColor4f& color,
+ DrawInnerFan drawInnerFan,
+ int numPathVerbs,
+ const GrPipeline& pipeline,
+ const GrCaps& caps) {
using PatchType = GrPathTessellationShader::PatchType;
GrPathTessellationShader* shader;
if (caps.shaderCaps()->tessellationSupport() &&
@@ -185,18 +192,18 @@
PatchType::kCurves);
}
return arena->make([=](void* objStart) {
- return new(objStart) GrPathCurveTessellator(shader, drawInnerFan);
+ return new(objStart) PathCurveTessellator(shader, drawInnerFan);
});
}
GR_DECLARE_STATIC_UNIQUE_KEY(gFixedCountVertexBufferKey);
GR_DECLARE_STATIC_UNIQUE_KEY(gFixedCountIndexBufferKey);
-void GrPathCurveTessellator::prepare(GrMeshDrawTarget* target,
- const SkRect& cullBounds,
- const PathDrawList& pathDrawList,
- int totalCombinedPathVerbCnt,
- const BreadcrumbTriangleList* breadcrumbTriangleList) {
+void PathCurveTessellator::prepare(GrMeshDrawTarget* target,
+ const SkRect& cullBounds,
+ const PathDrawList& pathDrawList,
+ int totalCombinedPathVerbCnt,
+ const BreadcrumbTriangleList* breadcrumbTriangleList) {
SkASSERT(fVertexChunkArray.empty());
const GrShaderCaps& shaderCaps = *target->caps().shaderCaps();
@@ -240,7 +247,7 @@
: sk_bit_cast<uint32_t>(GrTessellationShader::kTriangularConicCurveType);
for (auto [pathMatrix, path] : pathDrawList) {
int numTrianglesWritten;
- vertexWriter = GrMiddleOutPolygonTriangulator::WritePathInnerFan(
+ vertexWriter = MiddleOutPolygonTriangulator::WritePathInnerFan(
std::move(vertexWriter),
pad32Count,
pad32Value,
@@ -344,9 +351,7 @@
}
#if SK_GPU_V1
-#include "src/gpu/GrOpFlushState.h"
-
-void GrPathCurveTessellator::draw(GrOpFlushState* flushState) const {
+void PathCurveTessellator::draw(GrOpFlushState* flushState) const {
if (fShader->willUseTessellationShaders()) {
for (const GrVertexChunk& chunk : fVertexChunkArray) {
flushState->bindBuffers(nullptr, nullptr, chunk.fBuffer);
@@ -361,11 +366,13 @@
}
}
-void GrPathCurveTessellator::drawHullInstances(
- GrOpFlushState* flushState, sk_sp<const GrGpuBuffer> vertexBufferIfNeeded) const {
+void PathCurveTessellator::drawHullInstances(GrOpFlushState* flushState,
+ sk_sp<const GrGpuBuffer> vertexBufferIfNeeded) const {
for (const GrVertexChunk& chunk : fVertexChunkArray) {
flushState->bindBuffers(nullptr, chunk.fBuffer, vertexBufferIfNeeded);
flushState->drawInstanced(chunk.fCount, chunk.fBase, 4, 0);
}
}
#endif
+
+} // namespace skgpu::tess
diff --git a/src/gpu/tessellate/GrPathCurveTessellator.h b/src/gpu/tessellate/PathCurveTessellator.h
similarity index 72%
rename from src/gpu/tessellate/GrPathCurveTessellator.h
rename to src/gpu/tessellate/PathCurveTessellator.h
index 97a960c..504877e 100644
--- a/src/gpu/tessellate/GrPathCurveTessellator.h
+++ b/src/gpu/tessellate/PathCurveTessellator.h
@@ -5,20 +5,22 @@
* found in the LICENSE file.
*/
-#ifndef GrPathCurveTessellator_DEFINED
-#define GrPathCurveTessellator_DEFINED
+#ifndef tessellate_PathCurveTessellator_DEFINED
+#define tessellate_PathCurveTessellator_DEFINED
#include "src/gpu/GrVertexChunkArray.h"
-#include "src/gpu/tessellate/GrPathTessellator.h"
+#include "src/gpu/tessellate/PathTessellator.h"
class GrCaps;
class GrGpuBuffer;
class GrPipeline;
+namespace skgpu::tess {
+
// Draws an array of "outer curve" patches and, optionally, inner fan triangles for
// GrCubicTessellateShader. Each patch is an independent 4-point curve, representing either a cubic
// or a conic. Quadratics are converted to cubics and triangles are converted to conics with w=Inf.
-class GrPathCurveTessellator : public GrPathTessellator {
+class PathCurveTessellator : public PathTessellator {
public:
// If DrawInnerFan is kNo, this class only emits the path's outer curves. In that case the
// caller is responsible to handle the path's inner fan.
@@ -28,9 +30,13 @@
};
// Creates a curve tessellator with the shader type best suited for the given path description.
- static GrPathCurveTessellator* Make(SkArenaAlloc*, const SkMatrix& viewMatrix,
- const SkPMColor4f&, DrawInnerFan, int numPathVerbs,
- const GrPipeline&, const GrCaps&);
+ static PathCurveTessellator* Make(SkArenaAlloc*,
+ const SkMatrix& viewMatrix,
+ const SkPMColor4f&,
+ DrawInnerFan,
+ int numPathVerbs,
+ const GrPipeline&,
+ const GrCaps&);
void prepare(GrMeshDrawTarget* target,
const SkRect& cullBounds,
@@ -39,7 +45,7 @@
this->prepare(target, cullBounds, pathDrawList, totalCombinedPathVerbCnt, nullptr);
}
- // Implements GrPathTessellator::prepare(), also sending an additional list of breadcrumb
+ // Implements PathTessellator::prepare(), also sending an additional list of breadcrumb
// triangles to the GPU. The breadcrumb triangles are implemented as conics with w=Infinity.
//
// ALSO NOTE: The breadcrumb triangles do not have a matrix. These need to be pre-transformed by
@@ -60,8 +66,8 @@
#endif
private:
- GrPathCurveTessellator(GrPathTessellationShader* shader, DrawInnerFan drawInnerFan)
- : GrPathTessellator(shader)
+ PathCurveTessellator(GrPathTessellationShader* shader, DrawInnerFan drawInnerFan)
+ : PathTessellator(shader)
, fDrawInnerFan(drawInnerFan == DrawInnerFan::kYes) {}
const bool fDrawInnerFan;
@@ -73,4 +79,6 @@
sk_sp<const GrGpuBuffer> fFixedCountIndexBuffer;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_PathCurveTessellator_DEFINED
diff --git a/src/gpu/tessellate/GrPathTessellator.h b/src/gpu/tessellate/PathTessellator.h
similarity index 90%
rename from src/gpu/tessellate/GrPathTessellator.h
rename to src/gpu/tessellate/PathTessellator.h
index 4be0f61..1637606 100644
--- a/src/gpu/tessellate/GrPathTessellator.h
+++ b/src/gpu/tessellate/PathTessellator.h
@@ -5,8 +5,8 @@
* found in the LICENSE file.
*/
-#ifndef GrPathTessellator_DEFINED
-#define GrPathTessellator_DEFINED
+#ifndef tessellate_PathTessellator_DEFINED
+#define tessellate_PathTessellator_DEFINED
#include "src/core/SkPathPriv.h"
#include "src/gpu/GrVertexWriter.h"
@@ -19,9 +19,11 @@
class GrOpFlushState;
class GrPathTessellationShader;
+namespace skgpu::tess {
+
// Prepares GPU data for, and then draws a path's tessellated geometry. Depending on the subclass,
// the caller may or may not be required to draw the path's inner fan separately.
-class GrPathTessellator {
+class PathTessellator {
public:
using BreadcrumbTriangleList = GrInnerFanTriangulator::BreadcrumbTriangleList;
@@ -45,7 +47,7 @@
Iter end() const { return {nullptr}; }
};
- virtual ~GrPathTessellator() {}
+ virtual ~PathTessellator() {}
const GrPathTessellationShader* shader() const { return fShader; }
@@ -75,9 +77,11 @@
}
protected:
- GrPathTessellator(GrPathTessellationShader* shader) : fShader(shader) {}
+ PathTessellator(GrPathTessellationShader* shader) : fShader(shader) {}
GrPathTessellationShader* fShader;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_PathTessellator_DEFINED
diff --git a/src/gpu/tessellate/GrPathWedgeTessellator.cpp b/src/gpu/tessellate/PathWedgeTessellator.cpp
similarity index 92%
rename from src/gpu/tessellate/GrPathWedgeTessellator.cpp
rename to src/gpu/tessellate/PathWedgeTessellator.cpp
index 778750f..5652191 100644
--- a/src/gpu/tessellate/GrPathWedgeTessellator.cpp
+++ b/src/gpu/tessellate/PathWedgeTessellator.cpp
@@ -5,16 +5,22 @@
* found in the LICENSE file.
*/
-#include "src/gpu/tessellate/GrPathWedgeTessellator.h"
+#include "src/gpu/tessellate/PathWedgeTessellator.h"
#include "src/gpu/GrMeshDrawTarget.h"
#include "src/gpu/GrResourceProvider.h"
#include "src/gpu/geometry/GrPathUtils.h"
#include "src/gpu/geometry/GrWangsFormula.h"
-#include "src/gpu/tessellate/GrCullTest.h"
-#include "src/gpu/tessellate/GrPathXform.h"
+#include "src/gpu/tessellate/CullTest.h"
+#include "src/gpu/tessellate/PathXform.h"
#include "src/gpu/tessellate/shaders/GrPathTessellationShader.h"
+#if SK_GPU_V1
+#include "src/gpu/GrOpFlushState.h"
+#endif
+
+namespace skgpu::tess {
+
namespace {
constexpr static float kPrecision = GrTessellationShader::kLinearizationPrecision;
@@ -108,6 +114,9 @@
int fMidpointWeight;
};
+} // namespace
+
+
// Writes out wedge patches, chopping as necessary so none require more segments than are supported
// by the hardware.
class WedgeWriter {
@@ -132,7 +141,7 @@
fPathXform = pathMatrix;
}
- const GrPathXform& pathXform() const { return fPathXform; }
+ const PathXform& pathXform() const { return fPathXform; }
SK_ALWAYS_INLINE void writeFlatWedge(const GrShaderCaps& shaderCaps,
SkPoint p0,
@@ -249,9 +258,9 @@
}
GrVertexChunkBuilder fChunker;
- GrCullTest fCullTest;
- GrVectorXform fTotalVectorXform;
- GrPathXform fPathXform;
+ CullTest fCullTest;
+ VectorXform fTotalVectorXform;
+ PathXform fPathXform;
const float fMaxSegments_pow2;
const float fMaxSegments_pow4;
@@ -259,12 +268,12 @@
float fNumFixedSegments_pow4 = 1;
};
-} // namespace
-
-
-GrPathTessellator* GrPathWedgeTessellator::Make(SkArenaAlloc* arena, const SkMatrix& viewMatrix,
- const SkPMColor4f& color, int numPathVerbs,
- const GrPipeline& pipeline, const GrCaps& caps) {
+PathTessellator* PathWedgeTessellator::Make(SkArenaAlloc* arena,
+ const SkMatrix& viewMatrix,
+ const SkPMColor4f& color,
+ int numPathVerbs,
+ const GrPipeline& pipeline,
+ const GrCaps& caps) {
using PatchType = GrPathTessellationShader::PatchType;
GrPathTessellationShader* shader;
if (caps.shaderCaps()->tessellationSupport() &&
@@ -279,17 +288,17 @@
PatchType::kWedges);
}
return arena->make([=](void* objStart) {
- return new(objStart) GrPathWedgeTessellator(shader);
+ return new(objStart) PathWedgeTessellator(shader);
});
}
GR_DECLARE_STATIC_UNIQUE_KEY(gFixedCountVertexBufferKey);
GR_DECLARE_STATIC_UNIQUE_KEY(gFixedCountIndexBufferKey);
-void GrPathWedgeTessellator::prepare(GrMeshDrawTarget* target,
- const SkRect& cullBounds,
- const PathDrawList& pathDrawList,
- int totalCombinedPathVerbCnt) {
+void PathWedgeTessellator::prepare(GrMeshDrawTarget* target,
+ const SkRect& cullBounds,
+ const PathDrawList& pathDrawList,
+ int totalCombinedPathVerbCnt) {
SkASSERT(fVertexChunkArray.empty());
const GrShaderCaps& shaderCaps = *target->caps().shaderCaps();
@@ -376,9 +385,7 @@
}
#if SK_GPU_V1
-#include "src/gpu/GrOpFlushState.h"
-
-void GrPathWedgeTessellator::draw(GrOpFlushState* flushState) const {
+void PathWedgeTessellator::draw(GrOpFlushState* flushState) const {
if (fShader->willUseTessellationShaders()) {
for (const GrVertexChunk& chunk : fVertexChunkArray) {
flushState->bindBuffers(nullptr, nullptr, chunk.fBuffer);
@@ -393,3 +400,5 @@
}
}
#endif
+
+} // namespace skgpu::tess
diff --git a/src/gpu/tessellate/GrPathWedgeTessellator.h b/src/gpu/tessellate/PathWedgeTessellator.h
similarity index 64%
rename from src/gpu/tessellate/GrPathWedgeTessellator.h
rename to src/gpu/tessellate/PathWedgeTessellator.h
index 2912388..afe16a7 100644
--- a/src/gpu/tessellate/GrPathWedgeTessellator.h
+++ b/src/gpu/tessellate/PathWedgeTessellator.h
@@ -5,25 +5,31 @@
* found in the LICENSE file.
*/
-#ifndef GrPathWedgeTessellator_DEFINED
-#define GrPathWedgeTessellator_DEFINED
+#ifndef tessellate_PathWedgeTessellator_DEFINED
+#define tessellate_PathWedgeTessellator_DEFINED
#include "src/gpu/GrVertexChunkArray.h"
-#include "src/gpu/tessellate/GrPathTessellator.h"
+#include "src/gpu/tessellate/PathTessellator.h"
class GrCaps;
class GrGpuBuffer;
class GrPipeline;
+namespace skgpu::tess {
+
// Prepares an array of "wedge" patches for GrWedgeTessellateShader. A wedge is an independent,
// 5-point closed contour consisting of 4 control points plus an anchor point fanning from the
// center of the curve's resident contour. A wedge can be either a cubic or a conic. Quadratics and
// lines are converted to cubics. Once stencilled, these wedges alone define the complete path.
-class GrPathWedgeTessellator : public GrPathTessellator {
+class PathWedgeTessellator : public PathTessellator {
public:
// Creates a wedge tessellator with the shader type best suited for the given path description.
- static GrPathTessellator* Make(SkArenaAlloc*, const SkMatrix& viewMatrix, const SkPMColor4f&,
- int numPathVerbs, const GrPipeline&, const GrCaps&);
+ static PathTessellator* Make(SkArenaAlloc*,
+ const SkMatrix& viewMatrix,
+ const SkPMColor4f&,
+ int numPathVerbs,
+ const GrPipeline&,
+ const GrCaps&);
void prepare(GrMeshDrawTarget*,
const SkRect& cullBounds,
@@ -36,8 +42,7 @@
#endif
private:
- GrPathWedgeTessellator(GrPathTessellationShader* shader)
- : GrPathTessellator(shader) {}
+ PathWedgeTessellator(GrPathTessellationShader* shader) : PathTessellator(shader) {}
GrVertexChunkArray fVertexChunkArray;
@@ -47,4 +52,6 @@
sk_sp<const GrGpuBuffer> fFixedCountIndexBuffer;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_PathWedgeTessellator_DEFINED
diff --git a/src/gpu/tessellate/GrPathXform.h b/src/gpu/tessellate/PathXform.h
similarity index 91%
rename from src/gpu/tessellate/GrPathXform.h
rename to src/gpu/tessellate/PathXform.h
index c4f3aac..c877aae 100644
--- a/src/gpu/tessellate/GrPathXform.h
+++ b/src/gpu/tessellate/PathXform.h
@@ -5,28 +5,30 @@
* found in the LICENSE file.
*/
-#ifndef GrPathXform_DEFINED
-#define GrPathXform_DEFINED
+#ifndef tessellate_PathXform_DEFINED
+#define tessellate_PathXform_DEFINED
#include "include/core/SkMatrix.h"
#include "src/gpu/GrVertexWriter.h"
#include "src/gpu/GrVx.h"
+namespace skgpu::tess {
+
// Applies an affine 2d transformation to points and path components. Converts path components to
// tessellation patches. Uses SIMD, but takes care to map points identically, regardless of which
// method is called.
//
// This class stores redundant data, so it is best used only as a stack-allocated object at the
// point of use.
-class GrPathXform {
+class PathXform {
using float2 = grvx::float2;
using float4 = grvx::float4;
public:
- GrPathXform() = default;
- GrPathXform(const SkMatrix& m) { *this = m; }
+ PathXform() = default;
+ PathXform(const SkMatrix& m) { *this = m; }
- GrPathXform& operator=(const SkMatrix& m) {
+ PathXform& operator=(const SkMatrix& m) {
SkASSERT(!m.hasPerspective());
// Duplicate the matrix in float4.lo and float4.hi so we can map two points at once.
fScale = {m.getScaleX(), m.getScaleY(), m.getScaleX(), m.getScaleY()};
@@ -92,4 +94,6 @@
float4 fTrans;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_PathXform_DEFINED
diff --git a/src/gpu/tessellate/GrStrokeFixedCountTessellator.cpp b/src/gpu/tessellate/StrokeFixedCountTessellator.cpp
similarity index 91%
rename from src/gpu/tessellate/GrStrokeFixedCountTessellator.cpp
rename to src/gpu/tessellate/StrokeFixedCountTessellator.cpp
index d517726..2bd3370 100644
--- a/src/gpu/tessellate/GrStrokeFixedCountTessellator.cpp
+++ b/src/gpu/tessellate/StrokeFixedCountTessellator.cpp
@@ -5,15 +5,21 @@
* found in the LICENSE file.
*/
-#include "src/gpu/tessellate/GrStrokeFixedCountTessellator.h"
+#include "src/gpu/tessellate/StrokeFixedCountTessellator.h"
#include "src/core/SkGeometry.h"
#include "src/gpu/GrMeshDrawTarget.h"
#include "src/gpu/GrResourceProvider.h"
#include "src/gpu/geometry/GrPathUtils.h"
#include "src/gpu/geometry/GrWangsFormula.h"
-#include "src/gpu/tessellate/GrCullTest.h"
-#include "src/gpu/tessellate/GrStrokeIterator.h"
+#include "src/gpu/tessellate/CullTest.h"
+#include "src/gpu/tessellate/StrokeIterator.h"
+
+#if SK_GPU_V1
+#include "src/gpu/GrOpFlushState.h"
+#endif
+
+namespace skgpu::tess {
namespace {
@@ -25,7 +31,7 @@
// will just add enough additional segments to handle a worst-case 180 degree stroke.)
class InstanceWriter {
public:
- using ShaderFlags = GrStrokeTessellator::ShaderFlags;
+ using ShaderFlags = StrokeTessellator::ShaderFlags;
InstanceWriter(const GrShaderCaps* shaderCaps, ShaderFlags shaderFlags,
GrMeshDrawTarget* target, float matrixMaxScale, const SkRect& strokeCullBounds,
@@ -35,7 +41,7 @@
, fShaderFlags(shaderFlags)
, fCullTest(strokeCullBounds, viewMatrix)
, fChunkBuilder(target, patchChunks, instanceStride, minInstancesPerChunk)
- , fParametricPrecision(GrStrokeTolerances::CalcParametricPrecision(matrixMaxScale)) {
+ , fParametricPrecision(StrokeTolerances::CalcParametricPrecision(matrixMaxScale)) {
}
float parametricPrecision() const { return fParametricPrecision; }
@@ -217,7 +223,7 @@
const GrShaderCaps* fShaderCaps;
const ShaderFlags fShaderFlags;
- const GrCullTest fCullTest;
+ const CullTest fCullTest;
GrVertexChunkBuilder fChunkBuilder;
const float fParametricPrecision;
float fMaxParametricSegments_pow4 = 1;
@@ -235,7 +241,7 @@
};
// Returns the worst-case number of edges we will need in order to draw a join of the given type.
-static int worst_case_edges_in_join(SkPaint::Join joinType, float numRadialSegmentsPerRadian) {
+int worst_case_edges_in_join(SkPaint::Join joinType, float numRadialSegmentsPerRadian) {
int numEdges = GrStrokeTessellationShader::NumFixedEdgesInJoin(joinType);
if (joinType == SkPaint::kRound_Join) {
// For round joins we need to count the radial edges on our own. Account for a worst-case
@@ -247,21 +253,21 @@
} // namespace
-GrStrokeFixedCountTessellator::GrStrokeFixedCountTessellator(const GrShaderCaps& shaderCaps,
- ShaderFlags shaderFlags,
- const SkMatrix& viewMatrix,
- PathStrokeList* pathStrokeList,
- std::array<float,2> matrixMinMaxScales,
- const SkRect& strokeCullBounds)
- : GrStrokeTessellator(shaderCaps, GrStrokeTessellationShader::Mode::kFixedCount,
- shaderFlags, kMaxParametricSegments_log2, viewMatrix,
- pathStrokeList, matrixMinMaxScales, strokeCullBounds) {
+
+StrokeFixedCountTessellator::StrokeFixedCountTessellator(const GrShaderCaps& shaderCaps,
+ ShaderFlags shaderFlags,
+ const SkMatrix& viewMatrix,
+ PathStrokeList* pathStrokeList,
+ std::array<float,2> matrixMinMaxScales,
+ const SkRect& strokeCullBounds)
+ : StrokeTessellator(shaderCaps, GrStrokeTessellationShader::Mode::kFixedCount, shaderFlags,
+ kMaxParametricSegments_log2, viewMatrix, pathStrokeList,
+ matrixMinMaxScales, strokeCullBounds) {
}
GR_DECLARE_STATIC_UNIQUE_KEY(gVertexIDFallbackBufferKey);
-void GrStrokeFixedCountTessellator::prepare(GrMeshDrawTarget* target,
- int totalCombinedVerbCnt) {
+void StrokeFixedCountTessellator::prepare(GrMeshDrawTarget* target, int totalCombinedVerbCnt) {
int maxEdgesInJoin = 0;
float maxRadialSegmentsPerRadian = 0;
@@ -278,9 +284,9 @@
if (!fShader.hasDynamicStroke()) {
// Strokes are static. Calculate tolerances once.
const SkStrokeRec& stroke = fPathStrokeList->fStroke;
- float localStrokeWidth = GrStrokeTolerances::GetLocalStrokeWidth(fMatrixMinMaxScales.data(),
- stroke.getWidth());
- float numRadialSegmentsPerRadian = GrStrokeTolerances::CalcNumRadialSegmentsPerRadian(
+ float localStrokeWidth = StrokeTolerances::GetLocalStrokeWidth(fMatrixMinMaxScales.data(),
+ stroke.getWidth());
+ float numRadialSegmentsPerRadian = StrokeTolerances::CalcNumRadialSegmentsPerRadian(
instanceWriter.parametricPrecision(), localStrokeWidth);
maxEdgesInJoin = worst_case_edges_in_join(stroke.getJoin(), numRadialSegmentsPerRadian);
maxRadialSegmentsPerRadian = numRadialSegmentsPerRadian;
@@ -288,7 +294,7 @@
// Fast SIMD queue that buffers up values for "numRadialSegmentsPerRadian". Only used when we
// have dynamic stroke.
- GrStrokeToleranceBuffer toleranceBuffer(instanceWriter.parametricPrecision());
+ StrokeToleranceBuffer toleranceBuffer(instanceWriter.parametricPrecision());
for (PathStrokeList* pathStroke = fPathStrokeList; pathStroke; pathStroke = pathStroke->fNext) {
const SkStrokeRec& stroke = pathStroke->fStroke;
@@ -306,11 +312,11 @@
if (fShader.hasDynamicColor()) {
instanceWriter.updateDynamicColor(pathStroke->fColor);
}
- GrStrokeIterator strokeIter(pathStroke->fPath, &pathStroke->fStroke, &fShader.viewMatrix());
+ StrokeIterator strokeIter(pathStroke->fPath, &pathStroke->fStroke, &fShader.viewMatrix());
while (strokeIter.next()) {
const SkPoint* p = strokeIter.pts();
switch (strokeIter.verb()) {
- using Verb = GrStrokeIterator::Verb;
+ using Verb = StrokeIterator::Verb;
int numChops;
case Verb::kContourFinished:
instanceWriter.finishContour();
@@ -445,9 +451,7 @@
}
#if SK_GPU_V1
-#include "src/gpu/GrOpFlushState.h"
-
-void GrStrokeFixedCountTessellator::draw(GrOpFlushState* flushState) const {
+void StrokeFixedCountTessellator::draw(GrOpFlushState* flushState) const {
if (fInstanceChunks.empty() || fFixedVertexCount <= 0) {
return;
}
@@ -457,3 +461,5 @@
}
}
#endif
+
+} // namespace skgpu::tess
diff --git a/src/gpu/tessellate/StrokeFixedCountTessellator.h b/src/gpu/tessellate/StrokeFixedCountTessellator.h
new file mode 100644
index 0000000..45eb42f
--- /dev/null
+++ b/src/gpu/tessellate/StrokeFixedCountTessellator.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 Google LLC.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef tessellate_StrokeFixedCountTessellator_DEFINED
+#define tessellate_StrokeFixedCountTessellator_DEFINED
+
+#include "src/gpu/GrVertexChunkArray.h"
+#include "src/gpu/tessellate/StrokeTessellator.h"
+
+namespace skgpu::tess {
+
+// Renders strokes as fixed-count triangle strip instances. Any extra triangles not needed by the
+// instance are emitted as degenerate triangles.
+class StrokeFixedCountTessellator : public StrokeTessellator {
+public:
+ StrokeFixedCountTessellator(const GrShaderCaps&,
+ ShaderFlags,
+ const SkMatrix&,
+ PathStrokeList*,
+ std::array<float, 2> matrixMinMaxScales,
+ const SkRect& strokeCullBounds);
+
+ void prepare(GrMeshDrawTarget*, int totalCombinedVerbCnt) override;
+#if SK_GPU_V1
+ void draw(GrOpFlushState*) const override;
+#endif
+
+private:
+ GrVertexChunkArray fInstanceChunks;
+ int fFixedVertexCount = 0;
+
+ // Only used if sk_VertexID is not supported.
+ sk_sp<const GrGpuBuffer> fVertexBufferIfNoIDSupport;
+};
+
+} // namespace skgpu::tess
+
+#endif // tessellate_StrokeFixedCountTessellator_DEFINED
diff --git a/src/gpu/tessellate/GrStrokeHardwareTessellator.cpp b/src/gpu/tessellate/StrokeHardwareTessellator.cpp
similarity index 96%
rename from src/gpu/tessellate/GrStrokeHardwareTessellator.cpp
rename to src/gpu/tessellate/StrokeHardwareTessellator.cpp
index d0a1469..ba90943 100644
--- a/src/gpu/tessellate/GrStrokeHardwareTessellator.cpp
+++ b/src/gpu/tessellate/StrokeHardwareTessellator.cpp
@@ -5,7 +5,7 @@
* found in the LICENSE file.
*/
-#include "src/gpu/tessellate/GrStrokeHardwareTessellator.h"
+#include "src/gpu/tessellate/StrokeHardwareTessellator.h"
#include "src/core/SkMathPriv.h"
#include "src/core/SkPathPriv.h"
@@ -14,11 +14,17 @@
#include "src/gpu/GrVx.h"
#include "src/gpu/geometry/GrPathUtils.h"
#include "src/gpu/geometry/GrWangsFormula.h"
-#include "src/gpu/tessellate/GrCullTest.h"
+#include "src/gpu/tessellate/CullTest.h"
+
+#if SK_GPU_V1
+#include "src/gpu/GrOpFlushState.h"
+#endif
+
+namespace skgpu::tess {
namespace {
-static float num_combined_segments(float numParametricSegments, float numRadialSegments) {
+float num_combined_segments(float numParametricSegments, float numRadialSegments) {
// The first and last edges are shared by both the parametric and radial sets of edges, so
// the total number of edges is:
//
@@ -37,14 +43,14 @@
return numParametricSegments + numRadialSegments - 1;
}
-static grvx::float2 pow4(grvx::float2 x) {
+grvx::float2 pow4(grvx::float2 x) {
auto xx = x*x;
return xx*xx;
}
class PatchWriter {
public:
- using ShaderFlags = GrStrokeTessellator::ShaderFlags;
+ using ShaderFlags = StrokeTessellator::ShaderFlags;
enum class JoinType {
kMiter = SkPaint::kMiter_Join,
@@ -62,7 +68,7 @@
// Subtract 2 because the tessellation shader chops every cubic at two locations, and
// each chop has the potential to introduce an extra segment.
, fMaxTessellationSegments(target->caps().shaderCaps()->maxTessellationSegments() - 2)
- , fParametricPrecision(GrStrokeTolerances::CalcParametricPrecision(matrixMaxScale)) {
+ , fParametricPrecision(StrokeTolerances::CalcParametricPrecision(matrixMaxScale)) {
}
// This is the precision value, adjusted for the view matrix, to use with Wang's formulas when
@@ -626,7 +632,7 @@
}
const ShaderFlags fShaderFlags;
- const GrCullTest fCullTest;
+ const CullTest fCullTest;
GrVertexChunkBuilder fChunkBuilder;
// The maximum number of tessellation segments the hardware can emit for a single patch.
@@ -668,7 +674,7 @@
GrVertexColor fDynamicColor;
};
-SK_ALWAYS_INLINE static bool cubic_has_cusp(const SkPoint p[4]) {
+SK_ALWAYS_INLINE bool cubic_has_cusp(const SkPoint p[4]) {
using grvx::float2;
float2 p0 = skvx::bit_pun<float2>(p[0]);
@@ -704,18 +710,19 @@
} // namespace
-GrStrokeHardwareTessellator::GrStrokeHardwareTessellator(const GrShaderCaps& shaderCaps,
- ShaderFlags shaderFlags,
- const SkMatrix& viewMatrix,
- PathStrokeList* pathStrokeList,
- std::array<float,2> matrixMinMaxScales,
- const SkRect& strokeCullBounds)
- : GrStrokeTessellator(shaderCaps, GrStrokeTessellationShader::Mode::kHardwareTessellation,
- shaderFlags, SkNextLog2(shaderCaps.maxTessellationSegments()),
- viewMatrix, pathStrokeList, matrixMinMaxScales, strokeCullBounds) {
+
+StrokeHardwareTessellator::StrokeHardwareTessellator(const GrShaderCaps& shaderCaps,
+ ShaderFlags shaderFlags,
+ const SkMatrix& viewMatrix,
+ PathStrokeList* pathStrokeList,
+ std::array<float,2> matrixMinMaxScales,
+ const SkRect& strokeCullBounds)
+ : StrokeTessellator(shaderCaps, GrStrokeTessellationShader::Mode::kHardwareTessellation,
+ shaderFlags, SkNextLog2(shaderCaps.maxTessellationSegments()),
+ viewMatrix, pathStrokeList, matrixMinMaxScales, strokeCullBounds) {
}
-void GrStrokeHardwareTessellator::prepare(GrMeshDrawTarget* target, int totalCombinedVerbCnt) {
+void StrokeHardwareTessellator::prepare(GrMeshDrawTarget* target, int totalCombinedVerbCnt) {
using JoinType = PatchWriter::JoinType;
// Over-allocate enough patches for 1 in 4 strokes to chop and for 8 extra caps.
@@ -729,16 +736,16 @@
if (!fShader.hasDynamicStroke()) {
// Strokes are static. Calculate tolerances once.
const SkStrokeRec& stroke = fPathStrokeList->fStroke;
- float localStrokeWidth = GrStrokeTolerances::GetLocalStrokeWidth(fMatrixMinMaxScales.data(),
- stroke.getWidth());
- float numRadialSegmentsPerRadian = GrStrokeTolerances::CalcNumRadialSegmentsPerRadian(
+ float localStrokeWidth = StrokeTolerances::GetLocalStrokeWidth(fMatrixMinMaxScales.data(),
+ stroke.getWidth());
+ float numRadialSegmentsPerRadian = StrokeTolerances::CalcNumRadialSegmentsPerRadian(
patchWriter.parametricPrecision(), localStrokeWidth);
patchWriter.updateTolerances(numRadialSegmentsPerRadian, stroke.getJoin());
}
// Fast SIMD queue that buffers up values for "numRadialSegmentsPerRadian". Only used when we
// have dynamic strokes.
- GrStrokeToleranceBuffer toleranceBuffer(patchWriter.parametricPrecision());
+ StrokeToleranceBuffer toleranceBuffer(patchWriter.parametricPrecision());
for (PathStrokeList* pathStroke = fPathStrokeList; pathStroke; pathStroke = pathStroke->fNext) {
const SkStrokeRec& stroke = pathStroke->fStroke;
@@ -898,13 +905,12 @@
}
#if SK_GPU_V1
-#include "src/gpu/GrOpFlushState.h"
-
-void GrStrokeHardwareTessellator::draw(GrOpFlushState* flushState) const {
+void StrokeHardwareTessellator::draw(GrOpFlushState* flushState) const {
for (const auto& vertexChunk : fPatchChunks) {
flushState->bindBuffers(nullptr, nullptr, vertexChunk.fBuffer);
flushState->draw(vertexChunk.fCount, vertexChunk.fBase);
}
}
-
#endif
+
+} // namespace skgpu::tess
diff --git a/src/gpu/tessellate/StrokeHardwareTessellator.h b/src/gpu/tessellate/StrokeHardwareTessellator.h
new file mode 100644
index 0000000..563d210
--- /dev/null
+++ b/src/gpu/tessellate/StrokeHardwareTessellator.h
@@ -0,0 +1,39 @@
+/*
+ * 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 tessellate_StrokeHardwareTessellator_DEFINED
+#define tessellate_StrokeHardwareTessellator_DEFINED
+
+#include "src/gpu/GrVertexChunkArray.h"
+#include "src/gpu/tessellate/StrokeTessellator.h"
+
+namespace skgpu::tess {
+
+// Renders opaque, constant-color strokes by decomposing them into standalone tessellation patches.
+// Each patch is either a "cubic" (single stroked bezier curve with butt caps) or a "join". Requires
+// MSAA if antialiasing is desired.
+class StrokeHardwareTessellator : public StrokeTessellator {
+public:
+ StrokeHardwareTessellator(const GrShaderCaps& shaderCaps,
+ ShaderFlags shaderFlags,
+ const SkMatrix& viewMatrix,
+ PathStrokeList* pathStrokeList,
+ std::array<float,2> matrixMinMaxScales,
+ const SkRect& strokeCullBounds);
+
+ void prepare(GrMeshDrawTarget*, int totalCombinedVerbCnt) override;
+#if SK_GPU_V1
+ void draw(GrOpFlushState*) const override;
+#endif
+
+private:
+ GrVertexChunkArray fPatchChunks;
+};
+
+} // namespace skgpu::tess
+
+#endif // tessellate_StrokeHardwareTessellator_DEFINED
diff --git a/src/gpu/tessellate/GrStrokeIterator.h b/src/gpu/tessellate/StrokeIterator.h
similarity index 97%
rename from src/gpu/tessellate/GrStrokeIterator.h
rename to src/gpu/tessellate/StrokeIterator.h
index a4c86dc..ee3e46d 100644
--- a/src/gpu/tessellate/GrStrokeIterator.h
+++ b/src/gpu/tessellate/StrokeIterator.h
@@ -5,20 +5,22 @@
* found in the LICENSE file.
*/
-#ifndef GrStrokeIterator_DEFINED
-#define GrStrokeIterator_DEFINED
+#ifndef tessellate_StrokeIterator_DEFINED
+#define tessellate_StrokeIterator_DEFINED
#include "include/core/SkPaint.h"
#include "include/core/SkStrokeRec.h"
#include "src/core/SkPathPriv.h"
#include <array>
+namespace skgpu::tess {
+
// This class iterates over the stroke geometry defined by a path and stroke. It automatically
// converts closes and square caps to lines, and round caps to circles so the user doesn't have to
// worry about it. At each location it provides a verb and "prevVerb" so there is context about the
// preceding join. Usage:
//
-// GrStrokeIterator iter(path, stroke);
+// StrokeIterator iter(path, stroke);
// while (iter.next()) { // Call next() first.
// iter.verb();
// iter.pts();
@@ -27,9 +29,9 @@
// iter.prevPts();
// }
//
-class GrStrokeIterator {
+class StrokeIterator {
public:
- GrStrokeIterator(const SkPath& path, const SkStrokeRec* stroke, const SkMatrix* viewMatrix)
+ StrokeIterator(const SkPath& path, const SkStrokeRec* stroke, const SkMatrix* viewMatrix)
: fViewMatrix(viewMatrix), fStroke(stroke) {
SkPathPriv::Iterate it(path);
fIter = it.begin();
@@ -364,4 +366,8 @@
std::array<SkPoint, 2> fBeginningCapPts;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_StrokeIterator_DEFINED
+
+
diff --git a/src/gpu/tessellate/GrStrokeTessellator.h b/src/gpu/tessellate/StrokeTessellator.h
similarity index 83%
rename from src/gpu/tessellate/GrStrokeTessellator.h
rename to src/gpu/tessellate/StrokeTessellator.h
index 0a4b865..ff108a2 100644
--- a/src/gpu/tessellate/GrStrokeTessellator.h
+++ b/src/gpu/tessellate/StrokeTessellator.h
@@ -5,8 +5,8 @@
* found in the LICENSE file.
*/
-#ifndef GrStrokeTessellator_DEFINED
-#define GrStrokeTessellator_DEFINED
+#ifndef tessellate_StrokeTessellator_DEFINED
+#define tessellate_StrokeTessellator_DEFINED
#include "src/gpu/GrVx.h"
#include "src/gpu/tessellate/shaders/GrStrokeTessellationShader.h"
@@ -14,8 +14,10 @@
class GrMeshDrawTarget;
class GrOpFlushState;
+namespace skgpu::tess {
+
// Prepares GPU data for, and then draws a stroke's tessellated geometry.
-class GrStrokeTessellator {
+class StrokeTessellator {
public:
using ShaderFlags = GrStrokeTessellationShader::ShaderFlags;
@@ -28,10 +30,14 @@
PathStrokeList* fNext = nullptr;
};
- GrStrokeTessellator(const GrShaderCaps& shaderCaps, GrStrokeTessellationShader::Mode shaderMode,
- ShaderFlags shaderFlags, int8_t maxParametricSegments_log2,
- const SkMatrix& viewMatrix, PathStrokeList* pathStrokeList,
- std::array<float, 2> matrixMinMaxScales, const SkRect& strokeCullBounds)
+ StrokeTessellator(const GrShaderCaps& shaderCaps,
+ GrStrokeTessellationShader::Mode shaderMode,
+ ShaderFlags shaderFlags,
+ int8_t maxParametricSegments_log2,
+ const SkMatrix& viewMatrix,
+ PathStrokeList* pathStrokeList,
+ std::array<float, 2> matrixMinMaxScales,
+ const SkRect& strokeCullBounds)
: fShader(shaderCaps, shaderMode, shaderFlags, viewMatrix, pathStrokeList->fStroke,
pathStrokeList->fColor, maxParametricSegments_log2)
, fPathStrokeList(pathStrokeList)
@@ -50,7 +56,7 @@
virtual void draw(GrOpFlushState*) const = 0;
#endif
- virtual ~GrStrokeTessellator() {}
+ virtual ~StrokeTessellator() {}
protected:
GrStrokeTessellationShader fShader;
@@ -61,7 +67,7 @@
// These tolerances decide the number of parametric and radial segments the tessellator will
// linearize strokes into. These decisions are made in (pre-viewMatrix) local path space.
-struct GrStrokeTolerances {
+struct StrokeTolerances {
// Decides the number of parametric segments the tessellator adds for each curve. (Uniform
// steps in parametric space.) The tessellator will add enough parametric segments so that,
// once transformed into device space, they never deviate by more than
@@ -109,11 +115,11 @@
}
return localStrokeWidth;
}
- static GrStrokeTolerances Make(const float matrixMinMaxScales[2], float strokeWidth) {
+ static StrokeTolerances Make(const float matrixMinMaxScales[2], float strokeWidth) {
return MakeNonHairline(matrixMinMaxScales[1],
GetLocalStrokeWidth(matrixMinMaxScales, strokeWidth));
}
- static GrStrokeTolerances MakeNonHairline(float matrixMaxScale, float strokeWidth) {
+ static StrokeTolerances MakeNonHairline(float matrixMaxScale, float strokeWidth) {
SkASSERT(strokeWidth > 0);
float parametricPrecision = CalcParametricPrecision(matrixMaxScale);
return {parametricPrecision,
@@ -124,17 +130,15 @@
};
// Calculates and buffers up future values for "numRadialSegmentsPerRadian" using SIMD.
-class alignas(sizeof(float) * 4) GrStrokeToleranceBuffer {
+class alignas(sizeof(float) * 4) StrokeToleranceBuffer {
public:
- using PathStrokeList = GrStrokeTessellator::PathStrokeList;
+ using PathStrokeList = StrokeTessellator::PathStrokeList;
- GrStrokeToleranceBuffer(float parametricPrecision)
- : fParametricPrecision(parametricPrecision) {
- }
+ StrokeToleranceBuffer(float parametricPrecision) : fParametricPrecision(parametricPrecision) {}
float fetchRadialSegmentsPerRadian(PathStrokeList* head) {
// StrokeTessellateOp::onCombineIfPossible does not allow hairlines to become dynamic. If
- // this changes, we will need to call GrStrokeTolerances::GetLocalStrokeWidth() for each
+ // this changes, we will need to call StrokeTolerances::GetLocalStrokeWidth() for each
// stroke.
SkASSERT(!head->fStroke.isHairlineStyle());
if (fBufferIdx == 4) {
@@ -144,8 +148,8 @@
do {
fStrokeWidths[i++] = peekAhead->fStroke.getWidth();
} while ((peekAhead = peekAhead->fNext) && i < 4);
- auto tol = GrStrokeTolerances::ApproxNumRadialSegmentsPerRadian(fParametricPrecision,
- fStrokeWidths);
+ auto tol = StrokeTolerances::ApproxNumRadialSegmentsPerRadian(fParametricPrecision,
+ fStrokeWidths);
tol.store(fNumRadialSegmentsPerRadian);
fBufferIdx = 0;
}
@@ -161,4 +165,6 @@
int fBufferIdx = 4; // Initialize the buffer as "empty";
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_StrokeTessellator_DEFINED
diff --git a/src/gpu/tessellate/TessTypes.h b/src/gpu/tessellate/TessTypes.h
new file mode 100644
index 0000000..56c1734
--- /dev/null
+++ b/src/gpu/tessellate/TessTypes.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2021 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef tessellate_TessTypes_DEFINED
+#define tessellate_TessTypes_DEFINED
+
+#include "include/gpu/GrTypes.h"
+
+namespace skgpu::tess {
+
+// We send these flags to the internal path filling Ops to control how a path gets rendered.
+enum class TessellationPathFlags {
+ kNone = 0,
+ kStencilOnly = (1 << 0),
+ kWireframe = (1 << 1)
+};
+
+GR_MAKE_BITFIELD_CLASS_OPS(TessellationPathFlags)
+
+} // namespace skgpu::tess
+
+#endif // tessellate_TessTypes_DEFINED
diff --git a/src/gpu/tessellate/GrVectorXform.h b/src/gpu/tessellate/VectorXform.h
similarity index 86%
rename from src/gpu/tessellate/GrVectorXform.h
rename to src/gpu/tessellate/VectorXform.h
index d80f28e..c093730 100644
--- a/src/gpu/tessellate/GrVectorXform.h
+++ b/src/gpu/tessellate/VectorXform.h
@@ -5,23 +5,25 @@
* found in the LICENSE file.
*/
-#ifndef GrVectorXform_DEFINED
-#define GrVectorXform_DEFINED
+#ifndef tessellate_VectorXform_DEFINED
+#define tessellate_VectorXform_DEFINED
#include "include/core/SkMatrix.h"
#include "include/private/SkVx.h"
+namespace skgpu::tess {
+
// Represents the upper-left 2x2 matrix of an affine transform for applying to vectors:
//
// VectorXform(p1 - p0) == M * float3(p1, 1) - M * float3(p0, 1)
//
-class GrVectorXform {
+class VectorXform {
public:
using float2 = skvx::Vec<2, float>;
using float4 = skvx::Vec<4, float>;
- explicit GrVectorXform() : fType(Type::kIdentity) {}
- explicit GrVectorXform(const SkMatrix& m) { *this = m; }
- GrVectorXform& operator=(const SkMatrix& m) {
+ explicit VectorXform() : fType(Type::kIdentity) {}
+ explicit VectorXform(const SkMatrix& m) { *this = m; }
+ VectorXform& operator=(const SkMatrix& m) {
SkASSERT(!m.hasPerspective());
if (m.getType() & SkMatrix::kAffine_Mask) {
fType = Type::kAffine;
@@ -69,4 +71,6 @@
float4 fSkewXYXY;
};
-#endif
+} // namespace skgpu::tess
+
+#endif // tessellate_VectorXform_DEFINED
diff --git a/src/gpu/tessellate/shaders/GrPathTessellationShader.cpp b/src/gpu/tessellate/shaders/GrPathTessellationShader.cpp
index e310c87..12c86b6 100644
--- a/src/gpu/tessellate/shaders/GrPathTessellationShader.cpp
+++ b/src/gpu/tessellate/shaders/GrPathTessellationShader.cpp
@@ -56,9 +56,9 @@
const GrPipeline* GrPathTessellationShader::MakeStencilOnlyPipeline(
const ProgramArgs& args,
GrAAType aaType,
- GrTessellationPathFlags pathFlags,
+ skgpu::tess::TessellationPathFlags pathFlags,
const GrAppliedHardClip& hardClip) {
- using PathFlags = GrTessellationPathFlags;
+ using PathFlags = skgpu::tess::TessellationPathFlags;
GrPipeline::InitArgs pipelineArgs;
if (args.fCaps->wireframeSupport() && (pathFlags & PathFlags::kWireframe)) {
pipelineArgs.fInputFlags |= GrPipeline::InputFlags::kWireframe;
diff --git a/src/gpu/tessellate/shaders/GrPathTessellationShader.h b/src/gpu/tessellate/shaders/GrPathTessellationShader.h
index 66aa922..f08368b 100644
--- a/src/gpu/tessellate/shaders/GrPathTessellationShader.h
+++ b/src/gpu/tessellate/shaders/GrPathTessellationShader.h
@@ -8,7 +8,7 @@
#ifndef GrPathTessellationShader_DEFINED
#define GrPathTessellationShader_DEFINED
-#include "src/gpu/tessellate/GrTessTypes.h"
+#include "src/gpu/tessellate/TessTypes.h"
#include "src/gpu/tessellate/shaders/GrTessellationShader.h"
// This is the base class for shaders in the GPU tessellator that fill paths.
@@ -154,7 +154,7 @@
// Creates a pipeline that does not write to the color buffer.
static const GrPipeline* MakeStencilOnlyPipeline(const ProgramArgs&,
GrAAType,
- GrTessellationPathFlags,
+ skgpu::tess::TessellationPathFlags,
const GrAppliedHardClip&);
protected:
diff --git a/src/gpu/tessellate/shaders/GrStrokeTessellationShader.cpp b/src/gpu/tessellate/shaders/GrStrokeTessellationShader.cpp
index 20dc354..335574d 100644
--- a/src/gpu/tessellate/shaders/GrStrokeTessellationShader.cpp
+++ b/src/gpu/tessellate/shaders/GrStrokeTessellationShader.cpp
@@ -10,7 +10,7 @@
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
#include "src/gpu/glsl/GrGLSLVarying.h"
#include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
-#include "src/gpu/tessellate/GrStrokeTessellator.h"
+#include "src/gpu/tessellate/StrokeTessellator.h"
GrStrokeTessellationShader::GrStrokeTessellationShader(const GrShaderCaps& shaderCaps, Mode mode,
ShaderFlags shaderFlags,
@@ -349,14 +349,14 @@
if (!shader.hasDynamicStroke()) {
// Set up the tessellation control uniforms.
- GrStrokeTolerances tolerances;
+ skgpu::tess::StrokeTolerances tolerances;
if (!stroke.isHairlineStyle()) {
- tolerances = GrStrokeTolerances::MakeNonHairline(shader.viewMatrix().getMaxScale(),
- stroke.getWidth());
+ tolerances = skgpu::tess::StrokeTolerances::MakeNonHairline(
+ shader.viewMatrix().getMaxScale(), stroke.getWidth());
} else {
// In the hairline case we transform prior to tessellation. Set up tolerances for an
// identity viewMatrix and a strokeWidth of 1.
- tolerances = GrStrokeTolerances::MakeNonHairline(1, 1);
+ tolerances = skgpu::tess::StrokeTolerances::MakeNonHairline(1, 1);
}
float strokeRadius = (stroke.isHairlineStyle()) ? .5f : stroke.getWidth() * .5;
pdman.set4f(fTessControlArgsUniform,
@@ -368,7 +368,7 @@
SkASSERT(!stroke.isHairlineStyle());
float maxScale = shader.viewMatrix().getMaxScale();
pdman.set1f(fTessControlArgsUniform,
- GrStrokeTolerances::CalcParametricPrecision(maxScale));
+ skgpu::tess::StrokeTolerances::CalcParametricPrecision(maxScale));
}
if (shader.mode() == GrStrokeTessellationShader::Mode::kFixedCount) {
diff --git a/tests/CullTestTest.cpp b/tests/CullTestTest.cpp
index 5657e3a..b737463 100644
--- a/tests/CullTestTest.cpp
+++ b/tests/CullTestTest.cpp
@@ -8,7 +8,9 @@
#include "tests/Test.h"
#include "include/utils/SkRandom.h"
-#include "src/gpu/tessellate/GrCullTest.h"
+#include "src/gpu/tessellate/CullTest.h"
+
+namespace skgpu::tess {
const SkMatrix gMatrices[] = {
SkMatrix::I(),
@@ -34,7 +36,7 @@
float valuesR[4] = {r+20, r+10, r-10, r-20};
float valuesB[4] = {b+20, b+10, b-10, b-20};
for (SkMatrix m : gMatrices) {
- GrCullTest cullTest(viewportRect, m);
+ CullTest cullTest(viewportRect, m);
SkMatrix inverse;
SkAssertResult(m.invert(&inverse));
for (const float* y : {valuesT, valuesB}) {
@@ -75,3 +77,5 @@
}}}
}
}
+
+} // namespace skgpu::tess
diff --git a/tests/WangsFormulaTest.cpp b/tests/WangsFormulaTest.cpp
index a9f978b..6d1a363 100644
--- a/tests/WangsFormulaTest.cpp
+++ b/tests/WangsFormulaTest.cpp
@@ -280,7 +280,7 @@
SkPoint ptsXformed[4];
m.mapPoints(ptsXformed, pts, 4);
int expected = GrWangsFormula::cubic_log2(kPrecision, ptsXformed);
- int actual = GrWangsFormula::cubic_log2(kPrecision, pts, GrVectorXform(m));
+ int actual = GrWangsFormula::cubic_log2(kPrecision, pts, skgpu::tess::VectorXform(m));
REPORTER_ASSERT(r, actual == expected);
};
@@ -288,7 +288,7 @@
SkPoint ptsXformed[3];
m.mapPoints(ptsXformed, pts, 3);
int expected = GrWangsFormula::quadratic_log2(kPrecision, ptsXformed);
- int actual = GrWangsFormula::quadratic_log2(kPrecision, pts, GrVectorXform(m));
+ int actual = GrWangsFormula::quadratic_log2(kPrecision, pts, skgpu::tess::VectorXform(m));
REPORTER_ASSERT(r, actual == expected);
};
@@ -494,7 +494,7 @@
SkPoint ptsXformed[3];
m.mapPoints(ptsXformed, pts, 3);
float expected = GrWangsFormula::conic(kPrecision, ptsXformed, w);
- float actual = GrWangsFormula::conic(kPrecision, pts, w, GrVectorXform(m));
+ float actual = GrWangsFormula::conic(kPrecision, pts, w, skgpu::tess::VectorXform(m));
REPORTER_ASSERT(r, SkScalarNearlyEqual(actual, expected));
};