Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: cc/resources/resource_update_controller.cc

Issue 99553002: cc: Prevent ResourceUpdateContoller from uploading textures after lost context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/resource_update_controller.h" 5 #include "cc/resources/resource_update_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "cc/resources/prioritized_resource.h" 10 #include "cc/resources/prioritized_resource.h"
(...skipping 14 matching lines...) Expand all
25 } // namespace 25 } // namespace
26 26
27 namespace cc { 27 namespace cc {
28 28
29 size_t ResourceUpdateController::MaxPartialTextureUpdates() { 29 size_t ResourceUpdateController::MaxPartialTextureUpdates() {
30 return kPartialTextureUpdatesMax; 30 return kPartialTextureUpdatesMax;
31 } 31 }
32 32
33 size_t ResourceUpdateController::MaxFullUpdatesPerTick( 33 size_t ResourceUpdateController::MaxFullUpdatesPerTick(
34 ResourceProvider* resource_provider) { 34 ResourceProvider* resource_provider) {
35 double textures_per_second = resource_provider->EstimatedUploadsPerSecond(); 35 return resource_provider->EstimatedUploadsPerTick();
36 size_t textures_per_tick =
37 floor(resource_provider->TextureUpdateTickRate().InSecondsF() *
38 textures_per_second);
39 return textures_per_tick ? textures_per_tick : 1;
40 } 36 }
41 37
42 ResourceUpdateController::ResourceUpdateController( 38 ResourceUpdateController::ResourceUpdateController(
43 ResourceUpdateControllerClient* client, 39 ResourceUpdateControllerClient* client,
44 base::SingleThreadTaskRunner* task_runner, 40 base::SingleThreadTaskRunner* task_runner,
45 scoped_ptr<ResourceUpdateQueue> queue, 41 scoped_ptr<ResourceUpdateQueue> queue,
46 ResourceProvider* resource_provider) 42 ResourceProvider* resource_provider)
47 : client_(client), 43 : client_(client),
48 queue_(queue.Pass()), 44 queue_(queue.Pass()),
49 resource_provider_(resource_provider), 45 resource_provider_(resource_provider),
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 102
107 resource_provider_->FlushUploads(); 103 resource_provider_->FlushUploads();
108 } 104 }
109 105
110 void ResourceUpdateController::OnTimerFired() { 106 void ResourceUpdateController::OnTimerFired() {
111 task_posted_ = false; 107 task_posted_ = false;
112 if (!UpdateMoreTexturesIfEnoughTimeRemaining()) 108 if (!UpdateMoreTexturesIfEnoughTimeRemaining())
113 client_->ReadyToFinalizeTextureUpdates(); 109 client_->ReadyToFinalizeTextureUpdates();
114 } 110 }
115 111
116 base::TimeTicks ResourceUpdateController::Now() const { 112 base::TimeTicks ResourceUpdateController::UpdateMoreTexturesCompletionTime() {
117 return gfx::FrameTime::Now(); 113 return resource_provider_->EstimatedUploadCompletionTime(
118 } 114 texture_updates_per_tick_);
119
120 base::TimeDelta ResourceUpdateController::UpdateMoreTexturesTime() const {
121 return resource_provider_->TextureUpdateTickRate();
122 } 115 }
123 116
124 size_t ResourceUpdateController::UpdateMoreTexturesSize() const { 117 size_t ResourceUpdateController::UpdateMoreTexturesSize() const {
125 return texture_updates_per_tick_; 118 return texture_updates_per_tick_;
126 } 119 }
127 120
128 size_t ResourceUpdateController::MaxBlockingUpdates() const { 121 size_t ResourceUpdateController::MaxBlockingUpdates() const {
129 return UpdateMoreTexturesSize() * kMaxBlockingUpdateIntervals; 122 return UpdateMoreTexturesSize() * kMaxBlockingUpdateIntervals;
130 } 123 }
131 124
132 base::TimeDelta ResourceUpdateController::PendingUpdateTime() const {
133 base::TimeDelta update_one_resource_time =
134 UpdateMoreTexturesTime() / UpdateMoreTexturesSize();
135 return update_one_resource_time * resource_provider_->NumBlockingUploads();
136 }
137
138 bool ResourceUpdateController::UpdateMoreTexturesIfEnoughTimeRemaining() { 125 bool ResourceUpdateController::UpdateMoreTexturesIfEnoughTimeRemaining() {
139 while (resource_provider_->NumBlockingUploads() < MaxBlockingUpdates()) { 126 while (resource_provider_->NumBlockingUploads() < MaxBlockingUpdates()) {
140 if (!queue_->FullUploadSize()) 127 if (!queue_->FullUploadSize())
141 return false; 128 return false;
142 129
143 if (!time_limit_.is_null()) { 130 if (!time_limit_.is_null()) {
144 // Estimated completion time of all pending updates. 131 base::TimeTicks completion_time = UpdateMoreTexturesCompletionTime();
145 base::TimeTicks completion_time = Now() + PendingUpdateTime(); 132 if (completion_time > time_limit_)
146
147 // Time remaining based on current completion estimate.
148 base::TimeDelta time_remaining = time_limit_ - completion_time;
149
150 if (time_remaining < UpdateMoreTexturesTime())
151 return true; 133 return true;
152 } 134 }
153 135
154 UpdateMoreTexturesNow(); 136 UpdateMoreTexturesNow();
155 } 137 }
156 138
157 task_posted_ = true; 139 task_posted_ = true;
158 task_runner_->PostDelayedTask( 140 task_runner_->PostDelayedTask(
159 FROM_HERE, 141 FROM_HERE,
160 base::Bind(&ResourceUpdateController::OnTimerFired, 142 base::Bind(&ResourceUpdateController::OnTimerFired,
161 weak_factory_.GetWeakPtr()), 143 weak_factory_.GetWeakPtr()),
162 base::TimeDelta::FromMilliseconds(kUploaderBusyTickRate * 1000)); 144 base::TimeDelta::FromMilliseconds(kUploaderBusyTickRate * 1000));
163 return true; 145 return true;
164 } 146 }
165 147
166 void ResourceUpdateController::UpdateMoreTexturesNow() { 148 void ResourceUpdateController::UpdateMoreTexturesNow() {
167 size_t uploads = std::min( 149 size_t uploads = std::min(
168 queue_->FullUploadSize(), UpdateMoreTexturesSize()); 150 queue_->FullUploadSize(), UpdateMoreTexturesSize());
169 151
170 if (!uploads) 152 if (!uploads)
171 return; 153 return;
172 154
173 while (queue_->FullUploadSize() && uploads--) 155 while (queue_->FullUploadSize() && uploads--)
174 UpdateTexture(queue_->TakeFirstFullUpload()); 156 UpdateTexture(queue_->TakeFirstFullUpload());
175 157
176 resource_provider_->FlushUploads(); 158 resource_provider_->FlushUploads();
177 } 159 }
178 160
179 } // namespace cc 161 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/resource_update_controller.h ('k') | cc/resources/resource_update_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698