Index: tests/ResourceCacheTest.cpp |
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp |
index 18ec6e72a35bc7f0fc5037257e525a8372722bcd..f0e7bfa28428837dfceabcf113d9c89f459155ef 100644 |
--- a/tests/ResourceCacheTest.cpp |
+++ b/tests/ResourceCacheTest.cpp |
@@ -12,17 +12,21 @@ |
#include "GrContext.h" |
#include "GrContextFactory.h" |
+#include "gl/GrGLInterface.h" |
#include "GrGpu.h" |
#include "GrGpuResourceCacheAccess.h" |
#include "GrGpuResourcePriv.h" |
#include "GrRenderTarget.h" |
#include "GrRenderTargetPriv.h" |
#include "GrResourceCache.h" |
+#include "GrTest.h" |
#include "SkCanvas.h" |
#include "SkGr.h" |
#include "SkMessageBus.h" |
#include "SkSurface.h" |
#include "Test.h" |
+#include "../src/gpu/gl/GrGLDefines.h" |
+#include "../src/gpu/gl/GrGLUtil.h" |
static const int gWidth = 640; |
static const int gHeight = 480; |
@@ -173,6 +177,65 @@ static void test_stencil_buffers(skiatest::Reporter* reporter, GrContext* contex |
} |
} |
+static void test_wrapped_resources(skiatest::Reporter* reporter, GrContext* context) { |
+ GrTestTarget tt; |
+ context->getTestTarget(&tt); |
+ |
+ const GrGLInterface* gl = tt.glInterface(); |
+ if (!gl) { |
+ return; |
+ } |
+ |
+ GrGLuint texIDs[2]; |
+ static const int kW = 100; |
+ static const int kH = 100; |
+ GR_GL_CALL(gl, GenTextures(2, texIDs)); |
+ 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, texIDs[0])); |
+ GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA, |
+ GR_GL_UNSIGNED_BYTE, NULL)); |
+ GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, texIDs[1])); |
+ GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, kW, kH, 0, GR_GL_RGBA, |
+ GR_GL_UNSIGNED_BYTE, NULL)); |
+ context->resetContext(); |
+ |
+ GrBackendTextureDesc desc; |
+ desc.fConfig = kBGRA_8888_GrPixelConfig; |
+ desc.fWidth = kW; |
+ desc.fHeight = kH; |
+ |
+ desc.fTextureHandle = texIDs[0]; |
+ SkAutoTUnref<GrTexture> borrowed(context->textureProvider()->wrapBackendTexture( |
+ desc, kBorrow_GrWrapOwnership)); |
+ |
+ desc.fTextureHandle = texIDs[1]; |
+ SkAutoTUnref<GrTexture> adopted(context->textureProvider()->wrapBackendTexture( |
+ desc, kAdopt_GrWrapOwnership)); |
+ |
+ REPORTER_ASSERT(reporter, SkToBool(borrowed) && SkToBool(adopted)); |
+ if (!SkToBool(borrowed) || !SkToBool(adopted)) { |
+ return; |
+ } |
+ |
+ borrowed.reset(NULL); |
+ adopted.reset(NULL); |
+ |
+ context->flush(); |
+ |
+ GrGLboolean borrowedIsAlive; |
+ GrGLboolean adoptedIsAlive; |
+ GR_GL_CALL_RET(gl, borrowedIsAlive, IsTexture(texIDs[0])); |
+ GR_GL_CALL_RET(gl, adoptedIsAlive, IsTexture(texIDs[1])); |
+ |
+ REPORTER_ASSERT(reporter, borrowedIsAlive); |
+ REPORTER_ASSERT(reporter, !adoptedIsAlive); |
+ |
+ GR_GL_CALL(gl, GenTextures(1, &texIDs[0])); |
+ |
+ context->resetContext(); |
+} |
+ |
class TestResource : public GrGpuResource { |
static const size_t kDefaultSize = 100; |
enum ScratchConstructor { kScratchConstructor }; |
@@ -357,7 +420,7 @@ static void test_budgeting(skiatest::Reporter* reporter) { |
unique->setSize(11); |
unique->resourcePriv().setUniqueKey(uniqueKey); |
TestResource* wrapped = SkNEW_ARGS(TestResource, |
- (context->getGpu(), GrGpuResource::kWrapped_LifeCycle)); |
+ (context->getGpu(), GrGpuResource::kBorrowed_LifeCycle)); |
wrapped->setSize(12); |
TestResource* unbudgeted = SkNEW_ARGS(TestResource, |
(context->getGpu(), GrGpuResource::kUncached_LifeCycle)); |
@@ -395,7 +458,7 @@ static void test_budgeting(skiatest::Reporter* reporter) { |
unbudgeted->gpuMemorySize() == cache->getResourceBytes()); |
// Now try freeing the budgeted resources first |
- wrapped = SkNEW_ARGS(TestResource, (context->getGpu(), GrGpuResource::kWrapped_LifeCycle)); |
+ wrapped = SkNEW_ARGS(TestResource, (context->getGpu(), GrGpuResource::kBorrowed_LifeCycle)); |
scratch->setSize(12); |
unique->unref(); |
cache->purgeAllUnlocked(); |
@@ -472,7 +535,7 @@ static void test_unbudgeted(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, 21 == cache->getBudgetedResourceBytes()); |
wrapped = SkNEW_ARGS(TestResource, |
- (context->getGpu(), large, GrGpuResource::kWrapped_LifeCycle)); |
+ (context->getGpu(), large, GrGpuResource::kBorrowed_LifeCycle)); |
REPORTER_ASSERT(reporter, 3 == cache->getResourceCount()); |
REPORTER_ASSERT(reporter, 21 + large == cache->getResourceBytes()); |
REPORTER_ASSERT(reporter, 2 == cache->getBudgetedResourceCount()); |
@@ -1193,6 +1256,7 @@ DEF_GPUTEST(ResourceCache, reporter, factory) { |
SkSurface::kNo_Budgeted, info)); |
test_cache(reporter, context, surface->getCanvas()); |
test_stencil_buffers(reporter, context); |
+ test_wrapped_resources(reporter, context); |
} |
// The below tests create their own mock contexts. |