Perform multi core rendering in bench_pictures.
Add a flag in SkGPipeWriter for threadsafe drawing.
Add a deferred pipe controller to SamplePipeControllers, which can
be called to play back in multiple threads.
Depends on http://codereview.appspot.com/6459105/
Review URL: https://codereview.appspot.com/6482068
git-svn-id: http://skia.googlecode.com/svn/trunk@5371 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pipe/utils/SamplePipeControllers.h b/src/pipe/utils/SamplePipeControllers.h
index 715693c..bbd8024 100644
--- a/src/pipe/utils/SamplePipeControllers.h
+++ b/src/pipe/utils/SamplePipeControllers.h
@@ -6,7 +6,9 @@
*/
#include "SkBitmap.h"
+#include "SkChunkAlloc.h"
#include "SkGPipe.h"
+#include "SkTDArray.h"
class SkCanvas;
class SkMatrix;
@@ -43,3 +45,41 @@
SkBitmap fBitmaps[NumberOfTiles];
typedef PipeController INHERITED;
};
+
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Borrowed (and modified) from SkDeferredCanvas.cpp::DeferredPipeController.
+ * Allows playing back from multiple threads.
+ */
+class DeferredPipeController : public SkGPipeController {
+public:
+ DeferredPipeController(int numberOfReaders);
+ virtual void* requestBlock(size_t minRequest, size_t* actual) SK_OVERRIDE;
+ virtual void notifyWritten(size_t bytes) SK_OVERRIDE;
+ virtual int numberOfReaders() const SK_OVERRIDE { return fNumberOfReaders; }
+
+ /**
+ * Play the stored drawing commands to the specified canvas. If SkGPipeWriter::startRecording
+ * used the flag SkGPipeWriter::kSimultaneousReaders_Flag, this can be called from different
+ * threads simultaneously.
+ */
+ void playback(SkCanvas*);
+private:
+ enum {
+ kMinBlockSize = 4096
+ };
+ struct PipeBlock {
+ PipeBlock(void* block, size_t bytes) { fBlock = block, fBytes = bytes; }
+ // Stream of draw commands written by the SkGPipeWriter. Allocated by fAllocator, which will
+ // handle freeing it.
+ void* fBlock;
+ // Number of bytes that were written to fBlock.
+ size_t fBytes;
+ };
+ void* fBlock;
+ size_t fBytesWritten;
+ SkChunkAlloc fAllocator;
+ SkTDArray<PipeBlock> fBlockList;
+ int fNumberOfReaders;
+};