diff options
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DM.cpp | 169 | ||||
-rw-r--r-- | dm/DMGpuSupport.h | 6 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 5 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 3 |
4 files changed, 91 insertions, 92 deletions
@@ -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; |