Index: cc/resources/resource_provider_unittest.cc |
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc |
index c7cba3ba1faf59ca848bd4654c36e0e1f92ed740..0ca3d021799b1d82f05c354fc9d54d2aa7c6ee52 100644 |
--- a/cc/resources/resource_provider_unittest.cc |
+++ b/cc/resources/resource_provider_unittest.cc |
@@ -874,6 +874,41 @@ TEST_P(ResourceProviderTest, Shutdown) { |
EXPECT_FALSE(lost_resource); |
} |
+static scoped_ptr<base::SharedMemory> CreateAndFillSharedMemory( |
+ gfx::Size size, uint32_t value) { |
+ scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); |
+ CHECK(shared_memory->CreateAndMapAnonymous(4 * size.GetArea())); |
+ uint32_t* pixels = reinterpret_cast<uint32_t*>(shared_memory->memory()); |
+ CHECK(pixels); |
+ std::fill_n(pixels, size.GetArea(), value); |
+ return shared_memory.Pass(); |
+} |
+ |
+static void ReleaseSharedMemoryCallback( |
+ bool* release_called, |
+ unsigned sync_point, bool lost_resource) { |
+ *release_called = true; |
+} |
+ |
+TEST_P(ResourceProviderTest, ShutdownSharedMemory) { |
+ if (GetParam() != ResourceProvider::Bitmap) |
+ return; |
+ |
+ gfx::Size size(64, 64); |
+ scoped_ptr<base::SharedMemory> shared_memory( |
+ CreateAndFillSharedMemory(size, 0)); |
+ |
+ bool release_called = false; |
+ TextureMailbox::ReleaseCallback callback = |
+ base::Bind(ReleaseSharedMemoryCallback, &release_called); |
+ resource_provider_->CreateResourceFromTextureMailbox( |
+ TextureMailbox(shared_memory.get(), size, callback)); |
+ |
+ resource_provider_.reset(); |
+ |
+ EXPECT_TRUE(release_called); |
+} |
+ |
TEST_P(ResourceProviderTest, ShutdownWithExportedResource) { |
// TextureMailbox callbacks only exist for GL textures for now. |
if (GetParam() != ResourceProvider::GLTexture) |
@@ -1072,6 +1107,37 @@ TEST_P(ResourceProviderTest, ManagedResource) { |
static void EmptyReleaseCallback(unsigned sync_point, bool lost_resource) {} |
+TEST_P(ResourceProviderTest, TextureMailbox_SharedMemory) { |
+ if (GetParam() != ResourceProvider::Bitmap) |
+ return; |
+ |
+ gfx::Size size(64, 64); |
+ const uint32_t kBadBeef = 0xbadbeef; |
+ scoped_ptr<base::SharedMemory> shared_memory( |
+ CreateAndFillSharedMemory(size, kBadBeef)); |
+ |
+ scoped_ptr<OutputSurface> output_surface( |
+ FakeOutputSurface::CreateSoftware(make_scoped_ptr( |
+ new SoftwareOutputDevice))); |
+ scoped_ptr<ResourceProvider> resource_provider( |
+ ResourceProvider::Create(output_surface.get(), 0)); |
+ |
+ TextureMailbox::ReleaseCallback callback = base::Bind(&EmptyReleaseCallback); |
+ TextureMailbox mailbox(shared_memory.get(), size, callback); |
+ |
+ ResourceProvider::ResourceId id = |
+ resource_provider->CreateResourceFromTextureMailbox(mailbox); |
+ EXPECT_NE(0u, id); |
+ |
+ { |
+ ResourceProvider::ScopedReadLockSoftware lock(resource_provider.get(), id); |
+ const SkBitmap* sk_bitmap = lock.sk_bitmap(); |
+ EXPECT_EQ(sk_bitmap->width(), size.width()); |
+ EXPECT_EQ(sk_bitmap->height(), size.height()); |
+ EXPECT_EQ(*sk_bitmap->getAddr32(16, 16), kBadBeef); |
+ } |
+} |
+ |
TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D) { |
// Mailboxing is only supported for GL textures. |
if (GetParam() != ResourceProvider::GLTexture) |