summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-19 00:42:45 +0000
committerpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-19 00:42:45 +0000
commite00bab02826a261b4b0d1434671802d311b56a5b (patch)
tree0bdce7835d16fd551fdccedfb2dd2ec28c6a33b4
parentb77ae7511ca2aa803ae279855bd43acae3eebf84 (diff)
downloadchromium_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
-rw-r--r--cc/cc.gyp1
-rw-r--r--cc/layers/delegated_renderer_layer.cc9
-rw-r--r--cc/layers/delegated_renderer_layer.h6
-rw-r--r--cc/layers/delegated_renderer_layer_impl.cc4
-rw-r--r--cc/layers/delegated_renderer_layer_impl.h2
-rw-r--r--cc/layers/texture_layer_unittest.cc5
-rw-r--r--cc/output/compositor_frame_ack.h4
-rw-r--r--cc/output/delegating_renderer.cc2
-rw-r--r--cc/resources/resource_provider.cc177
-rw-r--r--cc/resources/resource_provider.h11
-rw-r--r--cc/resources/resource_provider_unittest.cc31
-rw-r--r--cc/resources/returned_resource.h27
-rw-r--r--cc/resources/transferable_resource.cc19
-rw-r--r--cc/resources/transferable_resource.h11
-rw-r--r--cc/test/fake_delegated_renderer_layer_impl.cc3
-rw-r--r--cc/test/fake_output_surface.cc3
-rw-r--r--cc/trees/layer_tree_host_unittest_delegated.cc64
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc4
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.cc3
-rw-r--r--content/common/cc_messages.h8
-rw-r--r--ui/compositor/layer.cc2
-rw-r--r--ui/compositor/layer.h6
22 files changed, 213 insertions, 189 deletions
diff --git a/cc/cc.gyp b/cc/cc.gyp
index de2df18..cd9afeb 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -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);