aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DM.cpp1
-rw-r--r--dm/DMSrcSink.cpp35
-rw-r--r--dm/DMSrcSink.h13
-rw-r--r--src/core/SkTaskGroup2D.cpp2
-rw-r--r--tools/flags/SkCommonFlags.cpp3
-rw-r--r--tools/flags/SkCommonFlags.h2
6 files changed, 53 insertions, 3 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index ef35e2cd02..1d3d815647 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -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.