Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index c7e0934008f3b5a8b2d8dd982976d169b1c923e0..ac37aeb09fd06a9b98a80d673ab4a5abf73b0b22 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->getBackend().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); |
} |
} |