From 5af9b2032b552516c9223d9fb22185b022b13c62 Mon Sep 17 00:00:00 2001 From: "scroggo@google.com" Date: Mon, 4 Jun 2012 17:17:36 +0000 Subject: [PATCH] Make the GM tool run GMs through an SkGPipe. Add pipe to core gyp project. Do not run samplerstress through the pipe, since its custom MaskFilter will not draw correctly. Fix an assert in SkGPipeWrite when writing a typeface. Review URL: https://codereview.appspot.com/6276044 git-svn-id: http://skia.googlecode.com/svn/trunk@4139 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gm/gm.h | 3 +- gm/gmmain.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++- gm/samplerstress.cpp | 6 ++++ gyp/SampleApp.gyp | 7 +---- gyp/core.gyp | 4 +++ gyp/gm.gyp | 2 +- src/pipe/SkGPipeWrite.cpp | 4 +-- 7 files changed, 90 insertions(+), 11 deletions(-) diff --git a/gm/gm.h b/gm/gm.h index 97b21d9..4072f10 100644 --- a/gm/gm.h +++ b/gm/gm.h @@ -31,7 +31,8 @@ namespace skiagm { enum Flags { kSkipPDF_Flag = 1 << 0, - kSkipPicture_Flag = 1 << 1 + kSkipPicture_Flag = 1 << 1, + kSkipPipe_Flag = 1 << 2 }; void draw(SkCanvas*); diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp index 61a0859..760262c 100644 --- a/gm/gmmain.cpp +++ b/gm/gmmain.cpp @@ -13,6 +13,7 @@ #include "SkData.h" #include "SkDeferredCanvas.h" #include "SkDevice.h" +#include "SkGPipe.h" #include "SkGpuCanvas.h" #include "SkGpuDevice.h" #include "SkGraphics.h" @@ -615,6 +616,67 @@ static ErrorBitfield test_picture_serialization(GM* gm, } } +class PipeController : public SkGPipeController { +public: + PipeController(SkCanvas* target); + ~PipeController(); + virtual void* requestBlock(size_t minRequest, size_t* actual); + virtual void notifyWritten(size_t bytes); +private: + SkGPipeReader fReader; + void* fBlock; + size_t fBlockSize; + size_t fBytesWritten; + SkGPipeReader::Status fStatus; +}; + +PipeController::PipeController(SkCanvas* target) +:fReader(target) { + fBlock = NULL; + fBlockSize = fBytesWritten = 0; +} + +PipeController::~PipeController() { + sk_free(fBlock); +} + +void* PipeController::requestBlock(size_t minRequest, size_t *actual) { + sk_free(fBlock); + fBlockSize = minRequest * 4; + fBlock = sk_malloc_throw(fBlockSize); + fBytesWritten = 0; + *actual = fBlockSize; + return fBlock; +} + +void PipeController::notifyWritten(size_t bytes) { + fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes); + SkASSERT(SkGPipeReader::kError_Status != fStatus); + fBytesWritten += bytes; +} + +static ErrorBitfield test_pipe_playback(GM* gm, + const ConfigData& gRec, + const SkBitmap& comparisonBitmap, + const char readPath [], + const char diffPath []) { + if (kRaster_Backend != gRec.fBackend) { + return ERROR_NONE; + } + SkBitmap bitmap; + SkISize size = gm->getISize(); + setup_bitmap(gRec, size, &bitmap); + SkCanvas canvas(bitmap); + PipeController pipeController(&canvas); + SkGPipeWriter writer; + SkCanvas* pipeCanvas = writer.startRecording(&pipeController, + SkGPipeWriter::kCrossProcess_Flag); + invokeGM(gm, pipeCanvas); + writer.endRecording(); + return handle_test_results(gm, gRec, NULL, NULL, diffPath, + "-pipe", bitmap, NULL, &comparisonBitmap); +} + static void write_picture_serialization(GM* gm, const ConfigData& rec, const char writePicturePath[]) { // only do this once, so we pick raster @@ -635,7 +697,7 @@ static void write_picture_serialization(GM* gm, const ConfigData& rec, static void usage(const char * argv0) { SkDebugf( "%s [-w writePath] [-r readPath] [-d diffPath] [-i resourcePath]\n" - " [--noreplay] [--serialize] [--forceBWtext] [--nopdf] \n" + " [--noreplay] [--nopipe] [--serialize] [--forceBWtext] [--nopdf] \n" " [--nodeferred] [--match substring] [--notexturecache]\n" , argv0); SkDebugf(" writePath: directory to write rendered images in.\n"); @@ -645,6 +707,7 @@ static void usage(const char * argv0) { SkDebugf(" diffPath: directory to write difference images in.\n"); SkDebugf(" resourcePath: directory that stores image resources.\n"); SkDebugf(" --noreplay: do not exercise SkPicture replay.\n"); + SkDebugf(" --nopipe: Skip SkGPipe replay.\n"); SkDebugf( " --serialize: exercise SkPicture serialization & deserialization.\n"); SkDebugf(" --forceBWtext: disable text anti-aliasing.\n"); @@ -755,6 +818,7 @@ int main(int argc, char * const argv[]) { bool doPDF = true; bool doReplay = true; + bool doPipe = true; bool doSerialize = false; bool useDebugGL = false; bool doDeferred = true; @@ -792,6 +856,8 @@ int main(int argc, char * const argv[]) { } } else if (strcmp(*argv, "--forceBWtext") == 0) { gForceBWtext = true; + } else if (strcmp(*argv, "--nopipe") == 0) { + doPipe = false; } else if (strcmp(*argv, "--noreplay") == 0) { doReplay = false; } else if (strcmp(*argv, "--nopdf") == 0) { @@ -931,6 +997,13 @@ int main(int argc, char * const argv[]) { readPath, diffPath); } + if ((ERROR_NONE == testErrors) && doPipe && + !(gmFlags & GM::kSkipPipe_Flag)) { + testErrors |= test_pipe_playback(gm, gRec[i], + forwardRenderedBitmap, + readPath, diffPath); + } + if ((ERROR_NONE == testErrors) && doSerialize && !(gmFlags & GM::kSkipPicture_Flag)) { testErrors |= test_picture_serialization(gm, gRec[i], diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp index 687c636..b5c0069 100644 --- a/gm/samplerstress.cpp +++ b/gm/samplerstress.cpp @@ -105,6 +105,12 @@ protected: return make_isize(640, 480); } + virtual uint32_t onGetFlags() const SK_OVERRIDE { + // Skip Pipe playback since we use a custom MaskFilter that will not be + // flattened correctly + return this->INHERITED::onGetFlags() | GM::kSkipPipe_Flag; + } + /** * Create a red & green stripes on black texture */ diff --git a/gyp/SampleApp.gyp b/gyp/SampleApp.gyp index 0c370ab..c426508 100644 --- a/gyp/SampleApp.gyp +++ b/gyp/SampleApp.gyp @@ -8,7 +8,6 @@ 'include_dirs' : [ '../src/core', # needed to get SkConcaveToTriangle, maybe this should be moved to include dir? '../gm', # needed to pull gm.h - '../include/pipe', # To pull in SkGPipe.h for pipe reader/writer '../samplecode', # To pull SampleApp.h and SampleCode.h '../src/gpu', # To pull gl/GrGLUtil.h ], @@ -111,11 +110,7 @@ '../samplecode/SampleXfermodes.cpp', '../samplecode/SampleXfermodesBlur.cpp', '../samplecode/TransitionView.cpp', - - # Dependencies for the pipe code in SampleApp - '../src/pipe/SkGPipeRead.cpp', - '../src/pipe/SkGPipeWrite.cpp', - + # DrawingBoard #'../experimental/DrawingBoard/SkColorPalette.h', #'../experimental/DrawingBoard/SkColorPalette.cpp', diff --git a/gyp/core.gyp b/gyp/core.gyp index 6d5cd13..aea2a73 100644 --- a/gyp/core.gyp +++ b/gyp/core.gyp @@ -149,6 +149,8 @@ '../src/core/SkUtils.cpp', '../src/core/SkWriter32.cpp', '../src/core/SkXfermode.cpp', + '../src/pipe/SkGPipeRead.cpp', + '../src/pipe/SkGPipeWrite.cpp', '../include/core/Sk64.h', '../include/core/SkAdvancedTypefaceMetrics.h', @@ -241,6 +243,7 @@ 'include_dirs': [ '../include/config', '../include/core', + '../include/pipe', '../include/ports', '../include/xml', '../src/core', @@ -318,6 +321,7 @@ 'config', '../include/config', '../include/core', + '../include/pipe', 'ext', ], }, diff --git a/gyp/gm.gyp b/gyp/gm.gyp index b333130..980c199 100644 --- a/gyp/gm.gyp +++ b/gyp/gm.gyp @@ -24,8 +24,8 @@ 'gpu.gyp:gr', 'gpu.gyp:skgr', 'images.gyp:images', - 'ports.gyp:ports', 'pdf.gyp:pdf', + 'ports.gyp:ports', 'utils.gyp:utils', ], 'conditions': [ diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp index 08c6f49..5d35988 100644 --- a/src/pipe/SkGPipeWrite.cpp +++ b/src/pipe/SkGPipeWrite.cpp @@ -67,9 +67,9 @@ static size_t writeTypeface(SkWriter32* writer, SkTypeface* typeface) { if (writer) { writer->write32(size); SkAutoDataUnref data(stream.copyToData()); - writer->write(data.data(), size); + writer->writePad(data.data(), size); } - return 4 + size; + return 4 + SkAlign4(size); } /////////////////////////////////////////////////////////////////////////////// -- 2.7.4