Lots of random cleanups, mostly for native_theme_win.cc:
[chromium-blink-merge.git] / cc / layers / delegated_frame_resource_collection.cc
blob5ca4eda57d761bed7998ae75964a136c979ddae9
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/layers/delegated_frame_resource_collection.h"
7 #include "base/bind.h"
8 #include "cc/trees/blocking_task_runner.h"
10 namespace cc {
12 DelegatedFrameResourceCollection::DelegatedFrameResourceCollection()
13 : client_(NULL),
14 main_thread_runner_(BlockingTaskRunner::current()),
15 lost_all_resources_(false),
16 weak_ptr_factory_(this) {
17 DCHECK(main_thread_checker_.CalledOnValidThread());
20 DelegatedFrameResourceCollection::~DelegatedFrameResourceCollection() {
21 DCHECK(main_thread_checker_.CalledOnValidThread());
24 void DelegatedFrameResourceCollection::SetClient(
25 DelegatedFrameResourceCollectionClient* client) {
26 client_ = client;
29 void DelegatedFrameResourceCollection::TakeUnusedResourcesForChildCompositor(
30 ReturnedResourceArray* array) {
31 DCHECK(main_thread_checker_.CalledOnValidThread());
32 DCHECK(array->empty());
33 array->swap(returned_resources_for_child_compositor_);
36 bool DelegatedFrameResourceCollection::LoseAllResources() {
37 DCHECK(main_thread_checker_.CalledOnValidThread());
38 DCHECK(!lost_all_resources_);
39 lost_all_resources_ = true;
41 if (resource_id_ref_count_map_.empty())
42 return false;
44 ReturnedResourceArray to_return;
46 for (ResourceIdRefCountMap::iterator it = resource_id_ref_count_map_.begin();
47 it != resource_id_ref_count_map_.end();
48 ++it) {
49 DCHECK_GE(it->second.refs_to_wait_for, 1);
51 ReturnedResource returned;
52 returned.id = it->first;
53 returned.count = it->second.refs_to_return;
54 returned.lost = true;
55 to_return.push_back(returned);
58 returned_resources_for_child_compositor_.insert(
59 returned_resources_for_child_compositor_.end(),
60 to_return.begin(),
61 to_return.end());
62 if (client_)
63 client_->UnusedResourcesAreAvailable();
64 return true;
67 void DelegatedFrameResourceCollection::ReceivedResources(
68 const TransferableResourceArray& resources) {
69 DCHECK(main_thread_checker_.CalledOnValidThread());
70 DCHECK(!lost_all_resources_);
72 for (size_t i = 0; i < resources.size(); ++i)
73 resource_id_ref_count_map_[resources[i].id].refs_to_return++;
76 void DelegatedFrameResourceCollection::UnrefResources(
77 const ReturnedResourceArray& returned) {
78 DCHECK(main_thread_checker_.CalledOnValidThread());
80 if (lost_all_resources_)
81 return;
83 ReturnedResourceArray to_return;
85 for (size_t i = 0; i < returned.size(); ++i) {
86 ResourceIdRefCountMap::iterator it =
87 resource_id_ref_count_map_.find(returned[i].id);
88 DCHECK(it != resource_id_ref_count_map_.end());
89 DCHECK_GE(it->second.refs_to_wait_for, returned[i].count);
90 it->second.refs_to_wait_for -= returned[i].count;
91 if (it->second.refs_to_wait_for == 0) {
92 to_return.push_back(returned[i]);
93 to_return.back().count = it->second.refs_to_return;
94 resource_id_ref_count_map_.erase(it);
98 if (to_return.empty())
99 return;
101 returned_resources_for_child_compositor_.insert(
102 returned_resources_for_child_compositor_.end(),
103 to_return.begin(),
104 to_return.end());
105 if (client_)
106 client_->UnusedResourcesAreAvailable();
109 void DelegatedFrameResourceCollection::RefResources(
110 const TransferableResourceArray& resources) {
111 DCHECK(main_thread_checker_.CalledOnValidThread());
112 for (size_t i = 0; i < resources.size(); ++i)
113 resource_id_ref_count_map_[resources[i].id].refs_to_wait_for++;
116 static void UnrefResourcesOnImplThread(
117 base::WeakPtr<DelegatedFrameResourceCollection> self,
118 scoped_refptr<BlockingTaskRunner> main_thread_runner,
119 const ReturnedResourceArray& returned) {
120 main_thread_runner->PostTask(
121 FROM_HERE,
122 base::Bind(
123 &DelegatedFrameResourceCollection::UnrefResources, self, returned));
126 ReturnCallback
127 DelegatedFrameResourceCollection::GetReturnResourcesCallbackForImplThread() {
128 return base::Bind(&UnrefResourcesOnImplThread,
129 weak_ptr_factory_.GetWeakPtr(),
130 main_thread_runner_);
133 } // namespace cc