diff options
author | epenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 07:57:36 +0000 |
---|---|---|
committer | epenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-19 07:57:36 +0000 |
commit | fd49cb768bd5461d28c7e22fe7ee017e3b5d1e01 (patch) | |
tree | f3ad073822a7e99f0a2d29b737c508be0dab8f9b /cc/resource_provider_unittest.cc | |
parent | b02f590b8663f6c40df80bb9e041c32d9b84b519 (diff) | |
download | chromium_src-fd49cb768bd5461d28c7e22fe7ee017e3b5d1e01.zip chromium_src-fd49cb768bd5461d28c7e22fe7ee017e3b5d1e01.tar.gz chromium_src-fd49cb768bd5461d28c7e22fe7ee017e3b5d1e01.tar.bz2 |
cc: Defer texture allocation (to allow async allocations).
For textures, delay allocating until the first setPixels
or beginSetPixels. This allows us to do a combined async
allocation/upload in beginSetPixels.
BUG=161337
Review URL: https://chromiumcodereview.appspot.com/11622008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173875 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/resource_provider_unittest.cc')
-rw-r--r-- | cc/resource_provider_unittest.cc | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/cc/resource_provider_unittest.cc b/cc/resource_provider_unittest.cc index 0a737e5..f57061a 100644 --- a/cc/resource_provider_unittest.cc +++ b/cc/resource_provider_unittest.cc @@ -20,6 +20,9 @@ using namespace WebKit; using testing::Mock; +using testing::StrictMock; +using testing::NiceMock; +using testing::_; namespace cc { namespace { @@ -587,6 +590,7 @@ TEST_P(ResourceProviderTest, ScopedSampler) 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. @@ -640,6 +644,76 @@ TEST_P(ResourceProviderTest, ManagedResource) Mock::VerifyAndClearExpectations(context); } +class AllocationTrackingContext3D : public FakeWebGraphicsContext3D { +public: + 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}; + + 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, 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, 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, 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, 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, |