Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2800)

Unified Diff: cc/resource_provider_unittest.cc

Issue 11622008: cc: Defer texture allocation (to allow async allocations). (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase. Rebase test fixes. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resource_provider.cc ('k') | cc/resource_update_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « cc/resource_provider.cc ('k') | cc/resource_update_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698