| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index b39908a7ee5f25d56be419d74c7e1b13ee607630..ff339e96f163ff1e7a27910d77275061e1c51cac 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);
|
|
|
|
|