14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/bind.h" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/trees/blocking_task_runner.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DelegatedFrameResourceCollection::DelegatedFrameResourceCollection() 138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) : client_(NULL), 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) lost_all_resources_(false), 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) weak_ptr_factory_(this) { 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)DelegatedFrameResourceCollection::~DelegatedFrameResourceCollection() { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DelegatedFrameResourceCollection::SetClient( 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DelegatedFrameResourceCollectionClient* client) { 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_ = client; 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DelegatedFrameResourceCollection::TakeUnusedResourcesForChildCompositor( 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray* array) { 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(array->empty()); 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) array->swap(returned_resources_for_child_compositor_); 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool DelegatedFrameResourceCollection::LoseAllResources() { 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!lost_all_resources_); 388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) lost_all_resources_ = true; 398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (resource_id_ref_count_map_.empty()) 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ReturnedResourceArray to_return; 448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (ResourceIdRefCountMap::iterator it = resource_id_ref_count_map_.begin(); 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) it != resource_id_ref_count_map_.end(); 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ++it) { 488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK_GE(it->second.refs_to_wait_for, 1); 498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ReturnedResource returned; 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) returned.id = it->first; 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) returned.count = it->second.refs_to_return; 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) returned.lost = true; 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) to_return.push_back(returned); 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) returned_resources_for_child_compositor_.insert( 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) returned_resources_for_child_compositor_.end(), 598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) to_return.begin(), 608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) to_return.end()); 618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (client_) 628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) client_->UnusedResourcesAreAvailable(); 638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DelegatedFrameResourceCollection::ReceivedResources( 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const TransferableResourceArray& resources) { 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(!lost_all_resources_); 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < resources.size(); ++i) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_id_ref_count_map_[resources[i].id].refs_to_return++; 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DelegatedFrameResourceCollection::UnrefResources( 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const ReturnedResourceArray& returned) { 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (lost_all_resources_) 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReturnedResourceArray to_return; 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < returned.size(); ++i) { 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ResourceIdRefCountMap::iterator it = 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_id_ref_count_map_.find(returned[i].id); 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(it != resource_id_ref_count_map_.end()); 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_GE(it->second.refs_to_wait_for, returned[i].count); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it->second.refs_to_wait_for -= returned[i].count; 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (it->second.refs_to_wait_for == 0) { 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) to_return.push_back(returned[i]); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) to_return.back().count = it->second.refs_to_return; 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_id_ref_count_map_.erase(it); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (to_return.empty()) 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) returned_resources_for_child_compositor_.insert( 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) returned_resources_for_child_compositor_.end(), 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) to_return.begin(), 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) to_return.end()); 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (client_) 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_->UnusedResourcesAreAvailable(); 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void DelegatedFrameResourceCollection::RefResources( 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const TransferableResourceArray& resources) { 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(main_thread_checker_.CalledOnValidThread()); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < resources.size(); ++i) 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resource_id_ref_count_map_[resources[i].id].refs_to_wait_for++; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static void UnrefResourcesOnImplThread( 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::WeakPtr<DelegatedFrameResourceCollection> self, 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ReturnedResourceArray& returned, 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlockingTaskRunner* main_thread_task_runner) { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_thread_task_runner->PostTask( 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind( 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &DelegatedFrameResourceCollection::UnrefResources, self, returned)); 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ReturnCallback 1261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DelegatedFrameResourceCollection::GetReturnResourcesCallbackForImplThread() { 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return base::Bind(&UnrefResourcesOnImplThread, 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_ptr_factory_.GetWeakPtr()); 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 132