Index: cc/resources/resource_provider_unittest.cc |
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc |
index 34b604a8c3fae239a8def0ce66654ce48249383e..2c8ed584e5241538cd71924efc63041b9149491a 100644 |
--- a/cc/resources/resource_provider_unittest.cc |
+++ b/cc/resources/resource_provider_unittest.cc |
@@ -2603,89 +2603,156 @@ TEST_P(ResourceProviderTest, TextureMailbox_SharedMemory) { |
EXPECT_EQ(main_thread_task_runner_.get(), main_thread_task_runner); |
} |
-TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D) { |
- // Mailboxing is only supported for GL textures. |
- if (GetParam() != ResourceProvider::GLTexture) |
- return; |
+class ResourceProviderTestTextureMailboxGLFilters |
+ : public ResourceProviderTest { |
+ public: |
+ static void RunTest(TestSharedBitmapManager* shared_bitmap_manager, |
+ TestGpuMemoryBufferManager* gpu_memory_buffer_manager, |
+ BlockingTaskRunner* main_thread_task_runner, |
+ bool mailbox_nearest_neighbor, |
+ GLenum sampler_filter) { |
+ scoped_ptr<TextureStateTrackingContext> context_owned( |
+ new TextureStateTrackingContext); |
+ TextureStateTrackingContext* context = context_owned.get(); |
- scoped_ptr<TextureStateTrackingContext> context_owned( |
- new TextureStateTrackingContext); |
- TextureStateTrackingContext* context = context_owned.get(); |
+ FakeOutputSurfaceClient output_surface_client; |
+ scoped_ptr<OutputSurface> output_surface( |
+ FakeOutputSurface::Create3d(context_owned.Pass())); |
+ CHECK(output_surface->BindToClient(&output_surface_client)); |
- FakeOutputSurfaceClient output_surface_client; |
- scoped_ptr<OutputSurface> output_surface( |
- FakeOutputSurface::Create3d(context_owned.Pass())); |
- CHECK(output_surface->BindToClient(&output_surface_client)); |
+ scoped_ptr<ResourceProvider> resource_provider( |
+ ResourceProvider::Create(output_surface.get(), |
+ shared_bitmap_manager, |
+ gpu_memory_buffer_manager, |
+ main_thread_task_runner, |
+ 0, |
+ false, |
+ 1)); |
- scoped_ptr<ResourceProvider> resource_provider( |
- ResourceProvider::Create(output_surface.get(), |
- shared_bitmap_manager_.get(), |
- gpu_memory_buffer_manager_.get(), |
- main_thread_task_runner_.get(), |
- 0, |
- false, |
- 1)); |
+ unsigned texture_id = 1; |
+ uint32 sync_point = 30; |
+ unsigned target = GL_TEXTURE_2D; |
- unsigned texture_id = 1; |
- uint32 sync_point = 30; |
- unsigned target = GL_TEXTURE_2D; |
+ EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
+ EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
+ EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
+ EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); |
+ EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0); |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); |
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0); |
+ gpu::Mailbox gpu_mailbox; |
+ memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1); |
+ uint32 release_sync_point = 0; |
+ bool lost_resource = false; |
+ BlockingTaskRunner* mailbox_task_runner = NULL; |
+ scoped_ptr<SingleReleaseCallbackImpl> callback = |
+ SingleReleaseCallbackImpl::Create(base::Bind(&ReleaseCallback, |
+ &release_sync_point, |
+ &lost_resource, |
+ &mailbox_task_runner)); |
- gpu::Mailbox gpu_mailbox; |
- memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1); |
- uint32 release_sync_point = 0; |
- bool lost_resource = false; |
- BlockingTaskRunner* main_thread_task_runner = NULL; |
- scoped_ptr<SingleReleaseCallbackImpl> callback = |
- SingleReleaseCallbackImpl::Create(base::Bind(&ReleaseCallback, |
- &release_sync_point, |
- &lost_resource, |
- &main_thread_task_runner)); |
+ TextureMailbox mailbox(gpu_mailbox, target, sync_point); |
+ mailbox.set_nearest_neighbor(mailbox_nearest_neighbor); |
- TextureMailbox mailbox(gpu_mailbox, target, sync_point); |
+ ResourceProvider::ResourceId id = |
+ resource_provider->CreateResourceFromTextureMailbox(mailbox, |
+ callback.Pass()); |
+ EXPECT_NE(0u, id); |
- ResourceProvider::ResourceId id = |
- resource_provider->CreateResourceFromTextureMailbox( |
- mailbox, callback.Pass()); |
- EXPECT_NE(0u, id); |
+ Mock::VerifyAndClearExpectations(context); |
- Mock::VerifyAndClearExpectations(context); |
+ { |
+ // Mailbox sync point WaitSyncPoint before using the texture. |
+ EXPECT_CALL(*context, waitSyncPoint(sync_point)); |
+ resource_provider->WaitSyncPointIfNeeded(id); |
+ Mock::VerifyAndClearExpectations(context); |
- { |
- // Mailbox sync point WaitSyncPoint before using the texture. |
- EXPECT_CALL(*context, waitSyncPoint(sync_point)); |
- resource_provider->WaitSyncPointIfNeeded(id); |
- Mock::VerifyAndClearExpectations(context); |
+ // Using the texture does a consume of the mailbox. |
+ EXPECT_CALL(*context, bindTexture(target, texture_id)).Times(2); |
+ EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _)); |
- // Using the texture does a consume of the mailbox. |
- EXPECT_CALL(*context, bindTexture(target, texture_id)); |
- EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _)); |
+ EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
+ EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()).Times(0); |
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); |
+ // The sampler will reset these if |mailbox_nearest_neighbor| does not |
+ // match |sampler_filter|. |
+ if (mailbox_nearest_neighbor != (sampler_filter == GL_NEAREST)) { |
+ EXPECT_CALL(*context, texParameteri( |
+ GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, sampler_filter)); |
+ EXPECT_CALL(*context, texParameteri( |
+ GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, sampler_filter)); |
+ } |
- ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id); |
- Mock::VerifyAndClearExpectations(context); |
+ ResourceProvider::ScopedSamplerGL lock( |
+ resource_provider.get(), id, sampler_filter); |
+ Mock::VerifyAndClearExpectations(context); |
- // When done with it, a sync point should be inserted, but no produce is |
- // necessary. |
- EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
- EXPECT_CALL(*context, insertSyncPoint()); |
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); |
+ // When done with it, a sync point should be inserted, but no produce is |
+ // necessary. |
+ EXPECT_CALL(*context, bindTexture(_, _)).Times(0); |
+ EXPECT_CALL(*context, insertSyncPoint()); |
+ EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0); |
- EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0); |
+ EXPECT_CALL(*context, waitSyncPoint(_)).Times(0); |
+ EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0); |
+ } |
+ |
+ resource_provider->DeleteResource(id); |
+ EXPECT_EQ(0u, release_sync_point); |
+ EXPECT_FALSE(lost_resource); |
+ EXPECT_EQ(main_thread_task_runner, mailbox_task_runner); |
} |
+}; |
- resource_provider->DeleteResource(id); |
- EXPECT_EQ(0u, release_sync_point); |
- EXPECT_FALSE(lost_resource); |
- EXPECT_EQ(main_thread_task_runner_.get(), main_thread_task_runner); |
+TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_LinearToLinear) { |
+ // Mailboxing is only supported for GL textures. |
+ if (GetParam() != ResourceProvider::GLTexture) |
+ return; |
+ |
+ ResourceProviderTestTextureMailboxGLFilters::RunTest( |
+ shared_bitmap_manager_.get(), |
+ gpu_memory_buffer_manager_.get(), |
+ main_thread_task_runner_.get(), |
+ false, |
+ GL_LINEAR); |
+} |
+ |
+TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_NearestToNearest) { |
+ // Mailboxing is only supported for GL textures. |
+ if (GetParam() != ResourceProvider::GLTexture) |
+ return; |
+ |
+ ResourceProviderTestTextureMailboxGLFilters::RunTest( |
+ shared_bitmap_manager_.get(), |
+ gpu_memory_buffer_manager_.get(), |
+ main_thread_task_runner_.get(), |
+ true, |
+ GL_NEAREST); |
+} |
+ |
+TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_NearestToLinear) { |
+ // Mailboxing is only supported for GL textures. |
+ if (GetParam() != ResourceProvider::GLTexture) |
+ return; |
+ |
+ ResourceProviderTestTextureMailboxGLFilters::RunTest( |
+ shared_bitmap_manager_.get(), |
+ gpu_memory_buffer_manager_.get(), |
+ main_thread_task_runner_.get(), |
+ true, |
+ GL_LINEAR); |
+} |
+ |
+TEST_P(ResourceProviderTest, TextureMailbox_GLTexture2D_LinearToNearest) { |
+ // Mailboxing is only supported for GL textures. |
+ if (GetParam() != ResourceProvider::GLTexture) |
+ return; |
+ |
+ ResourceProviderTestTextureMailboxGLFilters::RunTest( |
+ shared_bitmap_manager_.get(), |
+ gpu_memory_buffer_manager_.get(), |
+ main_thread_task_runner_.get(), |
+ false, |
+ GL_NEAREST); |
} |
TEST_P(ResourceProviderTest, TextureMailbox_GLTextureExternalOES) { |