Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ec31488

Browse files
Mike KleinSkia Commit-Bot
authored andcommitted
Revert "Add a tessellation mode that uses indirect draws"
This reverts commit 02d7cf7. Reason for revert: Perf-Debian10-Clang-GCE-CPU-AVX2-x86_64-Debug-All-ASAN Perf-Win2019-Clang-GCE-CPU-AVX2-x86_64-Debug-All-ASAN Running tessellate_prepareTessellatedCubicWedges nonrendering ../../../../../../skia/bench/TessellatePathBench.cpp:79: fatal error: "unimplemented." Signal 5 [Trace/breakpoint trap]: /mnt/pd0/s/w/ir/build/nanobench(backtrace+0x3d) [0x34851fd] /mnt/pd0/s/w/ir/build/nanobench() [0x3db3d49] /lib/x86_64-linux-gnu/libc.so.6(+0x37840) [0x7fdb4722d840] sk_abort_no_print() BenchmarkTarget::caps() const GrTessellatePathOp::prepareTessellatedCubicWedges(GrMeshDrawOp::Target*) GrTessellatePathOp::TestingOnly_Benchmark::prepareTessellatedCubicWedges::runBench(GrMeshDrawOp::Target*, GrTessellatePathOp*) GrTessellatePathOp::TestingOnly_Benchmark::onDraw(int, SkCanvas*) Benchmark::draw(int, SkCanvas*) /mnt/pd0/s/w/ir/build/nanobench() [0x3543b81] /mnt/pd0/s/w/ir/build/nanobench(main+0x1347) [0x3540a17] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb) [0x7fdb4721a09b] /mnt/pd0/s/w/ir/build/nanobench(_start+0x2a) [0x346429a] Command exited with code 5 Original change's description: > Add a tessellation mode that uses indirect draws > > This mode is oftentimes faster than tessellation, and other times it > serves as a polyfill when tessellation just isn't supported. > > Change-Id: I7b3d57fd0194c6869bfe28ee53ff0ff2e43df479 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/291036 > Commit-Queue: Chris Dalton <csmartdalton@google.com> > Reviewed-by: Brian Osman <brianosman@google.com> TBR=egdaniel@google.com,brianosman@google.com,csmartdalton@google.com Change-Id: I4257d5ae5c0aafeebd61d8f1b78eca755ad977ff No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://skia-review.googlesource.com/c/skia/+/291642 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
1 parent 80abb89 commit ec31488

File tree

10 files changed

+229
-724
lines changed

10 files changed

+229
-724
lines changed

bench/TessellatePathBench.cpp

