| Index: dm/DM.cpp
|
| diff --git a/dm/DM.cpp b/dm/DM.cpp
|
| index 2351366fef21d7deaf2be60995dd6dd988aaa62d..c7e0934008f3b5a8b2d8dd982976d169b1c923e0 100644
|
| --- a/dm/DM.cpp
|
| +++ b/dm/DM.cpp
|
| @@ -15,7 +15,6 @@
|
| #include "SkChecksum.h"
|
| #include "SkCodec.h"
|
| #include "SkCommonFlags.h"
|
| -#include "SkCommonFlagsConfig.h"
|
| #include "SkFontMgr.h"
|
| #include "SkForceLinking.h"
|
| #include "SkGraphics.h"
|
| @@ -200,7 +199,7 @@
|
| };
|
|
|
| struct TaggedSink : public SkAutoTDelete<Sink> {
|
| - SkString tag;
|
| + const char* tag;
|
| };
|
|
|
| static const bool kMemcpyOK = true;
|
| @@ -542,9 +541,19 @@
|
| }
|
| }
|
|
|
| -static void push_sink(const SkCommandLineConfig& config, Sink* s) {
|
| +#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) {
|
| 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 {
|
| @@ -560,13 +569,13 @@
|
| SkString log;
|
| Error err = sink->draw(justOneRect, &bitmap, &stream, &log);
|
| if (err.isFatal()) {
|
| - SkDebugf("Could not run %s: %s\n", config.getTag().c_str(), err.c_str());
|
| + SkDebugf("Could not run %s: %s\n", tag, err.c_str());
|
| exit(1);
|
| }
|
|
|
| TaggedSink& ts = gSinks.push_back();
|
| ts.reset(sink.detach());
|
| - ts.tag = config.getTag();
|
| + ts.tag = tag;
|
| }
|
|
|
| static bool gpu_supported() {
|
| @@ -576,32 +585,45 @@
|
| return false;
|
| #endif
|
| }
|
| -
|
| -static Sink* create_sink(const SkCommandLineConfig* config) {
|
| +static Sink* create_gpu_sink(const char* tag, GrContextFactory::GLContextType contextType,
|
| + GrContextFactory::GLContextOptions contextOptions, int samples,
|
| + bool diText, bool threaded) {
|
| #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()) {
|
| - 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);
|
| - }
|
| - }
|
| + 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
|
| -
|
| -#define SINK(t, sink, ...) if (config->getTag().equals(t)) { return new sink(__VA_ARGS__); }
|
| -
|
| +#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
|
| + }
|
| +#undef GPU_SINK
|
| +
|
| +#define SINK(t, sink, ...) if (0 == strcmp(t, tag)) { return new sink(__VA_ARGS__); }
|
| #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
|
| SINK("hwui", HWUISink);
|
| #endif
|
| @@ -620,8 +642,8 @@
|
| return nullptr;
|
| }
|
|
|
| -static Sink* create_via(const SkString& tag, Sink* wrapped) {
|
| -#define VIA(t, via, ...) if (tag.equals(t)) { return new via(__VA_ARGS__); }
|
| +static Sink* create_via(const char* tag, Sink* wrapped) {
|
| +#define VIA(t, via, ...) if (0 == strcmp(t, tag)) { return new via(__VA_ARGS__); }
|
| VIA("twice", ViaTwice, wrapped);
|
| VIA("pipe", ViaPipe, wrapped);
|
| VIA("serialize", ViaSerialization, wrapped);
|
| @@ -652,24 +674,17 @@
|
| }
|
|
|
| static void gather_sinks() {
|
| - 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);
|
| + 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);
|
| if (next == nullptr) {
|
| - SkDebugf("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(),
|
| - part.c_str());
|
| + SkDebugf("Skipping %s: Don't understand '%s'.\n", config, part);
|
| delete sink;
|
| sink = nullptr;
|
| break;
|
| @@ -791,7 +806,7 @@
|
| // - 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.c_str(), task->src.tag.c_str(),
|
| + SkString whyBlacklisted = is_blacklisted(task->sink.tag, task->src.tag.c_str(),
|
| task->src.options.c_str(), name.c_str());
|
| if (!whyBlacklisted.isEmpty()) {
|
| note.appendf(" (--blacklist %s)", whyBlacklisted.c_str());
|
| @@ -803,15 +818,15 @@
|
| SkBitmap bitmap;
|
| SkDynamicMemoryWStream stream;
|
| if (FLAGS_pre_log) {
|
| - SkDebugf("\nRunning %s->%s", name.c_str(), task->sink.tag.c_str());
|
| - }
|
| - start(task->sink.tag.c_str(), task->src.tag, task->src.options, name.c_str());
|
| + SkDebugf("\nRunning %s->%s", name.c_str(), task->sink.tag);
|
| + }
|
| + start(task->sink.tag, 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.c_str(),
|
| + task->sink.tag,
|
| task->src.tag.c_str(),
|
| task->src.options.c_str(),
|
| name.c_str(),
|
| @@ -819,7 +834,7 @@
|
| } else {
|
| note.appendf(" (skipped: %s)", err.c_str());
|
| }
|
| - done(elapsed, task->sink.tag.c_str(), task->src.tag, task->src.options,
|
| + done(elapsed, task->sink.tag, task->src.tag, task->src.options,
|
| name, note, log);
|
| return;
|
| }
|
| @@ -852,11 +867,11 @@
|
| }
|
|
|
| if (!FLAGS_readPath.isEmpty() &&
|
| - !gGold.contains(Gold(task->sink.tag.c_str(), task->src.tag.c_str(),
|
| + !gGold.contains(Gold(task->sink.tag, 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.c_str(),
|
| + task->sink.tag,
|
| task->src.tag.c_str(),
|
| task->src.options.c_str(),
|
| name.c_str(),
|
| @@ -873,7 +888,7 @@
|
| }
|
| }
|
| }
|
| - done(now_ms()-timerStart, task->sink.tag.c_str(), task->src.tag.c_str(), task->src.options.c_str(),
|
| + done(now_ms()-timerStart, task->sink.tag, task->src.tag.c_str(), task->src.options.c_str(),
|
| name, note, log);
|
| }
|
|
|
| @@ -884,7 +899,7 @@
|
| const SkBitmap* bitmap) {
|
| JsonWriter::BitmapResult result;
|
| result.name = task.src->name();
|
| - result.config = task.sink.tag.c_str();
|
| + result.config = task.sink.tag;
|
| result.sourceType = task.src.tag;
|
| result.sourceOptions = task.src.options;
|
| result.ext = ext;
|
| @@ -912,7 +927,7 @@
|
| return; // Content-addressed. If it exists already, we're done.
|
| }
|
| } else {
|
| - path = SkOSPath::Join(dir, task.sink.tag.c_str());
|
| + path = SkOSPath::Join(dir, task.sink.tag);
|
| sk_mkdir(path.c_str());
|
| path = SkOSPath::Join(path.c_str(), task.src.tag.c_str());
|
| sk_mkdir(path.c_str());
|
| @@ -1164,48 +1179,28 @@
|
| void RunWithGPUTestContexts(T test, GPUTestContexts testContexts, Reporter* reporter,
|
| GrContextFactory* factory) {
|
| #if SK_SUPPORT_GPU
|
| - // 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) {
|
| + const GrGLStandard api = get_gpu_api();
|
| + for (int i = 0; i < GrContextFactory::kGLContextTypeCnt; ++i) {
|
| + GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i;
|
| int contextSelector = kNone_GPUTestContexts;
|
| - if (GrContextFactory::IsRenderingGLContext(contextType)) {
|
| + if (GrContextFactory::IsRenderingGLContext(glCtxType)) {
|
| contextSelector |= kAllRendering_GPUTestContexts;
|
| - } else if (contextType == GrContextFactory::kNative_GLContextType) {
|
| + } else if (glCtxType == GrContextFactory::kNative_GLContextType) {
|
| contextSelector |= kNative_GPUTestContexts;
|
| - } else if (contextType == GrContextFactory::kNull_GLContextType) {
|
| + } else if (glCtxType == GrContextFactory::kNull_GLContextType) {
|
| contextSelector |= kNull_GPUTestContexts;
|
| - } else if (contextType == GrContextFactory::kDebug_GLContextType) {
|
| + } else if (glCtxType == GrContextFactory::kDebug_GLContextType) {
|
| contextSelector |= kDebug_GPUTestContexts;
|
| }
|
| if ((testContexts & contextSelector) == 0) {
|
| continue;
|
| }
|
| - if (GrContextFactory::ContextInfo* context = factory->getContextInfo(contextType)) {
|
| + if (GrContextFactory::ContextInfo* context = factory->getContextInfo(glCtxType, api)) {
|
| call_test(test, reporter, context);
|
| }
|
| if (GrContextFactory::ContextInfo* context =
|
| - factory->getContextInfo(contextType, GrContextFactory::kEnableNVPR_GLContextOptions)) {
|
| + factory->getContextInfo(glCtxType, api,
|
| + GrContextFactory::kEnableNVPR_GLContextOptions)) {
|
| call_test(test, reporter, context);
|
| }
|
| }
|
|
|