| Index: tests/DeferredCanvasTest.cpp
|
| diff --git a/tests/DeferredCanvasTest.cpp b/tests/DeferredCanvasTest.cpp
|
| index cc8a1f2c53b4f0ce0ec81a5ff9f1bac4c7a43fb7..b960fe36071485d1d0d1683f0c5a59365e84c690 100644
|
| --- a/tests/DeferredCanvasTest.cpp
|
| +++ b/tests/DeferredCanvasTest.cpp
|
| @@ -681,68 +681,83 @@ static PixelPtr get_surface_ptr(SkSurface* surface, bool useGpu) {
|
|
|
| static void TestDeferredCanvasSurface(skiatest::Reporter* reporter, GrContextFactory* factory) {
|
| SkImageInfo imageSpec = SkImageInfo::MakeN32Premul(10, 10);
|
| - SkSurface* surface;
|
| bool useGpu = NULL != factory;
|
| + int cnt;
|
| #if SK_SUPPORT_GPU
|
| if (useGpu) {
|
| - GrContext* context = factory->get(GrContextFactory::kNative_GLContextType);
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| -
|
| - surface = SkSurface::NewRenderTarget(context, imageSpec);
|
| + cnt = GrContextFactory::kGLContextTypeCnt;
|
| } else {
|
| - surface = SkSurface::NewRaster(imageSpec);
|
| + cnt = 1;
|
| }
|
| #else
|
| SkASSERT(!useGpu);
|
| - surface = SkSurface::NewRaster(imageSpec);
|
| + cnt = 1;
|
| #endif
|
| - SkASSERT(NULL != surface);
|
| - SkAutoTUnref<SkSurface> aur(surface);
|
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface));
|
| -
|
| - SkImage* image1 = canvas->newImageSnapshot();
|
| - SkAutoTUnref<SkImage> aur_i1(image1);
|
| - PixelPtr pixels1 = get_surface_ptr(surface, useGpu);
|
| - // The following clear would normally trigger a copy on write, but
|
| - // it won't because rendering is deferred.
|
| - canvas->clear(SK_ColorBLACK);
|
| - // Obtaining a snapshot directly from the surface (as opposed to the
|
| - // SkDeferredCanvas) will not trigger a flush of deferred draw operations
|
| - // and will therefore return the same image as the previous snapshot.
|
| - SkImage* image2 = surface->newImageSnapshot();
|
| - SkAutoTUnref<SkImage> aur_i2(image2);
|
| - // Images identical because of deferral
|
| - REPORTER_ASSERT(reporter, image1->uniqueID() == image2->uniqueID());
|
| - // Now we obtain a snpshot via the deferred canvas, which triggers a flush.
|
| - // Because there is a pending clear, this will generate a different image.
|
| - SkImage* image3 = canvas->newImageSnapshot();
|
| - 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
|
| - PixelPtr pixels2 = get_surface_ptr(surface, useGpu);
|
| - REPORTER_ASSERT(reporter, pixels1 != pixels2);
|
| - // Verify copy-on write with a draw operation that gets deferred by
|
| - // the in order draw buffer.
|
| - SkPaint paint;
|
| - canvas->drawPaint(paint);
|
| - SkImage* image4 = canvas->newImageSnapshot(); // implicit flush
|
| - SkAutoTUnref<SkImage> aur_i4(image4);
|
| - REPORTER_ASSERT(reporter, image4->uniqueID() != image3->uniqueID());
|
| - PixelPtr pixels3 = get_surface_ptr(surface, useGpu);
|
| - REPORTER_ASSERT(reporter, pixels2 != pixels3);
|
| - // Verify that a direct canvas flush with a pending draw does not trigger
|
| - // a copy on write when the surface is not sharing its buffer with an
|
| - // SkImage.
|
| - canvas->clear(SK_ColorWHITE);
|
| - canvas->flush();
|
| - PixelPtr pixels4 = get_surface_ptr(surface, useGpu);
|
| - canvas->drawPaint(paint);
|
| - canvas->flush();
|
| - PixelPtr pixels5 = get_surface_ptr(surface, useGpu);
|
| - REPORTER_ASSERT(reporter, pixels4 == pixels5);
|
| + for (int i = 0; i < cnt; ++i) {
|
| + SkSurface* surface;
|
| +#if SK_SUPPORT_GPU
|
| + if (useGpu) {
|
| + GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i;
|
| + if (!GrContextFactory::IsRenderingGLContext(glCtxType)) {
|
| + continue;
|
| + }
|
| + GrContext* context = factory->get(glCtxType);
|
| + if (NULL == context) {
|
| + return;
|
| + }
|
| +
|
| + surface = SkSurface::NewRenderTarget(context, imageSpec);
|
| + } else
|
| +#endif
|
| + {
|
| + surface = SkSurface::NewRaster(imageSpec);
|
| + }
|
| + SkASSERT(NULL != surface);
|
| + SkAutoTUnref<SkSurface> aur(surface);
|
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface));
|
| +
|
| + SkImage* image1 = canvas->newImageSnapshot();
|
| + SkAutoTUnref<SkImage> aur_i1(image1);
|
| + PixelPtr pixels1 = get_surface_ptr(surface, useGpu);
|
| + // The following clear would normally trigger a copy on write, but
|
| + // it won't because rendering is deferred.
|
| + canvas->clear(SK_ColorBLACK);
|
| + // Obtaining a snapshot directly from the surface (as opposed to the
|
| + // SkDeferredCanvas) will not trigger a flush of deferred draw operations
|
| + // and will therefore return the same image as the previous snapshot.
|
| + SkImage* image2 = surface->newImageSnapshot();
|
| + SkAutoTUnref<SkImage> aur_i2(image2);
|
| + // Images identical because of deferral
|
| + REPORTER_ASSERT(reporter, image1->uniqueID() == image2->uniqueID());
|
| + // Now we obtain a snpshot via the deferred canvas, which triggers a flush.
|
| + // Because there is a pending clear, this will generate a different image.
|
| + SkImage* image3 = canvas->newImageSnapshot();
|
| + 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
|
| + PixelPtr pixels2 = get_surface_ptr(surface, useGpu);
|
| + REPORTER_ASSERT(reporter, pixels1 != pixels2);
|
| + // Verify copy-on write with a draw operation that gets deferred by
|
| + // the in order draw buffer.
|
| + SkPaint paint;
|
| + canvas->drawPaint(paint);
|
| + SkImage* image4 = canvas->newImageSnapshot(); // implicit flush
|
| + SkAutoTUnref<SkImage> aur_i4(image4);
|
| + REPORTER_ASSERT(reporter, image4->uniqueID() != image3->uniqueID());
|
| + PixelPtr pixels3 = get_surface_ptr(surface, useGpu);
|
| + REPORTER_ASSERT(reporter, pixels2 != pixels3);
|
| + // Verify that a direct canvas flush with a pending draw does not trigger
|
| + // a copy on write when the surface is not sharing its buffer with an
|
| + // SkImage.
|
| + canvas->clear(SK_ColorWHITE);
|
| + canvas->flush();
|
| + PixelPtr pixels4 = get_surface_ptr(surface, useGpu);
|
| + canvas->drawPaint(paint);
|
| + canvas->flush();
|
| + PixelPtr pixels5 = get_surface_ptr(surface, useGpu);
|
| + REPORTER_ASSERT(reporter, pixels4 == pixels5);
|
| + }
|
| }
|
|
|
| static void TestDeferredCanvasSetSurface(skiatest::Reporter* reporter, GrContextFactory* factory) {
|
| @@ -750,42 +765,57 @@ static void TestDeferredCanvasSetSurface(skiatest::Reporter* reporter, GrContext
|
| SkSurface* surface;
|
| SkSurface* alternateSurface;
|
| bool useGpu = NULL != factory;
|
| + int cnt;
|
| #if SK_SUPPORT_GPU
|
| if (useGpu) {
|
| - GrContext* context = factory->get(GrContextFactory::kNative_GLContextType);
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| - surface = SkSurface::NewRenderTarget(context, imageSpec);
|
| - alternateSurface = SkSurface::NewRenderTarget(context, imageSpec);
|
| + cnt = GrContextFactory::kGLContextTypeCnt;
|
| } else {
|
| - surface = SkSurface::NewRaster(imageSpec);
|
| - alternateSurface = SkSurface::NewRaster(imageSpec);
|
| + cnt = 1;
|
| }
|
| #else
|
| SkASSERT(!useGpu);
|
| - surface = SkSurface::NewRaster(imageSpec);
|
| - alternateSurface = SkSurface::NewRaster(imageSpec);
|
| + cnt = 1;
|
| #endif
|
| - SkASSERT(NULL != surface);
|
| - SkASSERT(NULL != alternateSurface);
|
| - SkAutoTUnref<SkSurface> aur1(surface);
|
| - SkAutoTUnref<SkSurface> aur2(alternateSurface);
|
| - PixelPtr pixels1 = get_surface_ptr(surface, useGpu);
|
| - PixelPtr pixels2 = get_surface_ptr(alternateSurface, useGpu);
|
| - SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface));
|
| - SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot());
|
| - canvas->setSurface(alternateSurface);
|
| - SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot());
|
| - REPORTER_ASSERT(reporter, image1->uniqueID() != image2->uniqueID());
|
| - // Verify that none of the above operations triggered a surface copy on write.
|
| - REPORTER_ASSERT(reporter, get_surface_ptr(surface, useGpu) == pixels1);
|
| - REPORTER_ASSERT(reporter, get_surface_ptr(alternateSurface, useGpu) == pixels2);
|
| - // Verify that a flushed draw command will trigger a copy on write on alternateSurface.
|
| - canvas->clear(SK_ColorWHITE);
|
| - canvas->flush();
|
| - REPORTER_ASSERT(reporter, get_surface_ptr(surface, useGpu) == pixels1);
|
| - REPORTER_ASSERT(reporter, get_surface_ptr(alternateSurface, useGpu) != pixels2);
|
| +
|
| + for (int i = 0; i < cnt; ++i) {
|
| +#if SK_SUPPORT_GPU
|
| + if (useGpu) {
|
| + GrContextFactory::GLContextType glCtxType = (GrContextFactory::GLContextType) i;
|
| + if (!GrContextFactory::IsRenderingGLContext(glCtxType)) {
|
| + continue;
|
| + }
|
| + GrContext* context = factory->get(glCtxType);
|
| + if (NULL == context) {
|
| + continue;
|
| + }
|
| + surface = SkSurface::NewRenderTarget(context, imageSpec);
|
| + alternateSurface = SkSurface::NewRenderTarget(context, imageSpec);
|
| + } else
|
| +#endif
|
| + {
|
| + surface = SkSurface::NewRaster(imageSpec);
|
| + alternateSurface = SkSurface::NewRaster(imageSpec);
|
| + }
|
| + SkASSERT(NULL != surface);
|
| + SkASSERT(NULL != alternateSurface);
|
| + SkAutoTUnref<SkSurface> aur1(surface);
|
| + SkAutoTUnref<SkSurface> aur2(alternateSurface);
|
| + PixelPtr pixels1 = get_surface_ptr(surface, useGpu);
|
| + PixelPtr pixels2 = get_surface_ptr(alternateSurface, useGpu);
|
| + SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface));
|
| + SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot());
|
| + canvas->setSurface(alternateSurface);
|
| + SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot());
|
| + REPORTER_ASSERT(reporter, image1->uniqueID() != image2->uniqueID());
|
| + // Verify that none of the above operations triggered a surface copy on write.
|
| + REPORTER_ASSERT(reporter, get_surface_ptr(surface, useGpu) == pixels1);
|
| + REPORTER_ASSERT(reporter, get_surface_ptr(alternateSurface, useGpu) == pixels2);
|
| + // Verify that a flushed draw command will trigger a copy on write on alternateSurface.
|
| + canvas->clear(SK_ColorWHITE);
|
| + canvas->flush();
|
| + REPORTER_ASSERT(reporter, get_surface_ptr(surface, useGpu) == pixels1);
|
| + REPORTER_ASSERT(reporter, get_surface_ptr(alternateSurface, useGpu) != pixels2);
|
| + }
|
| }
|
|
|
| static void TestDeferredCanvasCreateCompatibleDevice(skiatest::Reporter* reporter) {
|
|
|