Lines changed: 75 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
#include "src/core/SkPathPriv.h"
1111
#include "src/gpu/GrContextPriv.h"
1212
#include "src/gpu/GrOpFlushState.h"
13-
#include "src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h"
14-
#include "src/gpu/tessellate/GrResolveLevelCounter.h"
1513
#include "src/gpu/tessellate/GrTessellatePathOp.h"
1614
#include "src/gpu/tessellate/GrWangsFormula.h"
1715
#include "tools/ToolUtils.h"
@@ -81,7 +79,7 @@ class BenchmarkTarget : public GrMeshDrawOp::Target {
8179
#undef UNIMPL
8280

8381
private:
84-
SkPoint fStaticVertexData[(kNumCubicsInChalkboard + 2) * 8];
82+
SkPoint fStaticVertexData[(kNumCubicsInChalkboard + 2) * 5];
8583
GrDrawIndexedIndirectCommand fStaticDrawIndexedIndirectData[32];
8684
SkSTArenaAlloc<1024 * 1024> fAllocator;
8785
};
@@ -97,15 +95,10 @@ class GrTessellatePathOp::TestingOnly_Benchmark : public Benchmark {
9795
const char* onGetName() override { return fName.c_str(); }
9896
bool isSuitableFor(Backend backend) final { return backend == kNonRendering_Backend; }
9997

100-
class prepareMiddleOutStencilGeometry;
101-
class prepareMiddleOutStencilGeometry_indirect;
102-
class prepareIndirectOuterCubics;
103-
class prepareTessellatedOuterCubics;
104-
class prepareTessellatedCubicWedges;
105-
class wangs_formula_cubic_log2;
106-
class wangs_formula_cubic_log2_scale;
107-
class wangs_formula_cubic_log2_affine;
108-
class middle_out_triangulation;
98+
class MiddleOutInnerTrianglesBench;
99+
class OuterCubicsBench;
100+
class CubicWedgesBench;
101+
class WangsFormulaBench;
109102

110103
private:
111104
void onDraw(int loops, SkCanvas*) final {
@@ -127,91 +120,83 @@ class GrTessellatePathOp::TestingOnly_Benchmark : public Benchmark {
127120
SkString fName;
128121
};
129122

130-
#define DEF_TESS_BENCH(NAME, PATH, MATRIX, TARGET, OP) \
131-
class GrTessellatePathOp::TestingOnly_Benchmark::NAME \
132-
: public GrTessellatePathOp::TestingOnly_Benchmark { \
133-
public: \
134-
NAME() : TestingOnly_Benchmark(#NAME, (PATH), (MATRIX)) {} \
135-
void runBench(GrMeshDrawOp::Target* target, GrTessellatePathOp* op) override; \
136-
}; \
137-
DEF_BENCH( return new GrTessellatePathOp::TestingOnly_Benchmark::NAME(); ); \
138-
void GrTessellatePathOp::TestingOnly_Benchmark::NAME::runBench( \
139-
GrMeshDrawOp::Target* TARGET, GrTessellatePathOp* op)
140-
141-
DEF_TESS_BENCH(prepareMiddleOutStencilGeometry, make_cubic_path(), SkMatrix::I(), target, op) {
142-
op->prepareMiddleOutTrianglesAndCubics(target);
143-
}
144-
145-
DEF_TESS_BENCH(prepareMiddleOutStencilGeometry_indirect, make_cubic_path(), SkMatrix::I(), target,
146-
op) {
147-
GrResolveLevelCounter resolveLevelCounter;
148-
op->prepareMiddleOutTrianglesAndCubics(target, &resolveLevelCounter, true);
149-
}
150-
151-
DEF_TESS_BENCH(prepareIndirectOuterCubics, make_cubic_path(), SkMatrix::I(), target, op) {
152-
GrResolveLevelCounter resolveLevelCounter;
153-
resolveLevelCounter.reset(op->fPath, SkMatrix::I(), 4);
154-
op->prepareIndirectOuterCubics(target, resolveLevelCounter);
155-
}
156-
157-
DEF_TESS_BENCH(prepareTessellatedOuterCubics, make_cubic_path(), SkMatrix::I(), target, op) {
158-
op->prepareTessellatedOuterCubics(target, kNumCubicsInChalkboard);
159-
}
123+
class GrTessellatePathOp::TestingOnly_Benchmark::MiddleOutInnerTrianglesBench
124+
: public GrTessellatePathOp::TestingOnly_Benchmark {
125+
public:
126+
MiddleOutInnerTrianglesBench()
127+
: TestingOnly_Benchmark("prepareMiddleOutInnerTriangles",
128+
ToolUtils::make_star(SkRect::MakeWH(100, 100),
129+
kNumCubicsInChalkboard),
130+
SkMatrix::I()) {
131+
}
132+
void runBench(GrMeshDrawOp::Target* target, GrTessellatePathOp* op) override {
133+
int numBeziers;
134+
op->prepareMiddleOutInnerTriangles(target, &numBeziers);
135+
}
136+
};
160137

161-
DEF_TESS_BENCH(prepareTessellatedCubicWedges, make_cubic_path(), SkMatrix::I(), target, op) {
162-
op->prepareTessellatedCubicWedges(target);
163-
}
138+
DEF_BENCH( return new GrTessellatePathOp::TestingOnly_Benchmark::MiddleOutInnerTrianglesBench(); );
164139

165-
static void benchmark_wangs_formula_cubic_log2(const SkMatrix& matrix, const SkPath& path) {
166-
int sum = 0;
167-
GrVectorXform xform(matrix);
168-
for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) {
169-
if (verb == SkPathVerb::kCubic) {
170-
sum += GrWangsFormula::cubic_log2(4, pts, xform);
171-
}
140+
class GrTessellatePathOp::TestingOnly_Benchmark::OuterCubicsBench
141+
: public GrTessellatePathOp::TestingOnly_Benchmark {
142+
public:
143+
OuterCubicsBench()
144+
: TestingOnly_Benchmark("prepareOuterCubics", make_cubic_path(), SkMatrix::I()) {
172145
}
173-
// Don't let the compiler optimize away GrWangsFormula::cubic_log2.
174-
if (sum <= 0) {
175-
SK_ABORT("sum should be > 0.");
146+
void runBench(GrMeshDrawOp::Target* target, GrTessellatePathOp* op) override {
147+
op->prepareOuterCubics(target, kNumCubicsInChalkboard,
148+
CubicDataAlignment::kVertexBoundary);
176149
}
177-
}
150+
};
178151

179-
DEF_TESS_BENCH(wangs_formula_cubic_log2, make_cubic_path(), SkMatrix::I(), target, op) {
180-
benchmark_wangs_formula_cubic_log2(op->fViewMatrix, op->fPath);
181-
}
152+
DEF_BENCH( return new GrTessellatePathOp::TestingOnly_Benchmark::OuterCubicsBench(); );
182153

183-
DEF_TESS_BENCH(wangs_formula_cubic_log2_scale, make_cubic_path(), SkMatrix::Scale(1.1f, 0.9f),
184-
target, op) {
185-
benchmark_wangs_formula_cubic_log2(op->fViewMatrix, op->fPath);
186-
}
154+
class GrTessellatePathOp::TestingOnly_Benchmark::CubicWedgesBench
155+
: public GrTessellatePathOp::TestingOnly_Benchmark {
156+
public:
157+
CubicWedgesBench()
158+
: TestingOnly_Benchmark("prepareCubicWedges", make_cubic_path(), SkMatrix::I()) {
159+
}
160+
void runBench(GrMeshDrawOp::Target* target, GrTessellatePathOp* op) override {
161+
op->prepareCubicWedges(target);
162+
}
163+
};
187164

188-
DEF_TESS_BENCH(wangs_formula_cubic_log2_affine, make_cubic_path(),
189-
SkMatrix::MakeAll(.9f,0.9f,0, 1.1f,1.1f,0, 0,0,1), target, op) {
190-
benchmark_wangs_formula_cubic_log2(op->fViewMatrix, op->fPath);
191-
}
165+
DEF_BENCH( return new GrTessellatePathOp::TestingOnly_Benchmark::CubicWedgesBench(););
192166

193-
DEF_TESS_BENCH(middle_out_triangulation,
194-
ToolUtils::make_star(SkRect::MakeWH(500, 500), kNumCubicsInChalkboard),
195-
SkMatrix::I(), target, op) {
196-
auto vertexData = static_cast<SkPoint*>(target->makeVertexSpace(
197-
sizeof(SkPoint), kNumCubicsInChalkboard, nullptr, nullptr));
198-
GrMiddleOutPolygonTriangulator middleOut(vertexData, 3, kNumCubicsInChalkboard + 2);
199-
for (auto [verb, pts, w] : SkPathPriv::Iterate(op->fPath)) {
200-
switch (verb) {
201-
case SkPathVerb::kMove:
202-
middleOut.closeAndMove(pts[0]);
203-
break;
204-
case SkPathVerb::kLine:
205-
middleOut.pushVertex(pts[1]);
206-
break;
207-
case SkPathVerb::kClose:
208-
middleOut.close();
209-
break;
210-
case SkPathVerb::kQuad:
211-
case SkPathVerb::kConic:
212-
case SkPathVerb::kCubic:
213-
SkUNREACHABLE;
167+
class GrTessellatePathOp::TestingOnly_Benchmark::WangsFormulaBench
168+
: public GrTessellatePathOp::TestingOnly_Benchmark {
169+
public:
170+
WangsFormulaBench(const char* suffix, const SkMatrix& matrix)
171+
: TestingOnly_Benchmark(SkStringPrintf("wangs_formula_cubic_log2%s", suffix).c_str(),
172+
make_cubic_path(), SkMatrix::I())
173+
, fMatrix(matrix) {
174+
}
175+
void runBench(GrMeshDrawOp::Target*, GrTessellatePathOp* op) override {
176+
int sum = 0;
177+
GrVectorXform xform(fMatrix);
178+
for (auto [verb, pts, w] : SkPathPriv::Iterate(op->fPath)) {
179+
if (verb == SkPathVerb::kCubic) {
180+
sum += GrWangsFormula::cubic_log2(4, pts, xform);
181+
}
182+
}
183+
// Don't let the compiler optimize away GrWangsFormula::cubic_log2.
184+
if (sum <= 0) {
185+
SK_ABORT("sum should be > 0.");
214186
}
215-
middleOut.closeAndMove(pts[0]);
216187
}
217-
}
188+
private:
189+
SkMatrix fMatrix;
190+
};
191+
192+
DEF_BENCH(
193+
return new GrTessellatePathOp::TestingOnly_Benchmark::WangsFormulaBench("", SkMatrix::I());
194+
);
195+
DEF_BENCH(
196+
return new GrTessellatePathOp::TestingOnly_Benchmark::WangsFormulaBench(
197+
"_scale", SkMatrix::Scale(1.1f, 0.9f));
198+
);
199+
DEF_BENCH(
200+
return new GrTessellatePathOp::TestingOnly_Benchmark::WangsFormulaBench(
201+
"_affine", SkMatrix::MakeAll(.9f,0.9f,0, 1.1f,1.1f,0, 0,0,1));
202+
);

gn/gpu.gni

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,6 @@ skia_gpu_sources = [
444444
"$_src/gpu/tessellate/GrMiddleOutPolygonTriangulator.h",
445445
"$_src/gpu/tessellate/GrMidpointContourParser.h",
446446
"$_src/gpu/tessellate/GrPathShader.h",
447-
"$_src/gpu/tessellate/GrResolveLevelCounter.h",
448447
"$_src/gpu/tessellate/GrStencilPathShader.cpp",
449448
"$_src/gpu/tessellate/GrStencilPathShader.h",
450449
"$_src/gpu/tessellate/GrTessellatePathOp.cpp",

src/gpu/GrPathRendererChain.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ GrPathRendererChain::GrPathRendererChain(GrRecordingContext* context, const Opti
3232
fChain.push_back(sk_make_sp<GrDashLinePathRenderer>());
3333
}
3434
if (options.fGpuPathRenderers & GpuPathRenderers::kTessellation) {
35-
if (caps.drawInstancedSupport()) {
35+
if (caps.shaderCaps()->tessellationSupport() && caps.drawInstancedSupport()) {
3636
auto tess = sk_make_sp<GrTessellationPathRenderer>(caps);
3737
context->priv().addOnFlushCallbackObject(tess.get());
3838
fChain.push_back(std::move(tess));

src/gpu/GrProcessor.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,9 @@ class GrProcessor {
162162
kTessellate_GrFillBoundingBoxShader_ClassID,
163163
kTessellate_GrFillCubicHullShader_ClassID,
164164
kTessellate_GrFillTriangleShader_ClassID,
165-
kTessellate_GrMiddleOutCubicShader_ClassID,
165+
kTessellate_GrStencilCubicShader_ClassID,
166166
kTessellate_GrStencilTriangleShader_ClassID,
167-
kTessellate_GrTessellateCubicShader_ClassID,
168-
kTessellate_GrTessellateWedgeShader_ClassID,
167+
kTessellate_GrStencilWedgeShader_ClassID,
169168
kTestFP_ClassID,
170169
kTestRectOp_ClassID,
171170
kFlatNormalsFP_ClassID,

src/gpu/tessellate/GrResolveLevelCounter.h

Lines changed: 0 additions & 74 deletions
This file was deleted.

0 commit comments

Comments
 (0)