diff options
author | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-19 00:42:45 +0000 |
---|---|---|
committer | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-19 00:42:45 +0000 |
commit | e00bab02826a261b4b0d1434671802d311b56a5b (patch) | |
tree | 0bdce7835d16fd551fdccedfb2dd2ec28c6a33b4 | |
parent | b77ae7511ca2aa803ae279855bd43acae3eebf84 (diff) | |
download | chromium_src-e00bab02826a261b4b0d1434671802d311b56a5b.zip chromium_src-e00bab02826a261b4b0d1434671802d311b56a5b.tar.gz chromium_src-e00bab02826a261b4b0d1434671802d311b56a5b.tar.bz2 |
cc: return resources via a ReturnedResource struct rather than TransferableResource
This allows us to return a count, as well as reducing the size significantly
since we don't need to return the mailbox.
This is built on top of https://codereview.chromium.org/23023005
BUG=263068
Review URL: https://chromiumcodereview.appspot.com/23097005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@218214 0039d316-1c4b-4281-b951-d872f2087c98
22 files changed, 213 insertions, 189 deletions
@@ -317,6 +317,7 @@ 'resources/resource_update_controller.h', 'resources/resource_update_queue.cc', 'resources/resource_update_queue.h', + 'resources/returned_resource.h', 'resources/scoped_resource.cc', 'resources/scoped_resource.h', 'resources/scoped_ui_resource.cc', diff --git a/cc/layers/delegated_renderer_layer.cc b/cc/layers/delegated_renderer_layer.cc index 45a432f..0ffa54a 100644 --- a/cc/layers/delegated_renderer_layer.cc +++ b/cc/layers/delegated_renderer_layer.cc @@ -70,10 +70,9 @@ void DelegatedRendererLayer::SetFrameData( if (frame_data_) { // Copy the resources from the last provided frame into the unused resources // list, as the new frame will provide its own resources. - unused_resources_for_child_compositor_.insert( - unused_resources_for_child_compositor_.end(), - frame_data_->resource_list.begin(), - frame_data_->resource_list.end()); + TransferableResource::ReturnResources( + frame_data_->resource_list, + &unused_resources_for_child_compositor_); } frame_data_ = new_frame_data.Pass(); if (!frame_data_->render_pass_list.empty()) { @@ -87,7 +86,7 @@ void DelegatedRendererLayer::SetFrameData( } void DelegatedRendererLayer::TakeUnusedResourcesForChildCompositor( - TransferableResourceArray* array) { + ReturnedResourceArray* array) { DCHECK(array->empty()); array->clear(); diff --git a/cc/layers/delegated_renderer_layer.h b/cc/layers/delegated_renderer_layer.h index 3f5280e..f16217b 100644 --- a/cc/layers/delegated_renderer_layer.h +++ b/cc/layers/delegated_renderer_layer.h @@ -7,7 +7,7 @@ #include "cc/base/cc_export.h" #include "cc/layers/layer.h" -#include "cc/resources/transferable_resource.h" +#include "cc/resources/returned_resource.h" namespace cc { @@ -34,7 +34,7 @@ class CC_EXPORT DelegatedRendererLayer : public Layer { // Passes ownership of any unused resources that had been given by the child // compositor to the given array, so they can be given back to the child. - void TakeUnusedResourcesForChildCompositor(TransferableResourceArray* array); + void TakeUnusedResourcesForChildCompositor(ReturnedResourceArray* array); virtual bool BlocksPendingCommit() const OVERRIDE; @@ -47,7 +47,7 @@ class CC_EXPORT DelegatedRendererLayer : public Layer { gfx::RectF damage_in_frame_; gfx::Size frame_size_; gfx::Size display_size_; - TransferableResourceArray unused_resources_for_child_compositor_; + ReturnedResourceArray unused_resources_for_child_compositor_; DelegatedRendererLayerClient* client_; diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc index 2dfdac6..426dcbb 100644 --- a/cc/layers/delegated_renderer_layer_impl.cc +++ b/cc/layers/delegated_renderer_layer_impl.cc @@ -145,7 +145,7 @@ void DelegatedRendererLayerImpl::SetFrameData( } void DelegatedRendererLayerImpl::CollectUnusedResources( - TransferableResourceArray* resources_for_ack) { + ReturnedResourceArray* resources_for_ack) { CreateChildIdIfNeeded(); DCHECK(child_id_); @@ -163,7 +163,7 @@ void DelegatedRendererLayerImpl::CollectUnusedResources( if (!resource_is_in_current_frame && !resource_is_in_use) unused_resources.push_back(it->second); } - resource_provider->PrepareSendToChild( + resource_provider->PrepareSendReturnsToChild( child_id_, unused_resources, resources_for_ack); } diff --git a/cc/layers/delegated_renderer_layer_impl.h b/cc/layers/delegated_renderer_layer_impl.h index 9cfdcb6..89b2537 100644 --- a/cc/layers/delegated_renderer_layer_impl.h +++ b/cc/layers/delegated_renderer_layer_impl.h @@ -43,7 +43,7 @@ class CC_EXPORT DelegatedRendererLayerImpl : public LayerImpl { void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data, gfx::RectF damage_in_frame); - void CollectUnusedResources(TransferableResourceArray* resources_for_ack); + void CollectUnusedResources(ReturnedResourceArray* resources_for_ack); void SetDisplaySize(gfx::Size size); diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index 46f9d51..8fb2a15 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc @@ -10,6 +10,7 @@ #include "cc/debug/test_web_graphics_context_3d.h" #include "cc/layers/texture_layer_client.h" #include "cc/layers/texture_layer_impl.h" +#include "cc/resources/returned_resource.h" #include "cc/test/fake_impl_proxy.h" #include "cc/test/fake_layer_tree_host_client.h" #include "cc/test/fake_layer_tree_host_impl.h" @@ -785,7 +786,9 @@ TEST_F(TextureLayerImplWithMailboxTest, TestCallbackOnInUseResource) { EXPECT_CALL(test_data_.mock_callback_, Release(test_data_.mailbox_name1_, _, false)) .Times(1); - provider->ReceiveFromParent(list); + ReturnedResourceArray returned; + TransferableResource::ReturnResources(list, &returned); + provider->ReceiveReturnsFromParent(returned); } // Check that ClearClient correctly clears the state so that the impl side diff --git a/cc/output/compositor_frame_ack.h b/cc/output/compositor_frame_ack.h index 276ecf0..943a206 100644 --- a/cc/output/compositor_frame_ack.h +++ b/cc/output/compositor_frame_ack.h @@ -8,7 +8,7 @@ #include "base/memory/scoped_ptr.h" #include "cc/base/cc_export.h" #include "cc/output/gl_frame_data.h" -#include "cc/resources/transferable_resource.h" +#include "cc/resources/returned_resource.h" namespace cc { @@ -17,7 +17,7 @@ class CC_EXPORT CompositorFrameAck { CompositorFrameAck(); ~CompositorFrameAck(); - TransferableResourceArray resources; + ReturnedResourceArray resources; scoped_ptr<GLFrameData> gl_frame_data; unsigned last_software_frame_id; diff --git a/cc/output/delegating_renderer.cc b/cc/output/delegating_renderer.cc index be8ab03..226fddb 100644 --- a/cc/output/delegating_renderer.cc +++ b/cc/output/delegating_renderer.cc @@ -168,7 +168,7 @@ void DelegatingRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { void DelegatingRenderer::ReceiveSwapBuffersAck( const CompositorFrameAck& ack) { - resource_provider_->ReceiveFromParent(ack.resources); + resource_provider_->ReceiveReturnsFromParent(ack.resources); } bool DelegatingRenderer::IsContextLost() { diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index b39908a..ff339e9 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc @@ -14,6 +14,7 @@ #include "base/strings/string_util.h" #include "cc/output/gl_renderer.h" // For the GLC() macro. #include "cc/resources/platform_color.h" +#include "cc/resources/returned_resource.h" #include "cc/resources/transferable_resource.h" #include "cc/scheduler/texture_uploader.h" #include "gpu/GLES2/gl2extchromium.h" @@ -183,10 +184,7 @@ ResourceProvider::~ResourceProvider() { } bool ResourceProvider::InUseByConsumer(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); return resource->lock_for_read_count > 0 || resource->exported_count > 0; } @@ -377,10 +375,7 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, ResourceProvider::ResourceType ResourceProvider::GetResourceType( ResourceId id) { - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - return resource->type; + return GetResource(id)->type; } void ResourceProvider::SetPixels(ResourceId id, @@ -388,10 +383,7 @@ void ResourceProvider::SetPixels(ResourceId id, gfx::Rect image_rect, gfx::Rect source_rect, gfx::Vector2d dest_offset) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->locked_for_write); DCHECK(!resource->lock_for_read_count); DCHECK(!resource->external); @@ -493,11 +485,15 @@ bool ResourceProvider::ShallowFlushIfSupported() { return true; } -const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { +ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) { DCHECK(thread_checker_.CalledOnValidThread()); ResourceMap::iterator it = resources_.find(id); CHECK(it != resources_.end()); - Resource* resource = &it->second; + return &it->second; +} + +const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { + Resource* resource = GetResource(id); DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced) << "locked for write: " << resource->locked_for_write << @@ -533,10 +529,7 @@ const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { } void ResourceProvider::UnlockForRead(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK_GT(resource->lock_for_read_count, 0); DCHECK_EQ(resource->exported_count, 0); resource->lock_for_read_count--; @@ -544,10 +537,7 @@ void ResourceProvider::UnlockForRead(ResourceId id) { const ResourceProvider::Resource* ResourceProvider::LockForWrite( ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->locked_for_write); DCHECK(!resource->lock_for_read_count); DCHECK_EQ(resource->exported_count, 0); @@ -560,10 +550,7 @@ const ResourceProvider::Resource* ResourceProvider::LockForWrite( } bool ResourceProvider::CanLockForWrite(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); return !resource->locked_for_write && !resource->lock_for_read_count && !resource->exported_count && @@ -572,10 +559,7 @@ bool ResourceProvider::CanLockForWrite(ResourceId id) { } void ResourceProvider::UnlockForWrite(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(resource->locked_for_write); DCHECK_EQ(resource->exported_count, 0); DCHECK(!resource->external); @@ -820,9 +804,10 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, } } -void ResourceProvider::PrepareSendToChild(int child, - const ResourceIdArray& resources, - TransferableResourceArray* list) { +void ResourceProvider::PrepareSendReturnsToChild( + int child, + const ResourceIdArray& resources, + ReturnedResourceArray* list) { DCHECK(thread_checker_.CalledOnValidThread()); WebGraphicsContext3D* context3d = Context3d(); if (!context3d || !context3d->makeContextCurrent()) { @@ -832,27 +817,31 @@ void ResourceProvider::PrepareSendToChild(int child, Child& child_info = children_.find(child)->second; bool need_sync_point = false; for (ResourceIdArray::const_iterator it = resources.begin(); - it != resources.end(); - ++it) { - TransferableResource resource; - TransferResource(context3d, *it, &resource); - if (!resource.sync_point) - need_sync_point = true; + it != resources.end(); ++it) { + Resource* resource = GetResource(*it); + DCHECK(!resource->locked_for_write); + DCHECK(!resource->lock_for_read_count); DCHECK(child_info.parent_to_child_map.find(*it) != child_info.parent_to_child_map.end()); - resource.id = child_info.parent_to_child_map[*it]; + + ReturnedResource returned; + returned.id = child_info.parent_to_child_map[*it]; + returned.filter = resource->filter; + returned.sync_point = resource->mailbox.sync_point(); + if (!returned.sync_point) + need_sync_point = true; + returned.count = resource->imported_count; + list->push_back(returned); + child_info.parent_to_child_map.erase(*it); - child_info.child_to_parent_map.erase(resource.id); - for (int i = 0; i < resources_[*it].imported_count; ++i) - list->push_back(resource); + child_info.child_to_parent_map.erase(returned.id); resources_[*it].imported_count = 0; DeleteResource(*it); } if (need_sync_point) { unsigned int sync_point = context3d->insertSyncPoint(); - for (TransferableResourceArray::iterator it = list->begin(); - it != list->end(); - ++it) { + for (ReturnedResourceArray::iterator it = list->begin(); + it != list->end(); ++it) { if (!it->sync_point) it->sync_point = sync_point; } @@ -903,26 +892,25 @@ void ResourceProvider::ReceiveFromChild( } } -void ResourceProvider::ReceiveFromParent( - const TransferableResourceArray& resources) { +void ResourceProvider::ReceiveReturnsFromParent( + const ReturnedResourceArray& resources) { DCHECK(thread_checker_.CalledOnValidThread()); WebGraphicsContext3D* context3d = Context3d(); if (!context3d || !context3d->makeContextCurrent()) { // TODO(skaslev): Implement this path for software compositing. return; } - for (TransferableResourceArray::const_iterator it = resources.begin(); + for (ReturnedResourceArray::const_iterator it = resources.begin(); it != resources.end(); ++it) { ResourceMap::iterator map_iterator = resources_.find(it->id); DCHECK(map_iterator != resources_.end()); Resource* resource = &map_iterator->second; - DCHECK_GT(resource->exported_count, 0); - --resource->exported_count; + CHECK_GE(resource->exported_count, it->count); + resource->exported_count -= it->count; if (resource->exported_count) continue; resource->filter = it->filter; - DCHECK(resource->mailbox.ContainsMailbox(it->mailbox)); if (resource->gl_id) { if (it->sync_point) GLC(context3d, context3d->waitSyncPoint(it->sync_point)); @@ -939,10 +927,7 @@ void ResourceProvider::ReceiveFromParent( void ResourceProvider::TransferResource(WebGraphicsContext3D* context, ResourceId id, TransferableResource* resource) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* source = &it->second; + Resource* source = GetResource(id); DCHECK(!source->locked_for_write); DCHECK(!source->lock_for_read_count); DCHECK(!source->external || (source->external && source->mailbox.IsValid())); @@ -974,10 +959,7 @@ void ResourceProvider::TransferResource(WebGraphicsContext3D* context, } void ResourceProvider::AcquirePixelBuffer(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); DCHECK(!resource->image_id); @@ -1007,10 +989,7 @@ void ResourceProvider::AcquirePixelBuffer(ResourceId id) { } void ResourceProvider::ReleasePixelBuffer(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); DCHECK(!resource->image_id); @@ -1052,10 +1031,7 @@ void ResourceProvider::ReleasePixelBuffer(ResourceId id) { } uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); DCHECK(!resource->image_id); @@ -1083,10 +1059,7 @@ uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { } void ResourceProvider::UnmapPixelBuffer(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); DCHECK(!resource->image_id); @@ -1158,10 +1131,7 @@ void ResourceProvider::UnbindForSampling( } void ResourceProvider::BeginSetPixels(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(!resource->pending_set_pixels); LazyCreate(resource); @@ -1226,10 +1196,7 @@ void ResourceProvider::BeginSetPixels(ResourceId id) { } void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(resource->locked_for_write); DCHECK(resource->pending_set_pixels); DCHECK(!resource->set_pixels_completion_forced); @@ -1245,10 +1212,7 @@ void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { } bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); DCHECK(resource->locked_for_write); DCHECK(resource->pending_set_pixels); @@ -1272,10 +1236,7 @@ bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { } void ResourceProvider::CreateForTesting(ResourceId id) { - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - LazyCreate(resource); + LazyCreate(GetResource(id)); } void ResourceProvider::LazyCreate(Resource* resource) { @@ -1301,10 +1262,7 @@ void ResourceProvider::LazyCreate(Resource* resource) { } void ResourceProvider::AllocateForTesting(ResourceId id) { - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - LazyAllocate(resource); + LazyAllocate(GetResource(id)); } void ResourceProvider::LazyAllocate(Resource* resource) { @@ -1341,19 +1299,12 @@ void ResourceProvider::LazyAllocate(Resource* resource) { void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, bool enable) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; + Resource* resource = GetResource(id); resource->enable_read_lock_fences = enable; } void ResourceProvider::AcquireImage(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); @@ -1373,11 +1324,7 @@ void ResourceProvider::AcquireImage(ResourceId id) { } void ResourceProvider::ReleaseImage(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); @@ -1392,11 +1339,7 @@ void ResourceProvider::ReleaseImage(ResourceId id) { } uint8_t* ResourceProvider::MapImage(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - + Resource* resource = GetResource(id); DCHECK(ReadLockFenceHasPassed(resource)); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); @@ -1415,11 +1358,7 @@ uint8_t* ResourceProvider::MapImage(ResourceId id) { } void ResourceProvider::UnmapImage(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); @@ -1431,11 +1370,7 @@ void ResourceProvider::UnmapImage(ResourceId id) { } int ResourceProvider::GetImageStride(ResourceId id) { - DCHECK(thread_checker_.CalledOnValidThread()); - ResourceMap::iterator it = resources_.find(id); - CHECK(it != resources_.end()); - Resource* resource = &it->second; - + Resource* resource = GetResource(id); DCHECK(!resource->external); DCHECK_EQ(resource->exported_count, 0); diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h index c434b3a..73b6e2b 100644 --- a/cc/resources/resource_provider.h +++ b/cc/resources/resource_provider.h @@ -152,9 +152,9 @@ class CC_EXPORT ResourceProvider { // Resources are removed from the ResourceProvider. Note: the resource IDs // passed are in the parent namespace and will be translated to the child // namespace when returned. - void PrepareSendToChild(int child, - const ResourceIdArray& resources, - TransferableResourceArray* transferable_resources); + void PrepareSendReturnsToChild(int child, + const ResourceIdArray& resources, + ReturnedResourceArray* returned_resources); // Receives resources from a child, moving them from mailboxes. Resource IDs // passed are in the child namespace, and will be translated to the parent @@ -168,8 +168,8 @@ class CC_EXPORT ResourceProvider { // IDs passed are in the child namespace. // NOTE: if the sync_point is set on any TransferableResource, this will // wait on it. - void ReceiveFromParent( - const TransferableResourceArray& transferable_resources); + void ReceiveReturnsFromParent( + const ReturnedResourceArray& transferable_resources); // The following lock classes are part of the ResourceProvider API and are // needed to read and write the resource contents. The user must ensure @@ -392,6 +392,7 @@ class CC_EXPORT ResourceProvider { void CleanUpGLIfNeeded(); + Resource* GetResource(ResourceId id); const Resource* LockForRead(ResourceId id); void UnlockForRead(ResourceId id); const Resource* LockForWrite(ResourceId id); diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc index 83e90b4..dec66d6 100644 --- a/cc/resources/resource_provider_unittest.cc +++ b/cc/resources/resource_provider_unittest.cc @@ -13,6 +13,7 @@ #include "cc/base/scoped_ptr_deque.h" #include "cc/debug/test_web_graphics_context_3d.h" #include "cc/output/output_surface.h" +#include "cc/resources/returned_resource.h" #include "cc/test/fake_output_surface.h" #include "cc/test/fake_output_surface_client.h" #include "gpu/GLES2/gl2extchromium.h" @@ -602,7 +603,9 @@ TEST_P(ResourceProviderTest, TransferResources) { &list); EXPECT_EQ(1u, list.size()); EXPECT_EQ(id1, list[0].id); - child_resource_provider->ReceiveFromParent(list); + ReturnedResourceArray returned; + TransferableResource::ReturnResources(list, &returned); + child_resource_provider->ReceiveReturnsFromParent(returned); // id1 was exported twice, we returned it only once, it should still be // in-use. EXPECT_TRUE(child_resource_provider->InUseByConsumer(id1)); @@ -612,13 +615,13 @@ TEST_P(ResourceProviderTest, TransferResources) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(mapped_id1); resource_ids_to_transfer.push_back(mapped_id2); - TransferableResourceArray list; - resource_provider_->PrepareSendToChild( + ReturnedResourceArray list; + resource_provider_->PrepareSendReturnsToChild( child_id, resource_ids_to_transfer, &list); ASSERT_EQ(2u, list.size()); EXPECT_NE(0u, list[0].sync_point); EXPECT_NE(0u, list[1].sync_point); - child_resource_provider->ReceiveFromParent(list); + child_resource_provider->ReceiveReturnsFromParent(list); } EXPECT_FALSE(child_resource_provider->InUseByConsumer(id1)); EXPECT_FALSE(child_resource_provider->InUseByConsumer(id2)); @@ -711,12 +714,12 @@ TEST_P(ResourceProviderTest, DeleteTransferredResources) { EXPECT_NE(0u, mapped_id); ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(mapped_id); - TransferableResourceArray list; - resource_provider_->PrepareSendToChild( + ReturnedResourceArray list; + resource_provider_->PrepareSendReturnsToChild( child_id, resource_ids_to_transfer, &list); ASSERT_EQ(1u, list.size()); EXPECT_NE(0u, list[0].sync_point); - child_resource_provider->ReceiveFromParent(list); + child_resource_provider->ReceiveReturnsFromParent(list); } EXPECT_EQ(0u, child_resource_provider->num_resources()); } @@ -783,12 +786,12 @@ TEST_P(ResourceProviderTest, TextureFilters) { // Transfer resources back from the parent to the child. ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(mapped_id); - TransferableResourceArray list; - resource_provider_->PrepareSendToChild( + ReturnedResourceArray list; + resource_provider_->PrepareSendReturnsToChild( child_id, resource_ids_to_transfer, &list); ASSERT_EQ(1u, list.size()); EXPECT_EQ(static_cast<unsigned>(GL_LINEAR), list[0].filter); - child_resource_provider->ReceiveFromParent(list); + child_resource_provider->ReceiveReturnsFromParent(list); } EXPECT_EQ(static_cast<unsigned>(GL_LINEAR), GetResourceFilter(child_resource_provider.get(), @@ -861,7 +864,9 @@ TEST_P(ResourceProviderTest, TransferMailboxResources) { // Receive the resource, then delete it, expect the sync points to be // consistent. - resource_provider_->ReceiveFromParent(list); + ReturnedResourceArray returned; + TransferableResource::ReturnResources(list, &returned); + resource_provider_->ReceiveReturnsFromParent(returned); EXPECT_EQ(1, context()->texture_count()); EXPECT_EQ(0u, release_sync_point); @@ -910,7 +915,9 @@ TEST_P(ResourceProviderTest, TransferMailboxResources) { // Then receive the resource which should release the mailbox, expect the // sync points to be consistent. - resource_provider_->ReceiveFromParent(list); + ReturnedResourceArray returned; + TransferableResource::ReturnResources(list, &returned); + resource_provider_->ReceiveReturnsFromParent(returned); EXPECT_LE(list[0].sync_point, release_sync_point); EXPECT_FALSE(lost_resource); } diff --git a/cc/resources/returned_resource.h b/cc/resources/returned_resource.h new file mode 100644 index 0000000..aa6b99a --- /dev/null +++ b/cc/resources/returned_resource.h @@ -0,0 +1,27 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_RESOURCES_RETURNED_RESOURCE_H_ +#define CC_RESOURCES_RETURNED_RESOURCE_H_ + +#include <vector> + +#include "base/basictypes.h" +#include "cc/base/cc_export.h" + +namespace cc { + +struct CC_EXPORT ReturnedResource { + ReturnedResource() : id(0), sync_point(0), filter(0), count(0) {} + unsigned id; + unsigned sync_point; + uint32 filter; + int count; +}; + +typedef std::vector<ReturnedResource> ReturnedResourceArray; + +} // namespace cc + +#endif // CC_RESOURCES_RETURNED_RESOURCE_H_ diff --git a/cc/resources/transferable_resource.cc b/cc/resources/transferable_resource.cc index be2be1a..9e90696 100644 --- a/cc/resources/transferable_resource.cc +++ b/cc/resources/transferable_resource.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/logging.h" +#include "cc/resources/returned_resource.h" #include "cc/resources/transferable_resource.h" namespace cc { @@ -17,4 +18,22 @@ TransferableResource::TransferableResource() TransferableResource::~TransferableResource() { } +ReturnedResource TransferableResource::ToReturnedResource() const { + ReturnedResource returned; + returned.id = id; + returned.sync_point = sync_point; + returned.filter = filter; + returned.count = 1; + return returned; +} + +// static +void TransferableResource::ReturnResources( + const TransferableResourceArray& input, + ReturnedResourceArray* output) { + for (TransferableResourceArray::const_iterator it = input.begin(); + it != input.end(); ++it) + output->push_back(it->ToReturnedResource()); +} + } // namespace cc diff --git a/cc/resources/transferable_resource.h b/cc/resources/transferable_resource.h index 5c979433..be6902c 100644 --- a/cc/resources/transferable_resource.h +++ b/cc/resources/transferable_resource.h @@ -14,10 +14,19 @@ namespace cc { +struct ReturnedResource; +typedef std::vector<ReturnedResource> ReturnedResourceArray; +struct TransferableResource; +typedef std::vector<TransferableResource> TransferableResourceArray; + struct CC_EXPORT TransferableResource { TransferableResource(); ~TransferableResource(); + ReturnedResource ToReturnedResource() const; + static void ReturnResources(const TransferableResourceArray& input, + ReturnedResourceArray* output); + unsigned id; unsigned sync_point; uint32 format; @@ -26,8 +35,6 @@ struct CC_EXPORT TransferableResource { gpu::Mailbox mailbox; }; -typedef std::vector<TransferableResource> TransferableResourceArray; - } // namespace cc #endif // CC_RESOURCES_TRANSFERABLE_RESOURCE_H_ diff --git a/cc/test/fake_delegated_renderer_layer_impl.cc b/cc/test/fake_delegated_renderer_layer_impl.cc index c6a639e..782bc1c 100644 --- a/cc/test/fake_delegated_renderer_layer_impl.cc +++ b/cc/test/fake_delegated_renderer_layer_impl.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "cc/output/delegated_frame_data.h" #include "cc/quads/draw_quad.h" +#include "cc/resources/returned_resource.h" namespace cc { @@ -45,7 +46,7 @@ void FakeDelegatedRendererLayerImpl::SetFrameDataForRenderPasses( pass->quad_list[j]->IterateResources(add_resource_to_frame_callback); } - TransferableResourceArray resources_for_ack; + ReturnedResourceArray resources_for_ack; SetFrameData(delegated_frame.Pass(), gfx::RectF()); CollectUnusedResources(&resources_for_ack); } diff --git a/cc/test/fake_output_surface.cc b/cc/test/fake_output_surface.cc index 32367fd..bc94f19 100644 --- a/cc/test/fake_output_surface.cc +++ b/cc/test/fake_output_surface.cc @@ -8,6 +8,7 @@ #include "base/message_loop/message_loop.h" #include "cc/output/compositor_frame_ack.h" #include "cc/output/output_surface_client.h" +#include "cc/resources/returned_resource.h" #include "testing/gtest/include/gtest/gtest.h" namespace cc { @@ -126,7 +127,7 @@ void FakeOutputSurface::ReturnResource(unsigned id, CompositorFrameAck* ack) { break; } DCHECK(it != resources_held_by_parent_.end()); - ack->resources.push_back(*it); + ack->resources.push_back(it->ToReturnedResource()); resources_held_by_parent_.erase(it); } diff --git a/cc/trees/layer_tree_host_unittest_delegated.cc b/cc/trees/layer_tree_host_unittest_delegated.cc index f15da5d..721613a 100644 --- a/cc/trees/layer_tree_host_unittest_delegated.cc +++ b/cc/trees/layer_tree_host_unittest_delegated.cc @@ -15,6 +15,7 @@ #include "cc/output/delegated_frame_data.h" #include "cc/quads/shared_quad_state.h" #include "cc/quads/texture_draw_quad.h" +#include "cc/resources/returned_resource.h" #include "cc/test/fake_delegated_renderer_layer.h" #include "cc/test/fake_delegated_renderer_layer_impl.h" #include "cc/test/fake_output_surface.h" @@ -26,29 +27,40 @@ namespace cc { namespace { -bool TransferableResourceLower(const TransferableResource& a, - const TransferableResource& b) { +bool ReturnedResourceLower(const ReturnedResource& a, + const ReturnedResource& b) { return a.id < b.id; } // Tests if the list of resources matches an expectation, modulo the order. -bool ResourcesMatch(TransferableResourceArray actual, +bool ResourcesMatch(ReturnedResourceArray actual, unsigned* expected, size_t expected_count) { - EXPECT_EQ(expected_count, actual.size()); - if (expected_count != actual.size()) - return false; - - std::sort(actual.begin(), actual.end(), TransferableResourceLower); + std::sort(actual.begin(), actual.end(), ReturnedResourceLower); std::sort(expected, expected + expected_count); - bool result = true; - for (size_t i = 0; i < expected_count; ++i) { - EXPECT_EQ(actual[i].id, expected[i]); - if (actual[i].id != expected[i]) - result = false; + size_t actual_index = 0; + + // for each element of the expected array, count off one of the actual array + // (after checking it matches). + for (size_t expected_index = 0; expected_index < expected_count; + ++expected_index) { + EXPECT_LT(actual_index, actual.size()); + if (actual_index >= actual.size()) + return false; + EXPECT_EQ(actual[actual_index].id, expected[expected_index]); + if (actual[actual_index].id != expected[expected_index]) + return false; + EXPECT_GT(actual[actual_index].count, 0); + if (actual[actual_index].count <= 0) { + return false; + } else { + --actual[actual_index].count; + if (actual[actual_index].count == 0) + ++actual_index; + } } - - return result; + EXPECT_EQ(actual_index, actual.size()); + return actual_index == actual.size(); } #define EXPECT_RESOURCES(expected, actual) \ @@ -531,7 +543,7 @@ class LayerTreeHostDelegatedTestMergeResources // The resource 999 from frame1 is returned since it is still on the main // thread. - TransferableResourceArray returned_resources; + ReturnedResourceArray returned_resources; delegated_->TakeUnusedResourcesForChildCompositor(&returned_resources); { unsigned expected[] = {999}; @@ -627,7 +639,7 @@ class LayerTreeHostDelegatedTestReturnUnusedResources virtual void DidCommitAndDrawFrame() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -691,7 +703,7 @@ class LayerTreeHostDelegatedTestReturnUnusedResources } // Resource are never immediately released. - TransferableResourceArray empty_resources; + ReturnedResourceArray empty_resources; delegated_->TakeUnusedResourcesForChildCompositor(&empty_resources); EXPECT_TRUE(empty_resources.empty()); } @@ -716,7 +728,7 @@ class LayerTreeHostDelegatedTestReusedResources virtual void DidCommitAndDrawFrame() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -792,7 +804,7 @@ class LayerTreeHostDelegatedTestFrameBeforeAck virtual void DidCommitAndDrawFrame() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -900,7 +912,7 @@ class LayerTreeHostDelegatedTestFrameBeforeTakeResources virtual void DidCommitAndDrawFrame() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -1033,7 +1045,7 @@ class LayerTreeHostDelegatedTestBadFrame virtual void DidCommitAndDrawFrame() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -1204,7 +1216,7 @@ class LayerTreeHostDelegatedTestUnnamedResource virtual void DidCommit() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -1263,7 +1275,7 @@ class LayerTreeHostDelegatedTestDontLeakResource virtual void DidCommit() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -1347,7 +1359,7 @@ class LayerTreeHostDelegatedTestResourceSentToParent public: virtual void DidCommitAndDrawFrame() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { @@ -1462,7 +1474,7 @@ class LayerTreeHostDelegatedTestCommitWithoutTake virtual void DidCommit() OVERRIDE { scoped_ptr<DelegatedFrameData> frame; - TransferableResourceArray resources; + ReturnedResourceArray resources; int next_source_frame_number = layer_tree_host()->source_frame_number(); switch (next_source_frame_number) { diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index edd21fe..289879d 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -1482,7 +1482,9 @@ bool RenderWidgetHostImpl::OnSwapCompositorFrame( ack.gl_frame_data = frame->gl_frame_data.Pass(); ack.gl_frame_data->sync_point = 0; } else if (frame->delegated_frame_data) { - ack.resources.swap(frame->delegated_frame_data->resource_list); + cc::TransferableResource::ReturnResources( + frame->delegated_frame_data->resource_list, + &ack.resources); } else if (frame->software_frame_data) { ack.last_software_frame_id = frame->software_frame_data->id; } diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 8c52017..ea737b4 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -1448,7 +1448,8 @@ void RenderWidgetHostViewAura::SwapDelegatedFrame( } if (ShouldSkipFrame(frame_size_in_dip)) { cc::CompositorFrameAck ack; - ack.resources.swap(frame_data->resource_list); + cc::TransferableResource::ReturnResources(frame_data->resource_list, + &ack.resources); RenderWidgetHostImpl::SendSwapCompositorFrameAck( host_->GetRoutingID(), output_surface_id, host_->GetProcess()->GetID(), ack); diff --git a/content/common/cc_messages.h b/content/common/cc_messages.h index 380d453..ca4ddc1 100644 --- a/content/common/cc_messages.h +++ b/content/common/cc_messages.h @@ -21,6 +21,7 @@ #include "cc/quads/texture_draw_quad.h" #include "cc/quads/tile_draw_quad.h" #include "cc/quads/yuv_video_draw_quad.h" +#include "cc/resources/returned_resource.h" #include "cc/resources/transferable_resource.h" #include "content/common/content_export.h" #include "gpu/ipc/gpu_command_buffer_traits.h" @@ -221,6 +222,13 @@ IPC_STRUCT_TRAITS_BEGIN(cc::TransferableResource) IPC_STRUCT_TRAITS_MEMBER(mailbox) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(cc::ReturnedResource) + IPC_STRUCT_TRAITS_MEMBER(id) + IPC_STRUCT_TRAITS_MEMBER(sync_point) + IPC_STRUCT_TRAITS_MEMBER(filter) + IPC_STRUCT_TRAITS_MEMBER(count) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(cc::BeginFrameArgs) IPC_STRUCT_TRAITS_MEMBER(frame_time) IPC_STRUCT_TRAITS_MEMBER(deadline) diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc index 6c0fde3..f5bf42c 100644 --- a/ui/compositor/layer.cc +++ b/ui/compositor/layer.cc @@ -552,7 +552,7 @@ void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame, } void Layer::TakeUnusedResourcesForChildCompositor( - cc::TransferableResourceArray* list) { + cc::ReturnedResourceArray* list) { if (delegated_renderer_layer_.get()) delegated_renderer_layer_->TakeUnusedResourcesForChildCompositor(list); } diff --git a/ui/compositor/layer.h b/ui/compositor/layer.h index aa78d93..cd640b1 100644 --- a/ui/compositor/layer.h +++ b/ui/compositor/layer.h @@ -38,8 +38,8 @@ class Layer; class ResourceUpdateQueue; class SolidColorLayer; class TextureLayer; -struct TransferableResource; -typedef std::vector<TransferableResource> TransferableResourceArray; +struct ReturnedResource; +typedef std::vector<ReturnedResource> ReturnedResourceArray; } namespace ui { @@ -267,7 +267,7 @@ class COMPOSITOR_EXPORT Layer // Gets unused resources to recycle to the child compositor. void TakeUnusedResourcesForChildCompositor( - cc::TransferableResourceArray* array); + cc::ReturnedResourceArray* array); // Sets the layer's fill color. May only be called for LAYER_SOLID_COLOR. void SetColor(SkColor color); |