summaryrefslogtreecommitdiffstats
path: root/cc/resource_provider_unittest.cc
diff options
context:
space:
mode:
authorepenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 07:57:36 +0000
committerepenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-19 07:57:36 +0000
commitfd49cb768bd5461d28c7e22fe7ee017e3b5d1e01 (patch)
treef3ad073822a7e99f0a2d29b737c508be0dab8f9b /cc/resource_provider_unittest.cc
parentb02f590b8663f6c40df80bb9e041c32d9b84b519 (diff)
downloadchromium_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.cc74
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,