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 /dm | |
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>
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DM.cpp | 1 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 35 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 13 |
3 files changed, 47 insertions, 2 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(); |