aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/image/SkSurface_Gpu.cpp3
-rw-r--r--tests/SurfaceTest.cpp103
2 files changed, 82 insertions, 24 deletions
diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp
index ff18a04754..20fcbf333e 100644
--- a/src/image/SkSurface_Gpu.cpp
+++ b/src/image/SkSurface_Gpu.cpp
@@ -113,8 +113,7 @@ SkSurface* SkSurface::NewWrappedRenderTarget(GrContext* context, GrBackendTextur
if (!surface) {
return NULL;
}
- SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(surface->asRenderTarget(), props,
- SkGpuDevice::kNeedClear_Flag));
+ SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(surface->asRenderTarget(), props));
if (!device) {
return NULL;
}
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index c38a3d7c63..34e5ab524a 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