From dca20ce4e1a522d6f70c79252a169456b48619db Mon Sep 17 00:00:00 2001 From: reed Date: Fri, 3 Jul 2015 10:43:43 -0700 Subject: [PATCH] explicitly bump legacy genID on gpu surface Previous attempt to "test" getTextureHandle was giving false-positive because we had an active image-snapshot, which was incidentally also triggering a new genID. I think this CL will also enable this change: https://codereview.chromium.org/1222243002/ BUG=skia: TBR=bsalomon@google.com NOTREECHECKS=True Review URL: https://codereview.chromium.org/1208993008 --- src/image/SkSurface_Gpu.cpp | 2 ++ tests/SurfaceTest.cpp | 32 ++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp index 70866d3..3a306ad 100644 --- a/src/image/SkSurface_Gpu.cpp +++ b/src/image/SkSurface_Gpu.cpp @@ -35,6 +35,8 @@ GrBackendObject SkSurface_Gpu::onGetTextureHandle(TextureHandleAccess access) { case kDiscardWrite_TextureHandleAccess: // for now we don't special-case on Discard, but we may in the future. this->notifyContentWillChange(kRetain_ContentChangeMode); + // legacy: need to dirty the bitmap's genID in our device (curse it) + fDevice->fLegacyBitmap.notifyPixelsChanged(); break; } rt->prepareForExternalIO(); diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index 43ce203..d78498f 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -260,34 +260,49 @@ static uint32_t get_legacy_gen_id(SkSurface* surf) { return device->accessBitmap(false).getGenerationID(); } +/* + * Test legacy behavor of bumping the surface's device's bitmap's genID when we access its + * texture handle for writing. + * + * Note: this needs to be tested separately from checking newImageSnapshot, as calling that + * can also incidentally bump the genID (when a new backing surface is created). + */ +static void test_texture_handle_genID(skiatest::Reporter* reporter, SkSurface* surf) { + const uint32_t gen0 = get_legacy_gen_id(surf); + surf->getTextureHandle(SkSurface::kFlushRead_TextureHandleAccess); + const uint32_t gen1 = get_legacy_gen_id(surf); + REPORTER_ASSERT(reporter, gen0 == gen1); + + surf->getTextureHandle(SkSurface::kFlushWrite_TextureHandleAccess); + const uint32_t gen2 = get_legacy_gen_id(surf); + REPORTER_ASSERT(reporter, gen0 != gen2); + + surf->getTextureHandle(SkSurface::kDiscardWrite_TextureHandleAccess); + const uint32_t gen3 = get_legacy_gen_id(surf); + REPORTER_ASSERT(reporter, gen0 != gen3); + REPORTER_ASSERT(reporter, gen2 != gen3); +} + static void test_texture_handle(skiatest::Reporter* reporter, SkSurface* surf) { SkAutoTUnref image0(surf->newImageSnapshot()); - const uint32_t genID0 = get_legacy_gen_id(surf); GrBackendObject obj = surf->getTextureHandle(SkSurface::kFlushRead_TextureHandleAccess); REPORTER_ASSERT(reporter, obj != 0); SkAutoTUnref image1(surf->newImageSnapshot()); - const uint32_t genID1 = get_legacy_gen_id(surf); // just read access should not affect the snapshot REPORTER_ASSERT(reporter, image0->uniqueID() == image1->uniqueID()); - REPORTER_ASSERT(reporter, genID0 == genID1); obj = surf->getTextureHandle(SkSurface::kFlushWrite_TextureHandleAccess); REPORTER_ASSERT(reporter, obj != 0); SkAutoTUnref image2(surf->newImageSnapshot()); - const uint32_t genID2 = get_legacy_gen_id(surf); // expect a new image, since we claimed we would write REPORTER_ASSERT(reporter, image0->uniqueID() != image2->uniqueID()); - REPORTER_ASSERT(reporter, genID0 != genID2); obj = surf->getTextureHandle(SkSurface::kDiscardWrite_TextureHandleAccess); REPORTER_ASSERT(reporter, obj != 0); SkAutoTUnref image3(surf->newImageSnapshot()); - const uint32_t genID3 = get_legacy_gen_id(surf); // expect a new(er) image, since we claimed we would write REPORTER_ASSERT(reporter, image0->uniqueID() != image3->uniqueID()); REPORTER_ASSERT(reporter, image2->uniqueID() != image3->uniqueID()); - REPORTER_ASSERT(reporter, genID0 != genID3); - REPORTER_ASSERT(reporter, genID2 != genID3); } static SkImage* create_image(skiatest::Reporter* reporter, @@ -317,6 +332,7 @@ static SkImage* create_image(skiatest::Reporter* reporter, SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info, 0)); surf->getCanvas()->clear(color); // test our backing texture while were here... + test_texture_handle_genID(reporter, surf); test_texture_handle(reporter, surf); // redraw so our returned image looks as expected. surf->getCanvas()->clear(color); -- 2.7.4