Chromium Code Reviews| Index: tests/DeferredCanvasTest.cpp |
| =================================================================== |
| --- tests/DeferredCanvasTest.cpp (revision 8622) |
| +++ tests/DeferredCanvasTest.cpp (working copy) |
| @@ -12,6 +12,12 @@ |
| #include "SkDevice.h" |
| #include "SkGradientShader.h" |
| #include "SkShader.h" |
| +#include "SkSurface.h" |
| +#if SK_SUPPORT_GPU |
| +#include "GrContextFactory.h" |
| +#else |
| +class GrContextFactory; |
| +#endif |
| static const int gWidth = 2; |
| static const int gHeight = 2; |
| @@ -465,7 +471,60 @@ |
| } |
| } |
| -static void TestDeferredCanvas(skiatest::Reporter* reporter) { |
| +static void TestDeferredCanvasSurface(skiatest::Reporter* reporter, GrContextFactory* factory) { |
| + SkImage::Info imageSpec = { |
| + 10, // width |
| + 10, // height |
| + SkImage::kPMColor_ColorType, |
| + SkImage::kPremul_AlphaType |
| + }; |
| + SkSurface* surface; |
| + bool useGpu = NULL != factory; |
| +#if SK_SUPPORT_GPU |
| + if (useGpu) { |
| + GrContext* context = factory->get(GrContextFactory::kNative_GLContextType); |
| + surface = SkSurface::NewRenderTarget(context, imageSpec); |
| + } else { |
| + surface = SkSurface::NewRaster(imageSpec); |
| + } |
| +#else |
| + SkASSERT(!useGpu); |
| + surface = SkSurface::NewRaster(imageSpec); |
| +#endif |
| + SkASSERT(NULL != surface); |
| + SkAutoTUnref<SkSurface> aur(surface); |
| + SkDeferredCanvas canvas(surface); |
| + |
| + SkImage* image1 = canvas.newImageShapshot(); |
| + SkAutoTUnref<SkImage> aur_i1(image1); |
| + void* pixels1 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() : |
|
reed1
2013/04/11 18:48:11
We seem to say this long->de->reference->expressio
|
| + surface->getCanvas()->getDevice()->accessBitmap(false).getPixels(); |
| + canvas.clear(SK_ColorBLACK); |
| + SkImage* image2 = surface->newImageShapshot(); |
| + SkAutoTUnref<SkImage> aur_i2(image2); |
| + // Images identical because of deferral |
| + REPORTER_ASSERT(reporter, image1->uniqueID() == image2->uniqueID()); |
| + SkImage* image3 = canvas.newImageShapshot(); // triggers a flush |
| + SkAutoTUnref<SkImage> aur_i3(image3); |
| + REPORTER_ASSERT(reporter, image1->uniqueID() != image3->uniqueID()); |
| + // Verify that backing store is now a different buffer because of copy on write |
| + void* pixels2 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() : |
| + surface->getCanvas()->getDevice()->accessBitmap(false).getPixels(); |
| + REPORTER_ASSERT(reporter, pixels1 != pixels2); |
| + canvas.clear(SK_ColorWHITE); |
| + canvas.flush(); |
| + void* pixels3 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() : |
| + surface->getCanvas()->getDevice()->accessBitmap(false).getPixels(); |
| + canvas.clear(SK_ColorBLACK); |
| + canvas.flush(); |
| + void* pixels4 = useGpu ? surface->getCanvas()->getDevice()->accessBitmap(false).getTexture() : |
| + surface->getCanvas()->getDevice()->accessBitmap(false).getPixels(); |
| + // Since no snapshot was acquired in the pixels3 state, the flush should |
| + // not trigger a copy on write. |
| + REPORTER_ASSERT(reporter, pixels3 == pixels4); |
| +} |
| + |
| +static void TestDeferredCanvas(skiatest::Reporter* reporter, GrContextFactory* factory) { |
| TestDeferredCanvasBitmapAccess(reporter); |
| TestDeferredCanvasFlush(reporter); |
| TestDeferredCanvasFreshFrame(reporter); |
| @@ -474,7 +533,12 @@ |
| TestDeferredCanvasSkip(reporter); |
| TestDeferredCanvasBitmapShaderNoLeak(reporter); |
| TestDeferredCanvasBitmapSizeThreshold(reporter); |
| + TestDeferredCanvasSurface(reporter, NULL); |
| + if (NULL != factory) { |
| + TestDeferredCanvasSurface(reporter, factory); |
| + } |
| } |
| #include "TestClassDef.h" |
| -DEFINE_TESTCLASS("DeferredCanvas", TestDeferredCanvasClass, TestDeferredCanvas) |
| +DEFINE_GPUTESTCLASS("DeferredCanvas", TestDeferredCanvasClass, TestDeferredCanvas) |
| + |