diff options
author | Yuqian Li <liyuqian@google.com> | 2018-02-23 14:13:36 +0800 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-02-25 16:36:24 +0000 |
commit | b8b6253df6e60e5cce71ae584921bd9da35c1b93 (patch) | |
tree | 826849c4b6f2b55af159eae88eaa8760cf6c5bd0 | |
parent | 3fd84fa4bff159db472db166ca31bdf969f143bb (diff) |
Add threaded backend sink to DM. Fix a scheduler bug.
The bug is spotted by the new sink. I'd expect more bugs to be revealed
and fixed using the new sink.
Bug: skia:
Change-Id: I6b0c9267079fbd6149004f0ecd55ddb179702588
Reviewed-on: https://skia-review.googlesource.com/109720
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Yuqian Li <liyuqian@google.com>
-rw-r--r-- | dm/DM.cpp | 1 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 35 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 13 | ||||
-rw-r--r-- | src/core/SkTaskGroup2D.cpp | 2 | ||||
-rw-r--r-- | tools/flags/SkCommonFlags.cpp | 3 | ||||
-rw-r--r-- | tools/flags/SkCommonFlags.h | 2 |
6 files changed, 53 insertions, 3 deletions
@@ -917,6 +917,7 @@ static Sink* create_sink(const GrContextOptions& grCtxOptions, const SkCommandLi SINK("1010102", RasterSink, kRGBA_1010102_SkColorType); SINK("101010x", RasterSink, kRGB_101010x_SkColorType); SINK("f16", RasterSink, kRGBA_F16_SkColorType, srgbLinearColorSpace); + SINK("t8888", ThreadedSink, kN32_SkColorType); SINK("pdf", PDFSink, false, SK_ScalarDefaultRasterDPI); SINK("skp", SKPSink); SINK("pipe", PipeSink); diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 0dd35ff169..2229b9c26d 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -49,6 +49,7 @@ #include "SkStream.h" #include "SkSwizzler.h" #include "SkTaskGroup.h" +#include "SkThreadedBMPDevice.h" #include "SkTLogic.h" #include <cmath> #include <functional> @@ -1856,7 +1857,7 @@ RasterSink::RasterSink(SkColorType colorType, sk_sp<SkColorSpace> colorSpace) : fColorType(colorType) , fColorSpace(std::move(colorSpace)) {} -Error RasterSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const { +void RasterSink::allocPixels(const Src& src, SkBitmap* dst) const { const SkISize size = src.size(); // If there's an appropriate alpha type for this color type, use it, otherwise use premul. SkAlphaType alphaType = kPremul_SkAlphaType; @@ -1865,12 +1866,44 @@ Error RasterSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) con dst->allocPixelsFlags(SkImageInfo::Make(size.width(), size.height(), fColorType, alphaType, fColorSpace), SkBitmap::kZeroPixels_AllocFlag); +} + +Error RasterSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) const { + this->allocPixels(src, dst); SkCanvas canvas(*dst); return src.draw(&canvas); } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +ThreadedSink::ThreadedSink(SkColorType colorType, sk_sp<SkColorSpace> colorSpace) + : RasterSink(colorType, colorSpace) + , fExecutor(SkExecutor::MakeFIFOThreadPool(FLAGS_backendThreads)) { +} + +Error ThreadedSink::draw(const Src& src, SkBitmap* dst, SkWStream* stream, SkString* str) const { + this->allocPixels(src, dst); + + std::unique_ptr<SkThreadedBMPDevice> device(new SkThreadedBMPDevice( + *dst, FLAGS_backendTiles, FLAGS_backendThreads, fExecutor.get())); + std::unique_ptr<SkCanvas> canvas(new SkCanvas(device.get())); + Error result = src.draw(canvas.get()); + canvas->flush(); + return result; + + // ??? yuqian: why does the following give me segmentation fault while the above one works? + // The seg fault occurs right in the beginning of ThreadedSink::draw with invalid + // memory address (it would crash without even calling this->allocPixels). + + // SkThreadedBMPDevice device(*dst, tileCnt, FLAGS_cpuThreads, fExecutor.get()); + // SkCanvas canvas(&device); + // Error result = src.draw(&canvas); + // canvas.flush(); + // return result; +} + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + // Handy for front-patching a Src. Do whatever up-front work you need, then call draw_to_canvas(), // passing the Sink draw() arguments, a size, and a function draws into an SkCanvas. // Several examples below. diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h index 1ad2eca79f..6cc5df690f 100644 --- a/dm/DMSrcSink.h +++ b/dm/DMSrcSink.h @@ -424,11 +424,22 @@ public: Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; const char* fileExtension() const override { return "png"; } SinkFlags flags() const override { return SinkFlags{ SinkFlags::kRaster, SinkFlags::kDirect }; } -private: +protected: + void allocPixels(const Src& src, SkBitmap*) const; + SkColorType fColorType; sk_sp<SkColorSpace> fColorSpace; }; +class ThreadedSink : public RasterSink { +public: + explicit ThreadedSink(SkColorType, sk_sp<SkColorSpace> = nullptr); + Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; + +private: + std::unique_ptr<SkExecutor> fExecutor; +}; + class SKPSink : public Sink { public: SKPSink(); diff --git a/src/core/SkTaskGroup2D.cpp b/src/core/SkTaskGroup2D.cpp index 4060527bcb..32bbf8650a 100644 --- a/src/core/SkTaskGroup2D.cpp +++ b/src/core/SkTaskGroup2D.cpp @@ -51,7 +51,7 @@ void SkFlexibleTaskGroup2D::work(int threadId) { // Only keep fHeight - numRowsCompleted number of threads looping. When rows are about to // complete, this strategy keeps the contention low. - while (threadId >= numRowsCompleted) { + while (threadId < fHeight - numRowsCompleted) { RowData& rowData = fRowData[row]; // The Android roller somehow gets a false-positive compile warning/error about the try-lock diff --git a/tools/flags/SkCommonFlags.cpp b/tools/flags/SkCommonFlags.cpp index ed7f9daa50..4f895058ab 100644 --- a/tools/flags/SkCommonFlags.cpp +++ b/tools/flags/SkCommonFlags.cpp @@ -99,6 +99,9 @@ DEFINE_bool(deltaAA, kDefaultDeltaAA, DEFINE_bool(forceDeltaAA, false, "Force delta anti-aliasing for all paths."); +DEFINE_int32(backendTiles, 3, "Number of tiles in the experimental threaded backend."); +DEFINE_int32(backendThreads, 2, "Number of threads in the experimental threaded backend."); + bool CollectImages(SkCommandLineFlags::StringArray images, SkTArray<SkString>* output) { SkASSERT(output); diff --git a/tools/flags/SkCommonFlags.h b/tools/flags/SkCommonFlags.h index 96bd6f3cb3..1f0c8d14f8 100644 --- a/tools/flags/SkCommonFlags.h +++ b/tools/flags/SkCommonFlags.h @@ -41,6 +41,8 @@ DECLARE_bool(deltaAA); DECLARE_bool(forceDeltaAA); DECLARE_string(key); DECLARE_string(properties); +DECLARE_int32(backendTiles); +DECLARE_int32(backendThreads) /** * Helper to assist in collecting image paths from |dir| specified through a command line flag. |