Index: tests/SurfaceTest.cpp |
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp |
index d78498f6b9142e01f7608327bb6ce7f36d742f55..44429fe1c04e6254917435056a0051982e319a85 100644 |
--- a/tests/SurfaceTest.cpp |
+++ b/tests/SurfaceTest.cpp |
@@ -102,7 +102,7 @@ static void test_empty_surface(skiatest::Reporter* reporter, GrContext* ctx) { |
} |
#if SK_SUPPORT_GPU |
-static void test_wrapped_surface(skiatest::Reporter* reporter, GrContext* ctx) { |
+static void test_wrapped_texture_surface(skiatest::Reporter* reporter, GrContext* ctx) { |
if (NULL == ctx) { |
return; |
} |
@@ -120,107 +120,77 @@ static void test_wrapped_surface(skiatest::Reporter* reporter, GrContext* ctx) { |
return; |
} |
- for (int useFBO = 0; useFBO < 2; ++useFBO) { |
- // Test the wrapped factory for SkSurface by creating a texture using GL and then wrap it in |
- // a SkSurface. |
- GrGLuint texID; |
- static const int kW = 100; |
- static const int kH = 100; |
- static const uint32_t kOrigColor = 0xFFAABBCC; |
- SkAutoTArray<uint32_t> pixels(kW * kH); |
- sk_memset32(pixels.get(), kOrigColor, kW * kH); |
- GR_GL_CALL(gl, GenTextures(1, &texID)); |
- GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE0)); |
- GR_GL_CALL(gl, PixelStorei(GR_GL_UNPACK_ALIGNMENT, 1)); |
- GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texID)); |
- GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, |
- GR_GL_NEAREST)); |
- GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, |
- GR_GL_NEAREST)); |
- GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S, |
- GR_GL_CLAMP_TO_EDGE)); |
- GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T, |
- GR_GL_CLAMP_TO_EDGE)); |
- GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA, |
- GR_GL_UNSIGNED_BYTE, |
- pixels.get())); |
- |
- SkAutoTUnref<SkSurface> surface; |
- GrGLuint fboID = 0; |
- if (useFBO) { |
- GR_GL_CALL(gl, GenFramebuffers(1, &fboID)); |
- GR_GL_CALL(gl, BindFramebuffer(GR_GL_FRAMEBUFFER, fboID)); |
- GR_GL_CALL(gl, FramebufferTexture2D(GR_GL_FRAMEBUFFER, GR_GL_COLOR_ATTACHMENT0, |
- GR_GL_TEXTURE_2D, texID, 0)); |
- GrBackendRenderTargetDesc wrappedDesc; |
- wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig; |
- wrappedDesc.fWidth = kW; |
- wrappedDesc.fHeight = kH; |
- wrappedDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
- wrappedDesc.fSampleCnt = 0; |
- wrappedDesc.fRenderTargetHandle = fboID; |
- wrappedDesc.fStencilBits = 0; |
- |
- ctx->resetContext(); |
- surface.reset(SkSurface::NewFromBackendRenderTarget(ctx, wrappedDesc, NULL)); |
- } else { |
- GrBackendTextureDesc wrappedDesc; |
- wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig; |
- wrappedDesc.fWidth = kW; |
- wrappedDesc.fHeight = kH; |
- wrappedDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
- wrappedDesc.fSampleCnt = 0; |
- wrappedDesc.fFlags = kRenderTarget_GrBackendTextureFlag; |
- wrappedDesc.fTextureHandle = texID; |
- |
- ctx->resetContext(); |
- surface.reset(SkSurface::NewFromBackendTexture(ctx, wrappedDesc, NULL)); |
- } |
- REPORTER_ASSERT(reporter, surface); |
- if (surface) { |
- // Validate that we can draw to the canvas and that the original texture color is |
- // preserved in pixels that aren't rendered to via the surface. |
- SkPaint paint; |
- static const SkColor kRectColor = ~kOrigColor | 0xFF000000; |
- paint.setColor(kRectColor); |
- surface->getCanvas()->drawRect(SkRect::MakeWH(SkIntToScalar(kW), SkIntToScalar(kH)/2), |
- paint); |
- SkImageInfo readInfo = SkImageInfo::MakeN32Premul(kW, kH); |
- surface->readPixels(readInfo, pixels.get(), kW * sizeof(uint32_t), 0, 0); |
- bool stop = false; |
- SkPMColor origColorPM = SkPackARGB32((kOrigColor >> 24 & 0xFF), |
- (kOrigColor >> 0 & 0xFF), |
- (kOrigColor >> 8 & 0xFF), |
- (kOrigColor >> 16 & 0xFF)); |
- SkPMColor rectColorPM = SkPackARGB32((kRectColor >> 24 & 0xFF), |
- (kRectColor >> 16 & 0xFF), |
- (kRectColor >> 8 & 0xFF), |
- (kRectColor >> 0 & 0xFF)); |
- for (int y = 0; y < kH/2 && !stop; ++y) { |
- for (int x = 0; x < kW && !stop; ++x) { |
- REPORTER_ASSERT(reporter, rectColorPM == pixels[x + y * kW]); |
- if (rectColorPM != pixels[x + y * kW]) { |
- stop = true; |
- } |
+ // Test the wrapped factory for SkSurface by creating a texture using GL and then wrap it in |
+ // a SkSurface. |
+ GrGLuint texID; |
+ static const int kW = 100; |
+ static const int kH = 100; |
+ static const uint32_t kOrigColor = 0xFFAABBCC; |
+ SkAutoTArray<uint32_t> pixels(kW * kH); |
+ sk_memset32(pixels.get(), kOrigColor, kW * kH); |
+ GR_GL_CALL(gl, GenTextures(1, &texID)); |
+ GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE0)); |
+ GR_GL_CALL(gl, PixelStorei(GR_GL_UNPACK_ALIGNMENT, 1)); |
+ GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texID)); |
+ GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MAG_FILTER, |
+ GR_GL_NEAREST)); |
+ GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, |
+ GR_GL_NEAREST)); |
+ GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_S, |
+ GR_GL_CLAMP_TO_EDGE)); |
+ GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_WRAP_T, |
+ GR_GL_CLAMP_TO_EDGE)); |
+ GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA, |
+ GR_GL_UNSIGNED_BYTE, |
+ pixels.get())); |
+ |
+ GrBackendTextureDesc wrappedDesc; |
+ wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig; |
+ wrappedDesc.fWidth = kW; |
+ wrappedDesc.fHeight = kH; |
+ wrappedDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
+ wrappedDesc.fSampleCnt = 0; |
+ wrappedDesc.fFlags = kRenderTarget_GrBackendTextureFlag; |
+ wrappedDesc.fTextureHandle = texID; |
+ |
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewWrappedRenderTarget(ctx, wrappedDesc, NULL)); |
+ REPORTER_ASSERT(reporter, surface); |
+ if (surface) { |
+ // Validate that we can draw to the canvas and that the original texture color is preserved |
+ // in pixels that aren't rendered to via the surface. |
+ SkPaint paint; |
+ static const SkColor kRectColor = ~kOrigColor | 0xFF000000; |
+ paint.setColor(kRectColor); |
+ surface->getCanvas()->drawRect(SkRect::MakeWH(SkIntToScalar(kW), SkIntToScalar(kH)/2), |
+ paint); |
+ SkImageInfo readInfo = SkImageInfo::MakeN32Premul(kW, kH); |
+ surface->readPixels(readInfo, pixels.get(), kW * sizeof(uint32_t), 0, 0); |
+ bool stop = false; |
+ SkPMColor origColorPM = SkPackARGB32((kOrigColor >> 24 & 0xFF), |
+ (kOrigColor >> 0 & 0xFF), |
+ (kOrigColor >> 8 & 0xFF), |
+ (kOrigColor >> 16 & 0xFF)); |
+ SkPMColor rectColorPM = SkPackARGB32((kRectColor >> 24 & 0xFF), |
+ (kRectColor >> 16 & 0xFF), |
+ (kRectColor >> 8 & 0xFF), |
+ (kRectColor >> 0 & 0xFF)); |
+ for (int y = 0; y < kH/2 && !stop; ++y) { |
+ for (int x = 0; x < kW && !stop; ++x) { |
+ REPORTER_ASSERT(reporter, rectColorPM == pixels[x + y * kW]); |
+ if (rectColorPM != pixels[x + y * kW]) { |
+ stop = true; |
} |
} |
- stop = false; |
- for (int y = kH/2; y < kH && !stop; ++y) { |
- for (int x = 0; x < kW && !stop; ++x) { |
- REPORTER_ASSERT(reporter, origColorPM == pixels[x + y * kW]); |
- if (origColorPM != pixels[x + y * kW]) { |
- stop = true; |
- } |
+ } |
+ stop = false; |
+ for (int y = kH/2; y < kH && !stop; ++y) { |
+ for (int x = 0; x < kW && !stop; ++x) { |
+ REPORTER_ASSERT(reporter, origColorPM == pixels[x + y * kW]); |
+ if (origColorPM != pixels[x + y * kW]) { |
+ stop = true; |
} |
} |
} |
- if (texID) { |
- GR_GL_CALL(gl, DeleteTextures(1, &texID)); |
- } |
- if (fboID) { |
- GR_GL_CALL(gl, DeleteFramebuffers(1, &fboID)); |
- } |
- |
} |
} |
#endif |
@@ -267,37 +237,39 @@ static uint32_t get_legacy_gen_id(SkSurface* surf) { |
* 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) { |
+template <class F> |
+static void test_texture_handle_genID(skiatest::Reporter* reporter, SkSurface* surf, F f) { |
const uint32_t gen0 = get_legacy_gen_id(surf); |
- surf->getTextureHandle(SkSurface::kFlushRead_TextureHandleAccess); |
+ f(surf, SkSurface::kFlushRead_BackendHandleAccess); |
const uint32_t gen1 = get_legacy_gen_id(surf); |
REPORTER_ASSERT(reporter, gen0 == gen1); |
- surf->getTextureHandle(SkSurface::kFlushWrite_TextureHandleAccess); |
+ f(surf, SkSurface::kFlushWrite_BackendHandleAccess); |
const uint32_t gen2 = get_legacy_gen_id(surf); |
REPORTER_ASSERT(reporter, gen0 != gen2); |
- surf->getTextureHandle(SkSurface::kDiscardWrite_TextureHandleAccess); |
+ f(surf, SkSurface::kDiscardWrite_BackendHandleAccess); |
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) { |
+template <class F> |
+static void test_backend_handle(skiatest::Reporter* reporter, SkSurface* surf, F f) { |
SkAutoTUnref<SkImage> image0(surf->newImageSnapshot()); |
- GrBackendObject obj = surf->getTextureHandle(SkSurface::kFlushRead_TextureHandleAccess); |
+ GrBackendObject obj = f(surf, SkSurface::kFlushRead_BackendHandleAccess); |
REPORTER_ASSERT(reporter, obj != 0); |
SkAutoTUnref<SkImage> image1(surf->newImageSnapshot()); |
// just read access should not affect the snapshot |
REPORTER_ASSERT(reporter, image0->uniqueID() == image1->uniqueID()); |
- obj = surf->getTextureHandle(SkSurface::kFlushWrite_TextureHandleAccess); |
+ obj = f(surf, SkSurface::kFlushWrite_BackendHandleAccess); |
REPORTER_ASSERT(reporter, obj != 0); |
SkAutoTUnref<SkImage> image2(surf->newImageSnapshot()); |
// expect a new image, since we claimed we would write |
REPORTER_ASSERT(reporter, image0->uniqueID() != image2->uniqueID()); |
- obj = surf->getTextureHandle(SkSurface::kDiscardWrite_TextureHandleAccess); |
+ obj = f(surf, SkSurface::kDiscardWrite_BackendHandleAccess); |
REPORTER_ASSERT(reporter, obj != 0); |
SkAutoTUnref<SkImage> image3(surf->newImageSnapshot()); |
// expect a new(er) image, since we claimed we would write |
@@ -331,9 +303,20 @@ static SkImage* create_image(skiatest::Reporter* reporter, |
SkAutoTUnref<SkSurface> surf( |
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); |
+ // test our backing texture / rendertarget while were here... |
+ auto textureAccessorFunc = |
+ [](SkSurface* surf, SkSurface::BackendHandleAccess access) -> GrBackendObject { |
+ return surf->getTextureHandle(access); }; |
+ auto renderTargetAccessorFunc = |
+ [](SkSurface* surf, SkSurface::BackendHandleAccess access) -> GrBackendObject { |
+ GrBackendObject obj; |
+ SkAssertResult(surf->getRenderTargetHandle(&obj, access)); |
+ return obj; }; |
+ test_backend_handle(reporter, surf, textureAccessorFunc); |
+ test_backend_handle(reporter, surf, renderTargetAccessorFunc); |
+ test_texture_handle_genID(reporter, surf, textureAccessorFunc); |
+ test_texture_handle_genID(reporter, surf, renderTargetAccessorFunc); |
+ |
// redraw so our returned image looks as expected. |
surf->getCanvas()->clear(color); |
return surf->newImageSnapshot(); |
@@ -883,7 +866,7 @@ DEF_GPUTEST(Surface, reporter, factory) { |
TestGetTexture(reporter, kGpuScratch_SurfaceType, context); |
test_empty_surface(reporter, context); |
test_surface_budget(reporter, context); |
- test_wrapped_surface(reporter, context); |
+ test_wrapped_texture_surface(reporter, context); |
} |
} |
} |