| Index: tests/SurfaceTest.cpp
|
| diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
|
| index c38a3d7c63b032603941ded7f9e7f147d71c2fce..34e5ab524a06d4037d3ec742b86cf2af778e2a0c 100644
|
| --- a/tests/SurfaceTest.cpp
|
| +++ b/tests/SurfaceTest.cpp
|
| @@ -17,6 +17,9 @@
|
|
|
| #if SK_SUPPORT_GPU
|
| #include "GrContextFactory.h"
|
| +#include "GrTest.h"
|
| +#include "gl/GrGLInterface.h"
|
| +#include "gl/GrGLUtil.h"
|
| #else
|
| class GrContextFactory;
|
| class GrContext;
|
| @@ -97,36 +100,92 @@ static void test_wrapped_texture_surface(skiatest::Reporter* reporter, GrContext
|
| if (NULL == ctx) {
|
| return;
|
| }
|
| - // Test the wrapped factory for SkSurface by creating a texture using ctx and then treat it as
|
| - // an external texture and wrap it in a SkSurface.
|
| -
|
| - GrSurfaceDesc texDesc;
|
| - texDesc.fConfig = kRGBA_8888_GrPixelConfig;
|
| - texDesc.fFlags = kRenderTarget_GrSurfaceFlag;
|
| - texDesc.fWidth = texDesc.fHeight = 100;
|
| - texDesc.fSampleCnt = 0;
|
| - texDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
|
| - SkAutoTUnref<GrSurface> dummySurface(ctx->textureProvider()->createTexture(texDesc, false));
|
| -
|
| - REPORTER_ASSERT(reporter, dummySurface && dummySurface->asTexture() &&
|
| - dummySurface->asRenderTarget());
|
| - if (!dummySurface || !dummySurface->asTexture() || !dummySurface->asRenderTarget()) {
|
| +
|
| + GrTestTarget tt;
|
| + ctx->getTestTarget(&tt);
|
| + if (!tt.target()) {
|
| + SkDEBUGFAIL("Couldn't get Gr test target.");
|
| return;
|
| }
|
| -
|
| - GrBackendObject textureHandle = dummySurface->asTexture()->getTextureHandle();
|
| +
|
| + // We currently have only implemented the texture uploads for GL.
|
| + const GrGLInterface* gl = tt.glInterface();
|
| + if (!gl) {
|
| + 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 = dummySurface->config();
|
| - wrappedDesc.fWidth = dummySurface->width();
|
| - wrappedDesc.fHeight = dummySurface->height();
|
| - wrappedDesc.fOrigin = dummySurface->origin();
|
| - wrappedDesc.fSampleCnt = dummySurface->asRenderTarget()->numColorSamples();
|
| + wrappedDesc.fConfig = kRGBA_8888_GrPixelConfig;
|
| + wrappedDesc.fWidth = kW;
|
| + wrappedDesc.fHeight = kH;
|
| + wrappedDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
| + wrappedDesc.fSampleCnt = 0;
|
| wrappedDesc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
| - wrappedDesc.fTextureHandle = textureHandle;
|
| + 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;
|
| + }
|
| + }
|
| + }
|
| + }
|
| }
|
| #endif
|
|
|
|
|