b832ce61ee
Implements a simple first pass for a path renderer that uses the classic Red Book "stencil then cover" method, and linearizes curves with GPU tessellation shaders. The new path renderer is disabled by default, and can only be enabled in the viewer UI or by passing the "--pr gtess" flag. Change-Id: Ic9354952e93c8b108577961760b4f0daa82d35aa Reviewed-on: https://skia-review.googlesource.com/c/skia/+/261715 Reviewed-by: Michael Ludwig <michaelludwig@google.com> Commit-Queue: Chris Dalton <csmartdalton@google.com>
105 lines
4.1 KiB
C++
105 lines
4.1 KiB
C++
/*
|
|
* Copyright 2014 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "include/core/SkExecutor.h"
|
|
#include "include/gpu/GrContextOptions.h"
|
|
#include "tools/flags/CommonFlags.h"
|
|
|
|
DEFINE_int(gpuThreads,
|
|
2,
|
|
"Create this many extra threads to assist with GPU work, "
|
|
"including software path rendering. Defaults to two.");
|
|
|
|
static DEFINE_bool(cachePathMasks, true,
|
|
"Allows path mask textures to be cached in GPU configs.");
|
|
|
|
static DEFINE_bool(noGS, false, "Disables support for geometry shaders.");
|
|
|
|
static DEFINE_bool(cc, false, "Allow coverage counting shortcuts to render paths?");
|
|
|
|
static DEFINE_string(pr, "",
|
|
"Set of enabled gpu path renderers. Defined as a list of: "
|
|
"[~]none [~]dashline [~]nvpr [~]ccpr [~]aahairline [~]aaconvex [~]aalinearizing "
|
|
"[~]small [~]tess] [~]all");
|
|
|
|
static DEFINE_int(internalSamples, 4,
|
|
"Number of samples for internal draws that use MSAA or mixed samples.");
|
|
|
|
static DEFINE_bool(disableDriverCorrectnessWorkarounds, false,
|
|
"Disables all GPU driver correctness workarounds");
|
|
|
|
static DEFINE_bool(reduceOpsTaskSplitting, false, "Improve opsTask sorting");
|
|
static DEFINE_bool(dontReduceOpsTaskSplitting, false, "Allow more opsTask splitting");
|
|
|
|
static GpuPathRenderers get_named_pathrenderers_flags(const char* name) {
|
|
if (!strcmp(name, "none")) {
|
|
return GpuPathRenderers::kNone;
|
|
} else if (!strcmp(name, "dashline")) {
|
|
return GpuPathRenderers::kDashLine;
|
|
} else if (!strcmp(name, "gtess")) {
|
|
return GpuPathRenderers::kGpuTessellation;
|
|
} else if (!strcmp(name, "nvpr")) {
|
|
return GpuPathRenderers::kStencilAndCover;
|
|
} else if (!strcmp(name, "ccpr")) {
|
|
return GpuPathRenderers::kCoverageCounting;
|
|
} else if (!strcmp(name, "aahairline")) {
|
|
return GpuPathRenderers::kAAHairline;
|
|
} else if (!strcmp(name, "aaconvex")) {
|
|
return GpuPathRenderers::kAAConvex;
|
|
} else if (!strcmp(name, "aalinearizing")) {
|
|
return GpuPathRenderers::kAALinearizing;
|
|
} else if (!strcmp(name, "small")) {
|
|
return GpuPathRenderers::kSmall;
|
|
} else if (!strcmp(name, "tess")) {
|
|
return GpuPathRenderers::kTessellating;
|
|
} else if (!strcmp(name, "default")) {
|
|
return GpuPathRenderers::kDefault;
|
|
}
|
|
SK_ABORT(SkStringPrintf("error: unknown named path renderer \"%s\"\n", name).c_str());
|
|
}
|
|
|
|
static GpuPathRenderers collect_gpu_path_renderers_from_flags() {
|
|
if (FLAGS_pr.isEmpty()) {
|
|
return GpuPathRenderers::kDefault;
|
|
}
|
|
|
|
GpuPathRenderers gpuPathRenderers = ('~' == FLAGS_pr[0][0])
|
|
? GpuPathRenderers::kDefault
|
|
: GpuPathRenderers::kNone;
|
|
|
|
for (int i = 0; i < FLAGS_pr.count(); ++i) {
|
|
const char* name = FLAGS_pr[i];
|
|
if (name[0] == '~') {
|
|
gpuPathRenderers &= ~get_named_pathrenderers_flags(&name[1]);
|
|
} else {
|
|
gpuPathRenderers |= get_named_pathrenderers_flags(name);
|
|
}
|
|
}
|
|
return gpuPathRenderers;
|
|
}
|
|
|
|
void SetCtxOptionsFromCommonFlags(GrContextOptions* ctxOptions) {
|
|
static std::unique_ptr<SkExecutor> gGpuExecutor = (0 != FLAGS_gpuThreads)
|
|
? SkExecutor::MakeFIFOThreadPool(FLAGS_gpuThreads)
|
|
: nullptr;
|
|
|
|
ctxOptions->fExecutor = gGpuExecutor.get();
|
|
ctxOptions->fDisableCoverageCountingPaths = !FLAGS_cc;
|
|
ctxOptions->fAllowPathMaskCaching = FLAGS_cachePathMasks;
|
|
ctxOptions->fSuppressGeometryShaders = FLAGS_noGS;
|
|
ctxOptions->fGpuPathRenderers = collect_gpu_path_renderers_from_flags();
|
|
ctxOptions->fInternalMultisampleCount = FLAGS_internalSamples;
|
|
ctxOptions->fDisableDriverCorrectnessWorkarounds = FLAGS_disableDriverCorrectnessWorkarounds;
|
|
|
|
if (FLAGS_reduceOpsTaskSplitting) {
|
|
SkASSERT(!FLAGS_dontReduceOpsTaskSplitting);
|
|
ctxOptions->fReduceOpsTaskSplitting = GrContextOptions::Enable::kYes;
|
|
} else if (FLAGS_dontReduceOpsTaskSplitting) {
|
|
ctxOptions->fReduceOpsTaskSplitting = GrContextOptions::Enable::kNo;
|
|
}
|
|
}
|