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