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
This commit is contained in:
parent
da30999f2b
commit
5af9b2032b
3
gm/gm.h
3
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*);
|
||||
|
@ -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],
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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',
|
||||
|
@ -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',
|
||||
],
|
||||
},
|
||||
|
@ -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': [
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
Loading…
Reference in New Issue
Block a user