| Index: tests/SurfaceTest.cpp
|
| diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
|
| index 42f4fcc3a4acbc9d7e9f2d10076a7f75775a1d4f..43ce203e0292bd10bffb041d0818b6512ec2ad7f 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_texture_surface(skiatest::Reporter* reporter, GrContext* ctx) {
|
| +static void test_wrapped_surface(skiatest::Reporter* reporter, GrContext* ctx) {
|
| if (NULL == ctx) {
|
| return;
|
| }
|
| @@ -120,77 +120,107 @@ static void test_wrapped_texture_surface(skiatest::Reporter* reporter, GrContext
|
| return;
|
| }
|
|
|
| - // 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;
|
| + 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;
|
| + }
|
| }
|
| }
|
| - }
|
| - 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
|
| @@ -837,7 +867,7 @@ DEF_GPUTEST(Surface, reporter, factory) {
|
| TestGetTexture(reporter, kGpuScratch_SurfaceType, context);
|
| test_empty_surface(reporter, context);
|
| test_surface_budget(reporter, context);
|
| - test_wrapped_texture_surface(reporter, context);
|
| + test_wrapped_surface(reporter, context);
|
| }
|
| }
|
| }
|
|
|