Index: cc/resources/resource_provider_unittest.cc |
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc |
index c3ac798d58074308f83675975c649d2015dfc3e5..91e8d008792f7efe2eb2dea53a535c11fc7c147a 100644 |
--- a/cc/resources/resource_provider_unittest.cc |
+++ b/cc/resources/resource_provider_unittest.cc |
@@ -24,6 +24,7 @@ |
using testing::Mock; |
using testing::NiceMock; |
using testing::Return; |
+using testing::SetArgPointee; |
using testing::StrictMock; |
using testing::_; |
using WebKit::WGC3Dbyte; |
@@ -1235,7 +1236,15 @@ class AllocationTrackingContext3D : public TestWebGraphicsContext3D { |
WGC3Denum format, |
WGC3Denum type, |
const void* pixels)); |
- MOCK_METHOD1(waitAsyncTexImage2DCHROMIUM, void(WGC3Denum target)); |
+ MOCK_METHOD1(waitAsyncTexImage2DCHROMIUM, void(WGC3Denum)); |
+ MOCK_METHOD3(createImageCHROMIUM, WGC3Duint(WGC3Dsizei, WGC3Dsizei, |
+ WGC3Denum)); |
+ MOCK_METHOD1(destroyImageCHROMIUM, void(WGC3Duint)); |
+ MOCK_METHOD2(mapImageCHROMIUM, void*(WGC3Duint, WGC3Denum)); |
+ MOCK_METHOD3(getImageParameterivCHROMIUM, void(WGC3Duint, WGC3Denum, |
+ GLint*)); |
+ MOCK_METHOD1(unmapImageCHROMIUM, void(WGC3Duint)); |
+ MOCK_METHOD2(bindTexImage2DCHROMIUM, void(WGC3Denum, WGC3Dint)); |
}; |
TEST_P(ResourceProviderTest, TextureAllocation) { |
@@ -1417,6 +1426,82 @@ TEST_P(ResourceProviderTest, PixelBufferLostContext) { |
Mock::VerifyAndClearExpectations(context); |
} |
+TEST_P(ResourceProviderTest, GpuMemoryBuffers) { |
+ // Only for GL textures. |
+ if (GetParam() != ResourceProvider::GLTexture) |
+ return; |
+ scoped_ptr<WebKit::WebGraphicsContext3D> mock_context( |
+ static_cast<WebKit::WebGraphicsContext3D*>( |
+ new StrictMock<AllocationTrackingContext3D>)); |
+ scoped_ptr<OutputSurface> output_surface( |
+ FakeOutputSurface::Create3d(mock_context.Pass())); |
+ |
+ const int kWidth = 2; |
+ const int kHeight = 2; |
+ gfx::Size size(kWidth, kHeight); |
+ WGC3Denum format = GL_RGBA; |
+ ResourceProvider::ResourceId id = 0; |
+ const unsigned kTextureId = 123u; |
+ const unsigned kImageId = 234u; |
+ |
+ AllocationTrackingContext3D* context = |
+ static_cast<AllocationTrackingContext3D*>(output_surface->context3d()); |
+ scoped_ptr<ResourceProvider> resource_provider( |
+ ResourceProvider::Create(output_surface.get(), 0)); |
+ |
+ EXPECT_CALL(*context, createTexture()) |
+ .WillOnce(Return(kTextureId)) |
+ .RetiresOnSaturation(); |
+ |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kTextureId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ id = resource_provider->CreateResource( |
+ size, format, ResourceProvider::TextureUsageAny); |
+ EXPECT_CALL(*context, createImageCHROMIUM(kWidth, kHeight, GL_RGBA8_OES)) |
+ .WillOnce(Return(kImageId)) |
+ .RetiresOnSaturation(); |
+ resource_provider->AcquireImage(id); |
+ |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, kTextureId)).Times(1) |
+ .RetiresOnSaturation(); |
+ EXPECT_CALL(*context, bindTexImage2DCHROMIUM(GL_TEXTURE_2D, kImageId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ resource_provider->BindImage(id); |
+ |
+ void* dummy_mapped_buffer_address = NULL; |
+ EXPECT_CALL(*context, mapImageCHROMIUM(kImageId, GL_READ_WRITE)) |
+ .WillOnce(Return(dummy_mapped_buffer_address)) |
+ .RetiresOnSaturation(); |
+ resource_provider->MapImage(id); |
+ |
+ const int kStride = 4; |
+ EXPECT_CALL(*context, getImageParameterivCHROMIUM(kImageId, |
+ GL_IMAGE_ROWBYTES_CHROMIUM, |
+ _)) |
+ .WillOnce(SetArgPointee<2>(kStride)) |
+ .RetiresOnSaturation(); |
+ int stride = resource_provider->GetImageStride(id); |
+ EXPECT_EQ(kStride, stride); |
+ |
+ EXPECT_CALL(*context, unmapImageCHROMIUM(kImageId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ resource_provider->UnmapImage(id); |
+ |
+ EXPECT_CALL(*context, destroyImageCHROMIUM(kImageId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+ resource_provider->ReleaseImage(id); |
+ |
+ // Texture will be deleted when ResourceProvider destructor is |
+ // called when it goes out of scope when this method returns. |
+ EXPECT_CALL(*context, deleteTexture(kTextureId)) |
+ .Times(1) |
+ .RetiresOnSaturation(); |
+} |
+ |
INSTANTIATE_TEST_CASE_P( |
ResourceProviderTests, |
ResourceProviderTest, |