aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm
diff options
context:
space:
mode:
authorGravatar kkinnunen <kkinnunen@nvidia.com>2015-12-14 04:49:17 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-14 04:49:17 -0800
commite13ca329fca4c28cf4e078561f591ab27b743d23 (patch)
treede68d6a0eac4bc4034fe3ae7adbc690ef5116185 /dm
parentaab16e54cb6ab712b477ed9eed8b9aa52098572c (diff)
Add config options to run different GPU APIs to dm and nanobench
Add extended config specification form that can be used to run different gpu backend with different APIs. The configs can be specified with the form: gpu(api=string,dit=bool,nvpr=bool,samples=int) This replaces and removes the --gpuAPI flag. All existing configs should still work. Adds following documentation: out/Debug/dm --help config Flags: --config: type: string default: 565 8888 gpu nonrendering Options: 565 8888 debug gpu gpudebug gpudft gpunull msaa16 msaa4 nonrendering null nullgpu nvprmsaa16 nvprmsaa4 pdf pdf_poppler skp svg xps or use extended form 'backend(option=value,...)'. Extended form: 'backend(option=value,...)' Possible backends and options: gpu(api=string,dit=bool,nvpr=bool,samples=int) GPU backend api type: string default: native. Select graphics API to use with gpu backend. Options: native Use platform default OpenGL or OpenGL ES backend. gl Use OpenGL. gles Use OpenGL ES. debug Use debug OpenGL. null Use null OpenGL. dit type: bool default: false. Use device independent text. nvpr type: bool default: false. Use NV_path_rendering OpenGL and OpenGL ES extension. samples type: int default: 0. Use multisampling with N samples. Predefined configs: gpu = gpu() msaa4 = gpu(samples=4) msaa16 = gpu(samples=16) nvprmsaa4 = gpu(nvpr=true,samples=4) nvprmsaa16 = gpu(nvpr=true,samples=16) gpudft = gpu(dit=true) gpudebug = gpu(api=debug) gpunull = gpu(api=null) debug = gpu(api=debug) nullgpu = gpu(api=null) BUG=skia:2992 Review URL: https://codereview.chromium.org/1490113005
Diffstat (limited to 'dm')
-rw-r--r--dm/DM.cpp169
-rw-r--r--dm/DMGpuSupport.h6
-rw-r--r--dm/DMSrcSink.cpp5
-rw-r--r--dm/DMSrcSink.h3
4 files changed, 91 insertions, 92 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index c7e0934008..2351366fef 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -15,6 +15,7 @@
#include "SkChecksum.h"
#include "SkCodec.h"
#include "SkCommonFlags.h"
+#include "SkCommonFlagsConfig.h"
#include "SkFontMgr.h"
#include "SkForceLinking.h"
#include "SkGraphics.h"
@@ -199,7 +200,7 @@ struct TaggedSrc : public SkAutoTDelete<Src> {
};
struct TaggedSink : public SkAutoTDelete<Sink> {
- const char* tag;
+ SkString tag;
};
static const bool kMemcpyOK = true;
@@ -541,19 +542,9 @@ static void gather_srcs() {
}
}
-#if SK_SUPPORT_GPU
-static GrGLStandard get_gpu_api() {
- if (FLAGS_gpuAPI.contains("gl")) { return kGL_GrGLStandard; }
- if (FLAGS_gpuAPI.contains("gles")) { return kGLES_GrGLStandard; }
- return kNone_GrGLStandard;
-}
-#endif
-
-static void push_sink(const char* tag, Sink* s) {
+static void push_sink(const SkCommandLineConfig& config, Sink* s) {
SkAutoTDelete<Sink> sink(s);
- if (!FLAGS_config.contains(tag)) {
- return;
- }
+
// Try a simple Src as a canary. If it fails, skip this sink.
struct : public Src {
Error draw(SkCanvas* c) const override {
@@ -569,13 +560,13 @@ static void push_sink(const char* tag, Sink* s) {
SkString log;
Error err = sink->draw(justOneRect, &bitmap, &stream, &log);
if (err.isFatal()) {
- SkDebugf("Could not run %s: %s\n", tag, err.c_str());
+ SkDebugf("Could not run %s: %s\n", config.getTag().c_str(), err.c_str());
exit(1);
}
TaggedSink& ts = gSinks.push_back();
ts.reset(sink.detach());
- ts.tag = tag;
+ ts.tag = config.getTag();
}
static bool gpu_supported() {
@@ -585,45 +576,32 @@ static bool gpu_supported() {
return false;
#endif
}
-static Sink* create_gpu_sink(const char* tag, GrContextFactory::GLContextType contextType,
- GrContextFactory::GLContextOptions contextOptions, int samples,
- bool diText, bool threaded) {
+
+static Sink* create_sink(const SkCommandLineConfig* config) {
#if SK_SUPPORT_GPU
- GrContextFactory testFactory;
- const GrGLStandard api = get_gpu_api();
- if (testFactory.get(contextType, api, contextOptions)) {
- return new GPUSink(contextType, contextOptions, api, samples, diText, threaded);
- }
- SkDebugf("WARNING: can not create GPU context for config '%s'. GM tests will be skipped.\n", tag);
-#endif
- return nullptr;
-}
-static Sink* create_sink(const char* tag) {
-#define GPU_SINK(t, ...) if (0 == strcmp(t, tag)) { return create_gpu_sink(tag, __VA_ARGS__); }
if (gpu_supported()) {
- typedef GrContextFactory Gr;
- GPU_SINK("gpunull", Gr::kNull_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
- GPU_SINK("gpudebug", Gr::kDebug_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
- GPU_SINK("gpu", Gr::kNative_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
- GPU_SINK("gpudft", Gr::kNative_GLContextType, Gr::kNone_GLContextOptions, 0, true, FLAGS_gpu_threading);
- GPU_SINK("msaa4", Gr::kNative_GLContextType, Gr::kNone_GLContextOptions, 4, false, FLAGS_gpu_threading);
- GPU_SINK("msaa16", Gr::kNative_GLContextType, Gr::kNone_GLContextOptions, 16, false, FLAGS_gpu_threading);
- GPU_SINK("nvprmsaa4", Gr::kNative_GLContextType, Gr::kEnableNVPR_GLContextOptions, 4, true, FLAGS_gpu_threading);
- GPU_SINK("nvprmsaa16", Gr::kNative_GLContextType, Gr::kEnableNVPR_GLContextOptions, 16, true, FLAGS_gpu_threading);
-#if SK_ANGLE
- GPU_SINK("angle", Gr::kANGLE_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
- GPU_SINK("angle-gl", Gr::kANGLE_GL_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
-#endif
-#if SK_COMMAND_BUFFER
- GPU_SINK("commandbuffer", Gr::kCommandBuffer_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
-#endif
-#if SK_MESA
- GPU_SINK("mesa", Gr::kMESA_GLContextType, Gr::kNone_GLContextOptions, 0, false, FLAGS_gpu_threading);
-#endif
+ if (const SkCommandLineConfigGpu* gpuConfig = config->asConfigGpu()) {
+ GrContextFactory::GLContextType contextType = gpuConfig->getContextType();
+ GrContextFactory::GLContextOptions contextOptions =
+ GrContextFactory::kNone_GLContextOptions;
+ if (gpuConfig->getUseNVPR()) {
+ contextOptions = static_cast<GrContextFactory::GLContextOptions>(
+ contextOptions | GrContextFactory::kEnableNVPR_GLContextOptions);
+ }
+ GrContextFactory testFactory;
+ if (!testFactory.get(contextType, contextOptions)) {
+ SkDebugf("WARNING: can not create GPU context for config '%s'. "
+ "GM tests will be skipped.\n", gpuConfig->getTag().c_str());
+ return nullptr;
+ }
+ return new GPUSink(contextType, contextOptions, gpuConfig->getSamples(),
+ gpuConfig->getUseDIText(), FLAGS_gpu_threading);
+ }
}
-#undef GPU_SINK
+#endif
+
+#define SINK(t, sink, ...) if (config->getTag().equals(t)) { return new sink(__VA_ARGS__); }
-#define SINK(t, sink, ...) if (0 == strcmp(t, tag)) { return new sink(__VA_ARGS__); }
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
SINK("hwui", HWUISink);
#endif
@@ -642,8 +620,8 @@ static Sink* create_sink(const char* tag) {
return nullptr;
}
-static Sink* create_via(const char* tag, Sink* wrapped) {
-#define VIA(t, via, ...) if (0 == strcmp(t, tag)) { return new via(__VA_ARGS__); }
+static Sink* create_via(const SkString& tag, Sink* wrapped) {
+#define VIA(t, via, ...) if (tag.equals(t)) { return new via(__VA_ARGS__); }
VIA("twice", ViaTwice, wrapped);
VIA("pipe", ViaPipe, wrapped);
VIA("serialize", ViaSerialization, wrapped);
@@ -674,17 +652,24 @@ static Sink* create_via(const char* tag, Sink* wrapped) {
}
static void gather_sinks() {
- for (int i = 0; i < FLAGS_config.count(); i++) {
- const char* config = FLAGS_config[i];
- SkTArray<SkString> parts;
- SkStrSplit(config, "-", &parts);
-
- Sink* sink = nullptr;
- for (int i = parts.count(); i-- > 0;) {
- const char* part = parts[i].c_str();
- Sink* next = (sink == nullptr) ? create_sink(part) : create_via(part, sink);
+ SkCommandLineConfigArray configs;
+ ParseConfigs(FLAGS_config, &configs);
+ for (int i = 0; i < configs.count(); i++) {
+ const SkCommandLineConfig& config = *configs[i];
+ Sink* sink = create_sink(&config);
+ if (sink == nullptr) {
+ SkDebugf("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(),
+ config.getTag().c_str());
+ continue;
+ }
+
+ const SkTArray<SkString>& parts = config.getViaParts();
+ for (int j = parts.count(); j-- > 0;) {
+ const SkString& part = parts[j];
+ Sink* next = create_via(part, sink);
if (next == nullptr) {
- SkDebugf("Skipping %s: Don't understand '%s'.\n", config, part);
+ SkDebugf("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(),
+ part.c_str());
delete sink;
sink = nullptr;
break;
@@ -806,7 +791,7 @@ struct Task {
// - this Src / Sink combination is on the blacklist;
// - it's a dry run.
SkString note(task->src->veto(task->sink->flags()) ? " (veto)" : "");
- SkString whyBlacklisted = is_blacklisted(task->sink.tag, task->src.tag.c_str(),
+ SkString whyBlacklisted = is_blacklisted(task->sink.tag.c_str(), task->src.tag.c_str(),
task->src.options.c_str(), name.c_str());
if (!whyBlacklisted.isEmpty()) {
note.appendf(" (--blacklist %s)", whyBlacklisted.c_str());
@@ -818,15 +803,15 @@ struct Task {
SkBitmap bitmap;
SkDynamicMemoryWStream stream;
if (FLAGS_pre_log) {
- SkDebugf("\nRunning %s->%s", name.c_str(), task->sink.tag);
+ SkDebugf("\nRunning %s->%s", name.c_str(), task->sink.tag.c_str());
}
- start(task->sink.tag, task->src.tag, task->src.options, name.c_str());
+ start(task->sink.tag.c_str(), task->src.tag, task->src.options, name.c_str());
Error err = task->sink->draw(*task->src, &bitmap, &stream, &log);
if (!err.isEmpty()) {
auto elapsed = now_ms() - timerStart;
if (err.isFatal()) {
fail(SkStringPrintf("%s %s %s %s: %s",
- task->sink.tag,
+ task->sink.tag.c_str(),
task->src.tag.c_str(),
task->src.options.c_str(),
name.c_str(),
@@ -834,7 +819,7 @@ struct Task {
} else {
note.appendf(" (skipped: %s)", err.c_str());
}
- done(elapsed, task->sink.tag, task->src.tag, task->src.options,
+ done(elapsed, task->sink.tag.c_str(), task->src.tag, task->src.options,
name, note, log);
return;
}
@@ -867,11 +852,11 @@ struct Task {
}
if (!FLAGS_readPath.isEmpty() &&
- !gGold.contains(Gold(task->sink.tag, task->src.tag.c_str(),
+ !gGold.contains(Gold(task->sink.tag.c_str(), task->src.tag.c_str(),
task->src.options.c_str(), name, md5))) {
fail(SkStringPrintf("%s not found for %s %s %s %s in %s",
md5.c_str(),
- task->sink.tag,
+ task->sink.tag.c_str(),
task->src.tag.c_str(),
task->src.options.c_str(),
name.c_str(),
@@ -888,7 +873,7 @@ struct Task {
}
}
}
- done(now_ms()-timerStart, task->sink.tag, task->src.tag.c_str(), task->src.options.c_str(),
+ done(now_ms()-timerStart, task->sink.tag.c_str(), task->src.tag.c_str(), task->src.options.c_str(),
name, note, log);
}
@@ -899,7 +884,7 @@ struct Task {
const SkBitmap* bitmap) {
JsonWriter::BitmapResult result;
result.name = task.src->name();
- result.config = task.sink.tag;
+ result.config = task.sink.tag.c_str();
result.sourceType = task.src.tag;
result.sourceOptions = task.src.options;
result.ext = ext;
@@ -927,7 +912,7 @@ struct Task {
return; // Content-addressed. If it exists already, we're done.
}
} else {
- path = SkOSPath::Join(dir, task.sink.tag);
+ path = SkOSPath::Join(dir, task.sink.tag.c_str());
sk_mkdir(path.c_str());
path = SkOSPath::Join(path.c_str(), task.src.tag.c_str());
sk_mkdir(path.c_str());
@@ -1179,28 +1164,48 @@ template<typename T>
void RunWithGPUTestContexts(T test, GPUTestContexts testContexts, Reporter* reporter,
GrContextFactory* factory) {
#if SK_SUPPORT_GPU
- const GrGLStandard api = get_gpu_api();
- for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) {
- GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i;
+ // Iterate over context types, except use "native" instead of explicitly trying OpenGL and
+ // OpenGL ES. Do not use GLES on desktop, since tests do not account for not fixing
+ // http://skbug.com/2809
+ GrContextFactory::GLContextType contextTypes[] = {
+ GrContextFactory::kNative_GLContextType,
+#if SK_ANGLE
+#ifdef SK_BUILD_FOR_WIN
+ GrContextFactory::kANGLE_GLContextType,
+#endif
+ GrContextFactory::kANGLE_GL_GLContextType,
+#endif
+#if SK_COMMAND_BUFFER
+ GrContextFactory::kCommandBuffer_GLContextType,
+#endif
+#if SK_MESA
+ GrContextFactory::kMESA_GLContextType,
+#endif
+ GrContextFactory::kNull_GLContextType,
+ GrContextFactory::kDebug_GLContextType,
+ };
+ static_assert(SK_ARRAY_COUNT(contextTypes) == GrContextFactory::kGLContextTypeCnt - 2,
+ "Skipping unexpected GLContextType for GPU tests");
+
+ for (auto& contextType : contextTypes) {
int contextSelector = kNone_GPUTestContexts;
- if (GrContextFactory::IsRenderingGLContext(glCtxType)) {
+ if (GrContextFactory::IsRenderingGLContext(contextType)) {
contextSelector |= kAllRendering_GPUTestContexts;
- } else if (glCtxType == GrContextFactory::kNative_GLContextType) {
+ } else if (contextType == GrContextFactory::kNative_GLContextType) {
contextSelector |= kNative_GPUTestContexts;
- } else if (glCtxType == GrContextFactory::kNull_GLContextType) {
+ } else if (contextType == GrContextFactory::kNull_GLContextType) {
contextSelector |= kNull_GPUTestContexts;
- } else if (glCtxType == GrContextFactory::kDebug_GLContextType) {
+ } else if (contextType == GrContextFactory::kDebug_GLContextType) {
contextSelector |= kDebug_GPUTestContexts;
}
if ((testContexts & contextSelector) == 0) {
continue;
}
- if (GrContextFactory::ContextInfo* context = factory->getContextInfo(glCtxType, api)) {
+ if (GrContextFactory::ContextInfo* context = factory->getContextInfo(contextType)) {
call_test(test, reporter, context);
}
if (GrContextFactory::ContextInfo* context =
- factory->getContextInfo(glCtxType, api,
- GrContextFactory::kEnableNVPR_GLContextOptions)) {
+ factory->getContextInfo(contextType, GrContextFactory::kEnableNVPR_GLContextOptions)) {
call_test(test, reporter, context);
}
}
diff --git a/dm/DMGpuSupport.h b/dm/DMGpuSupport.h
index 627dc4fda3..2cfdbdcc2c 100644
--- a/dm/DMGpuSupport.h
+++ b/dm/DMGpuSupport.h
@@ -31,14 +31,13 @@ static const bool kGPUDisabled = false;
static inline SkSurface* NewGpuSurface(GrContextFactory* grFactory,
GrContextFactory::GLContextType type,
GrContextFactory::GLContextOptions options,
- GrGLStandard gpuAPI,
SkImageInfo info,
int samples,
bool useDIText) {
uint32_t flags = useDIText ? SkSurfaceProps::kUseDeviceIndependentFonts_Flag : 0;
SkSurfaceProps props(flags, SkSurfaceProps::kLegacyFontHost_InitType);
- return SkSurface::NewRenderTarget(grFactory->get(type, gpuAPI, options),
- SkSurface::kNo_Budgeted, info, samples, &props);
+ return SkSurface::NewRenderTarget(grFactory->get(type, options), SkSurface::kNo_Budgeted,
+ info, samples, &props);
}
} // namespace DM
@@ -92,7 +91,6 @@ static const bool kGPUDisabled = true;
static inline SkSurface* NewGpuSurface(GrContextFactory*,
GrContextFactory::GLContextType,
GrContextFactory::GLContextOptions,
- GrGLStandard,
SkImageInfo,
int,
bool) {
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 2503dc35ce..6d7a85fc29 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -790,13 +790,11 @@ DEFINE_bool(gpuStats, false, "Append GPU stats to the log for each GPU task?");
GPUSink::GPUSink(GrContextFactory::GLContextType ct,
GrContextFactory::GLContextOptions options,
- GrGLStandard gpuAPI,
int samples,
bool diText,
bool threaded)
: fContextType(ct)
, fContextOptions(options)
- , fGpuAPI(gpuAPI)
, fSampleCount(samples)
, fUseDIText(diText)
, fThreaded(threaded) {}
@@ -830,8 +828,7 @@ Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log) co
const SkImageInfo info =
SkImageInfo::Make(size.width(), size.height(), kN32_SkColorType, kPremul_SkAlphaType);
SkAutoTUnref<SkSurface> surface(
- NewGpuSurface(&factory, fContextType, fContextOptions, fGpuAPI, info, fSampleCount,
- fUseDIText));
+ NewGpuSurface(&factory, fContextType, fContextOptions, info, fSampleCount, fUseDIText));
if (!surface) {
return "Could not create a surface.";
}
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index 6b644ecdf3..5e053b1155 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -215,7 +215,7 @@ public:
class GPUSink : public Sink {
public:
GPUSink(GrContextFactory::GLContextType, GrContextFactory::GLContextOptions,
- GrGLStandard, int samples, bool diText, bool threaded);
+ int samples, bool diText, bool threaded);
Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
int enclave() const override;
@@ -224,7 +224,6 @@ public:
private:
GrContextFactory::GLContextType fContextType;
GrContextFactory::GLContextOptions fContextOptions;
- GrGLStandard fGpuAPI;
int fSampleCount;
bool fUseDIText;
bool fThreaded;