Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index 71254c0350ba48c569db0efc0a363041bf5375ee..5340cd0b70268a49c04b10627ed058b890d3bf09 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -188,10 +188,7 @@ WebGraphicsContext3D* ResourceProvider::GraphicsContext3D() { |
| } |
| 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; |
| } |
| @@ -382,10 +379,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, |
| @@ -393,10 +387,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); |
| @@ -498,11 +489,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 << |
| @@ -538,10 +533,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--; |
| @@ -549,10 +541,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); |
| @@ -565,10 +554,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 && |
| @@ -577,10 +563,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); |
| @@ -825,7 +808,7 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources, |
| void ResourceProvider::PrepareSendToChild(int child, |
|
danakj
2013/08/16 23:33:35
Maybe we could rename this to PrepareSendReturnsTo
piman
2013/08/17 01:54:31
Done.
|
| const ResourceIdArray& resources, |
| - TransferableResourceArray* list) { |
| + ReturnedResourceArray* list) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| if (!context3d || !context3d->makeContextCurrent()) { |
| @@ -835,27 +818,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; |
| } |
| @@ -907,25 +894,24 @@ void ResourceProvider::ReceiveFromChild( |
| } |
| void ResourceProvider::ReceiveFromParent( |
| - const TransferableResourceArray& resources) { |
| + const ReturnedResourceArray& resources) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| WebGraphicsContext3D* context3d = output_surface_->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)); |
| @@ -942,10 +928,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())); |
| @@ -977,10 +960,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); |
| @@ -1010,10 +990,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); |
| @@ -1055,10 +1032,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); |
| @@ -1086,10 +1060,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); |
| @@ -1161,10 +1132,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); |
| @@ -1229,10 +1197,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); |
| @@ -1248,10 +1213,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); |
| @@ -1275,10 +1237,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) { |
| @@ -1304,10 +1263,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) { |
| @@ -1344,19 +1300,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); |
| @@ -1375,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); |
| @@ -1394,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); |
| @@ -1417,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); |
| @@ -1433,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); |