summaryrefslogtreecommitdiffstats
path: root/cc/resources
diff options
context:
space:
mode:
Diffstat (limited to 'cc/resources')
-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
6 files changed, 136 insertions, 140 deletions
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_