Index: cc/resource_provider_unittest.cc |
diff --git a/cc/resource_provider_unittest.cc b/cc/resource_provider_unittest.cc |
index 869c518a37da8a4b09fa4dbed75d996537196c49..4e382e1bb1d215f86b09b34415ccf0460d2b491a 100644 |
--- a/cc/resource_provider_unittest.cc |
+++ b/cc/resource_provider_unittest.cc |
@@ -20,6 +20,10 @@ |
using namespace WebKit; |
using testing::Mock; |
+using testing::NiceMock; |
+using testing::Return; |
+using testing::StrictMock; |
+using testing::_; |
namespace cc { |
namespace { |
@@ -583,13 +587,15 @@ TEST_P(ResourceProviderTest, ScopedSampler) |
int textureId = 1; |
// Check that the texture gets created with the right sampler settings. |
- EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)); |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)) |
+ .Times(2); // Once to create and once to allocate. |
EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); |
EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
EXPECT_CALL(*context, texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM)); |
ResourceProvider::ResourceId id = resourceProvider->createResource(size, format, ResourceProvider::TextureUsageAny); |
+ resourceProvider->allocateForTesting(id); |
// Creating a sampler with the default filter should not change any texture |
// parameters. |
@@ -643,6 +649,92 @@ TEST_P(ResourceProviderTest, ManagedResource) |
Mock::VerifyAndClearExpectations(context); |
} |
+class AllocationTrackingContext3D : public FakeWebGraphicsContext3D { |
+public: |
+ MOCK_METHOD0(createTexture, WebGLId()); |
+ MOCK_METHOD1(deleteTexture, void(WebGLId texture_id)); |
+ MOCK_METHOD2(bindTexture, void(WGC3Denum target, WebGLId texture)); |
+ MOCK_METHOD9(texImage2D, void(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat, |
+ WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, |
+ WGC3Denum type, const void* pixels)); |
+ MOCK_METHOD9(texSubImage2D, void(WGC3Denum target, WGC3Dint level, WGC3Dint xoffset, WGC3Dint yoffset, |
+ WGC3Dsizei width, WGC3Dsizei height, WGC3Denum format, |
+ WGC3Denum type, const void* pixels)); |
+ MOCK_METHOD9(asyncTexImage2DCHROMIUM, void(WGC3Denum target, WGC3Dint level, WGC3Denum internalformat, |
+ WGC3Dsizei width, WGC3Dsizei height, WGC3Dint border, WGC3Denum format, |
+ WGC3Denum type, const void* pixels)); |
+ MOCK_METHOD9(asyncTexSubImage2DCHROMIUM, void(WGC3Denum target, WGC3Dint level, WGC3Dint xoffset, WGC3Dint yoffset, |
+ WGC3Dsizei width, WGC3Dsizei height, WGC3Denum format, |
+ WGC3Denum type, const void* pixels)); |
+}; |
+ |
+TEST_P(ResourceProviderTest, TextureAllocation) |
+{ |
+ // Only for GL textures. |
+ if (GetParam() != ResourceProvider::GLTexture) |
+ return; |
+ scoped_ptr<WebKit::WebGraphicsContext3D> mock_context( |
+ static_cast<WebKit::WebGraphicsContext3D*>(new NiceMock<AllocationTrackingContext3D>)); |
+ scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(mock_context.Pass())); |
+ |
+ gfx::Size size(2, 2); |
+ gfx::Vector2d offset(0, 0); |
+ gfx::Rect rect(0, 0, 2, 2); |
+ WGC3Denum format = GL_RGBA; |
+ ResourceProvider::ResourceId id = 0; |
+ uint8_t pixels[16] = {0}; |
+ int textureId = 123; |
+ |
+ AllocationTrackingContext3D* context = static_cast<AllocationTrackingContext3D*>(outputSurface->Context3D()); |
+ scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); |
+ |
+ // Lazy allocation. Don't allocate when creating the resource. |
+ EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
+ EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(1); |
+ EXPECT_CALL(*context, texImage2D(_,_,_,_,_,_,_,_,_)).Times(0); |
+ EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_,_,_,_,_,_,_,_,_)).Times(0); |
+ id = resourceProvider->createResource(size, format, ResourceProvider::TextureUsageAny); |
+ resourceProvider->deleteResource(id); |
+ Mock::VerifyAndClearExpectations(context); |
+ |
+ // Do allocate when we set the pixels. |
+ EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
+ EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(3); |
+ EXPECT_CALL(*context, texImage2D(_,_,_,2,2,_,_,_,_)).Times(1); |
+ EXPECT_CALL(*context, texSubImage2D(_,_,_,_,2,2,_,_,_)).Times(1); |
+ id = resourceProvider->createResource(size, format, ResourceProvider::TextureUsageAny); |
+ resourceProvider->setPixels(id, pixels, rect, rect, offset); |
+ resourceProvider->deleteResource(id); |
+ Mock::VerifyAndClearExpectations(context); |
+ |
+ // Same for setPixelsFromBuffer |
+ EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
+ EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(3); |
+ EXPECT_CALL(*context, texImage2D(_,_,_,2,2,_,_,_,_)).Times(1); |
+ EXPECT_CALL(*context, texSubImage2D(_,_,_,_,2,2,_,_,_)).Times(1); |
+ id = resourceProvider->createResource(size, format, ResourceProvider::TextureUsageAny); |
+ resourceProvider->acquirePixelBuffer(id); |
+ resourceProvider->setPixelsFromBuffer(id); |
+ resourceProvider->releasePixelBuffer(id); |
+ resourceProvider->deleteResource(id); |
+ Mock::VerifyAndClearExpectations(context); |
+ |
+ // Same for async version. |
+ EXPECT_CALL(*context, createTexture()).WillOnce(Return(textureId)); |
+ EXPECT_CALL(*context, deleteTexture(textureId)).Times(1); |
+ EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, textureId)).Times(2); |
+ EXPECT_CALL(*context, asyncTexImage2DCHROMIUM(_,_,_,2,2,_,_,_,_)).Times(1); |
+ id = resourceProvider->createResource(size, format, ResourceProvider::TextureUsageAny); |
+ resourceProvider->acquirePixelBuffer(id); |
+ resourceProvider->beginSetPixels(id); |
+ resourceProvider->releasePixelBuffer(id); |
+ resourceProvider->deleteResource(id); |
+ Mock::VerifyAndClearExpectations(context); |
+} |
+ |
INSTANTIATE_TEST_CASE_P(ResourceProviderTests, |
ResourceProviderTest, |
::testing::Values(ResourceProvider::GLTexture, |