OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 "gpu/command_buffer/service/async_pixel_transfer_manager_idle.h" | 5 #include "gpu/command_buffer/service/async_pixel_transfer_manager_idle.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/debug/trace_event_synthetic_delay.h" | 9 #include "base/debug/trace_event_synthetic_delay.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "base/memory/weak_ptr.h" | 11 #include "base/memory/weak_ptr.h" |
| 12 #include "base/synchronization/waitable_event.h" |
12 #include "ui/gl/scoped_binders.h" | 13 #include "ui/gl/scoped_binders.h" |
13 | 14 |
14 namespace gpu { | 15 namespace gpu { |
15 | 16 |
16 namespace { | 17 namespace { |
17 | 18 |
18 static uint64 g_next_pixel_transfer_state_id = 1; | 19 static uint64 g_next_pixel_transfer_state_id = 1; |
19 | 20 |
| 21 static const uint64 kNotificationTask = 0; |
| 22 static const uint64 kSuspendTask = 1; |
| 23 |
| 24 uint64 NextPixelTransferStateId() { |
| 25 g_next_pixel_transfer_state_id++; |
| 26 switch (g_next_pixel_transfer_state_id) { |
| 27 case kNotificationTask: |
| 28 case kSuspendTask: |
| 29 return NextPixelTransferStateId(); |
| 30 default: |
| 31 return g_next_pixel_transfer_state_id; |
| 32 } |
| 33 } |
| 34 |
20 void PerformNotifyCompletion( | 35 void PerformNotifyCompletion( |
21 AsyncMemoryParams mem_params, | 36 AsyncMemoryParams mem_params, |
22 scoped_refptr<AsyncPixelTransferCompletionObserver> observer) { | 37 scoped_refptr<AsyncPixelTransferCompletionObserver> observer) { |
23 TRACE_EVENT0("gpu", "PerformNotifyCompletion"); | 38 TRACE_EVENT0("gpu", "PerformNotifyCompletion"); |
24 observer->DidComplete(mem_params); | 39 observer->DidComplete(mem_params); |
25 } | 40 } |
26 | 41 |
27 } // namespace | 42 } // namespace |
28 | 43 |
29 // Class which handles async pixel transfers in a platform | 44 // Class which handles async pixel transfers in a platform |
30 // independent way. | 45 // independent way. |
31 class AsyncPixelTransferDelegateIdle | 46 class AsyncPixelTransferDelegateIdle |
32 : public AsyncPixelTransferDelegate, | 47 : public AsyncPixelTransferDelegate, |
33 public base::SupportsWeakPtr<AsyncPixelTransferDelegateIdle> { | 48 public base::SupportsWeakPtr<AsyncPixelTransferDelegateIdle> { |
34 public: | 49 public: |
35 AsyncPixelTransferDelegateIdle( | 50 AsyncPixelTransferDelegateIdle( |
36 AsyncPixelTransferManagerIdle::SharedState* state, | 51 AsyncPixelTransferManagerIdle::SharedState* state, |
37 GLuint texture_id, | 52 GLuint texture_id, |
38 const AsyncTexImage2DParams& define_params); | 53 const AsyncTexImage2DParams& define_params); |
| 54 AsyncPixelTransferDelegateIdle( |
| 55 AsyncPixelTransferManagerIdle::SharedState* state, |
| 56 GLuint texture_id, |
| 57 const AsyncCompressedTexImage2DParams& define_params); |
39 ~AsyncPixelTransferDelegateIdle() override; | 58 ~AsyncPixelTransferDelegateIdle() override; |
40 | 59 |
41 // Implement AsyncPixelTransferDelegate: | 60 // Implement AsyncPixelTransferDelegate: |
42 void AsyncTexImage2D(const AsyncTexImage2DParams& tex_params, | 61 void AsyncTexImage2D(const AsyncTexImage2DParams& tex_params, |
43 const AsyncMemoryParams& mem_params, | 62 const AsyncMemoryParams& mem_params, |
44 const base::Closure& bind_callback) override; | 63 const base::Closure& bind_callback) override; |
45 void AsyncTexSubImage2D(const AsyncTexSubImage2DParams& tex_params, | 64 void AsyncTexSubImage2D(const AsyncTexSubImage2DParams& tex_params, |
46 const AsyncMemoryParams& mem_params) override; | 65 const AsyncMemoryParams& mem_params) override; |
| 66 void AsyncCompressedTexImage2D( |
| 67 const AsyncCompressedTexImage2DParams& tex_params, |
| 68 const AsyncMemoryParams& mem_params, |
| 69 const base::Closure& bind_callback) override; |
| 70 void AsyncCompressedTexSubImage2D( |
| 71 const AsyncCompressedTexSubImage2DParams& tex_params, |
| 72 const AsyncMemoryParams& mem_params) override; |
47 bool TransferIsInProgress() override; | 73 bool TransferIsInProgress() override; |
48 void WaitForTransferCompletion() override; | 74 void WaitForTransferCompletion() override; |
49 | 75 |
50 private: | 76 private: |
51 void PerformAsyncTexImage2D(AsyncTexImage2DParams tex_params, | 77 void PerformAsyncTexImage2D(AsyncTexImage2DParams tex_params, |
52 AsyncMemoryParams mem_params, | 78 AsyncMemoryParams mem_params, |
53 const base::Closure& bind_callback); | 79 const base::Closure& bind_callback); |
54 void PerformAsyncTexSubImage2D(AsyncTexSubImage2DParams tex_params, | 80 void PerformAsyncTexSubImage2D(AsyncTexSubImage2DParams tex_params, |
55 AsyncMemoryParams mem_params); | 81 AsyncMemoryParams mem_params); |
| 82 void PerformAsyncCompressedTexImage2D( |
| 83 AsyncCompressedTexImage2DParams tex_params, |
| 84 AsyncMemoryParams mem_params, |
| 85 const base::Closure& bind_callback); |
| 86 void PerformAsyncCompressedTexSubImage2D( |
| 87 AsyncCompressedTexSubImage2DParams tex_params, |
| 88 AsyncMemoryParams mem_params); |
56 | 89 |
57 uint64 id_; | 90 uint64 id_; |
58 GLuint texture_id_; | 91 GLuint texture_id_; |
59 bool transfer_in_progress_; | 92 bool transfer_in_progress_; |
60 AsyncTexImage2DParams define_params_; | 93 union { |
| 94 AsyncTexImage2DParams define_params_; |
| 95 AsyncCompressedTexImage2DParams compressed_define_params_; |
| 96 }; |
61 | 97 |
62 // Safe to hold a raw pointer because SharedState is owned by the Manager | 98 // Safe to hold a raw pointer because SharedState is owned by the Manager |
63 // which owns the Delegate. | 99 // which owns the Delegate. |
64 AsyncPixelTransferManagerIdle::SharedState* shared_state_; | 100 AsyncPixelTransferManagerIdle::SharedState* shared_state_; |
65 | 101 |
66 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateIdle); | 102 DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferDelegateIdle); |
67 }; | 103 }; |
68 | 104 |
69 AsyncPixelTransferDelegateIdle::AsyncPixelTransferDelegateIdle( | 105 AsyncPixelTransferDelegateIdle::AsyncPixelTransferDelegateIdle( |
70 AsyncPixelTransferManagerIdle::SharedState* shared_state, | 106 AsyncPixelTransferManagerIdle::SharedState* shared_state, |
71 GLuint texture_id, | 107 GLuint texture_id, |
72 const AsyncTexImage2DParams& define_params) | 108 const AsyncTexImage2DParams& define_params) |
73 : id_(g_next_pixel_transfer_state_id++), | 109 : id_(NextPixelTransferStateId()), |
74 texture_id_(texture_id), | 110 texture_id_(texture_id), |
75 transfer_in_progress_(false), | 111 transfer_in_progress_(false), |
76 define_params_(define_params), | 112 define_params_(define_params), |
77 shared_state_(shared_state) {} | 113 shared_state_(shared_state) {} |
78 | 114 |
| 115 AsyncPixelTransferDelegateIdle::AsyncPixelTransferDelegateIdle( |
| 116 AsyncPixelTransferManagerIdle::SharedState* shared_state, |
| 117 GLuint texture_id, |
| 118 const AsyncCompressedTexImage2DParams& define_params) |
| 119 : id_(NextPixelTransferStateId()), |
| 120 texture_id_(texture_id), |
| 121 transfer_in_progress_(false), |
| 122 compressed_define_params_(define_params), |
| 123 shared_state_(shared_state) { |
| 124 } |
| 125 |
79 AsyncPixelTransferDelegateIdle::~AsyncPixelTransferDelegateIdle() {} | 126 AsyncPixelTransferDelegateIdle::~AsyncPixelTransferDelegateIdle() {} |
80 | 127 |
81 void AsyncPixelTransferDelegateIdle::AsyncTexImage2D( | 128 void AsyncPixelTransferDelegateIdle::AsyncTexImage2D( |
82 const AsyncTexImage2DParams& tex_params, | 129 const AsyncTexImage2DParams& tex_params, |
83 const AsyncMemoryParams& mem_params, | 130 const AsyncMemoryParams& mem_params, |
84 const base::Closure& bind_callback) { | 131 const base::Closure& bind_callback) { |
85 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); | 132 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); |
86 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); | 133 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); |
87 | 134 |
88 shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( | 135 shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( |
(...skipping 18 matching lines...) Expand all Loading... |
107 id_, | 154 id_, |
108 this, | 155 this, |
109 base::Bind(&AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D, | 156 base::Bind(&AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D, |
110 AsWeakPtr(), | 157 AsWeakPtr(), |
111 tex_params, | 158 tex_params, |
112 mem_params))); | 159 mem_params))); |
113 | 160 |
114 transfer_in_progress_ = true; | 161 transfer_in_progress_ = true; |
115 } | 162 } |
116 | 163 |
| 164 void AsyncPixelTransferDelegateIdle::AsyncCompressedTexImage2D( |
| 165 const AsyncCompressedTexImage2DParams& tex_params, |
| 166 const AsyncMemoryParams& mem_params, |
| 167 const base::Closure& bind_callback) { |
| 168 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); |
| 169 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); |
| 170 |
| 171 shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( |
| 172 id_, this, |
| 173 base::Bind( |
| 174 &AsyncPixelTransferDelegateIdle::PerformAsyncCompressedTexImage2D, |
| 175 AsWeakPtr(), tex_params, mem_params, bind_callback))); |
| 176 |
| 177 transfer_in_progress_ = true; |
| 178 } |
| 179 |
| 180 void AsyncPixelTransferDelegateIdle::AsyncCompressedTexSubImage2D( |
| 181 const AsyncCompressedTexSubImage2DParams& tex_params, |
| 182 const AsyncMemoryParams& mem_params) { |
| 183 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); |
| 184 DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); |
| 185 |
| 186 shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( |
| 187 id_, this, |
| 188 base::Bind( |
| 189 &AsyncPixelTransferDelegateIdle::PerformAsyncCompressedTexSubImage2D, |
| 190 AsWeakPtr(), tex_params, mem_params))); |
| 191 |
| 192 transfer_in_progress_ = true; |
| 193 } |
| 194 |
117 bool AsyncPixelTransferDelegateIdle::TransferIsInProgress() { | 195 bool AsyncPixelTransferDelegateIdle::TransferIsInProgress() { |
118 return transfer_in_progress_; | 196 return transfer_in_progress_; |
119 } | 197 } |
120 | 198 |
121 void AsyncPixelTransferDelegateIdle::WaitForTransferCompletion() { | 199 void AsyncPixelTransferDelegateIdle::WaitForTransferCompletion() { |
122 for (std::list<AsyncPixelTransferManagerIdle::Task>::iterator iter = | 200 for (std::list<AsyncPixelTransferManagerIdle::Task>::iterator iter = |
123 shared_state_->tasks.begin(); | 201 shared_state_->tasks.begin(); |
124 iter != shared_state_->tasks.end(); | 202 iter != shared_state_->tasks.end(); |
125 ++iter) { | 203 ++iter) { |
126 if (iter->transfer_id != id_) | 204 if (iter->transfer_id != id_) |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 data); | 294 data); |
217 } | 295 } |
218 | 296 |
219 TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); | 297 TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); |
220 transfer_in_progress_ = false; | 298 transfer_in_progress_ = false; |
221 shared_state_->texture_upload_count++; | 299 shared_state_->texture_upload_count++; |
222 shared_state_->total_texture_upload_time += | 300 shared_state_->total_texture_upload_time += |
223 base::TimeTicks::HighResNow() - begin_time; | 301 base::TimeTicks::HighResNow() - begin_time; |
224 } | 302 } |
225 | 303 |
| 304 void AsyncPixelTransferDelegateIdle::PerformAsyncCompressedTexImage2D( |
| 305 AsyncCompressedTexImage2DParams tex_params, |
| 306 AsyncMemoryParams mem_params, |
| 307 const base::Closure& bind_callback) { |
| 308 TRACE_EVENT2("gpu", "PerformAsyncCompressedTexImage2D", "width", |
| 309 tex_params.width, "height", tex_params.height); |
| 310 |
| 311 void* data = mem_params.GetDataAddress(); |
| 312 |
| 313 base::TimeTicks begin_time(base::TimeTicks::HighResNow()); |
| 314 gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); |
| 315 |
| 316 { |
| 317 TRACE_EVENT0("gpu", "glCompressedTexImage2D"); |
| 318 glCompressedTexImage2D(tex_params.target, tex_params.level, |
| 319 tex_params.internal_format, tex_params.width, |
| 320 tex_params.height, tex_params.border, |
| 321 tex_params.image_size, data); |
| 322 } |
| 323 |
| 324 TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); |
| 325 transfer_in_progress_ = false; |
| 326 shared_state_->texture_upload_count++; |
| 327 shared_state_->total_texture_upload_time += |
| 328 base::TimeTicks::HighResNow() - begin_time; |
| 329 |
| 330 // The texture is already fully bound so just call it now. |
| 331 bind_callback.Run(); |
| 332 } |
| 333 |
| 334 void AsyncPixelTransferDelegateIdle::PerformAsyncCompressedTexSubImage2D( |
| 335 AsyncCompressedTexSubImage2DParams tex_params, |
| 336 AsyncMemoryParams mem_params) { |
| 337 TRACE_EVENT2("gpu", "PerformAsyncCompressedTexSubImage2D", "width", |
| 338 tex_params.width, "height", tex_params.height); |
| 339 |
| 340 void* data = mem_params.GetDataAddress(); |
| 341 |
| 342 base::TimeTicks begin_time(base::TimeTicks::HighResNow()); |
| 343 gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); |
| 344 |
| 345 // If it's a full texture update, use glCompressedTexImage2D as it's faster. |
| 346 if (tex_params.xoffset == 0 && tex_params.yoffset == 0 && |
| 347 tex_params.target == compressed_define_params_.target && |
| 348 tex_params.level == compressed_define_params_.level && |
| 349 tex_params.width == compressed_define_params_.width && |
| 350 tex_params.height == compressed_define_params_.height) { |
| 351 TRACE_EVENT0("gpu", "glCompressedTexImage2D"); |
| 352 glCompressedTexImage2D( |
| 353 compressed_define_params_.target, compressed_define_params_.level, |
| 354 compressed_define_params_.internal_format, |
| 355 compressed_define_params_.width, compressed_define_params_.height, |
| 356 compressed_define_params_.border, tex_params.image_size, data); |
| 357 } else { |
| 358 TRACE_EVENT0("gpu", "glCompressedTexSubImage2D"); |
| 359 glCompressedTexSubImage2D(tex_params.target, tex_params.level, |
| 360 tex_params.xoffset, tex_params.yoffset, |
| 361 tex_params.width, tex_params.height, |
| 362 tex_params.format, tex_params.image_size, data); |
| 363 } |
| 364 |
| 365 TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); |
| 366 transfer_in_progress_ = false; |
| 367 shared_state_->texture_upload_count++; |
| 368 shared_state_->total_texture_upload_time += |
| 369 base::TimeTicks::HighResNow() - begin_time; |
| 370 } |
| 371 |
226 AsyncPixelTransferManagerIdle::Task::Task( | 372 AsyncPixelTransferManagerIdle::Task::Task( |
227 uint64 transfer_id, | 373 uint64 transfer_id, |
228 AsyncPixelTransferDelegate* delegate, | 374 AsyncPixelTransferDelegate* delegate, |
229 const base::Closure& task) | 375 const base::Closure& task) |
230 : transfer_id(transfer_id), | 376 : transfer_id(transfer_id), |
231 delegate(delegate), | 377 delegate(delegate), |
232 task(task) { | 378 task(task) { |
233 } | 379 } |
234 | 380 |
235 AsyncPixelTransferManagerIdle::Task::~Task() {} | 381 AsyncPixelTransferManagerIdle::Task::~Task() {} |
236 | 382 |
237 AsyncPixelTransferManagerIdle::SharedState::SharedState() | 383 AsyncPixelTransferManagerIdle::SharedState::SharedState() |
238 : texture_upload_count(0) {} | 384 : texture_upload_count(0) {} |
239 | 385 |
240 AsyncPixelTransferManagerIdle::SharedState::~SharedState() {} | 386 AsyncPixelTransferManagerIdle::SharedState::~SharedState() {} |
241 | 387 |
242 void AsyncPixelTransferManagerIdle::SharedState::ProcessNotificationTasks() { | 388 void AsyncPixelTransferManagerIdle::SharedState::ProcessNotificationTasks() { |
243 while (!tasks.empty()) { | 389 while (!tasks.empty()) { |
244 // Stop when we reach a pixel transfer task. | 390 // Stop when we reach a pixel transfer task. |
245 if (tasks.front().transfer_id) | 391 if (tasks.front().transfer_id > kSuspendTask) |
246 return; | 392 return; |
247 | 393 |
248 tasks.front().task.Run(); | 394 tasks.front().task.Run(); |
249 tasks.pop_front(); | 395 tasks.pop_front(); |
250 } | 396 } |
251 } | 397 } |
252 | 398 |
253 AsyncPixelTransferManagerIdle::AsyncPixelTransferManagerIdle() | 399 AsyncPixelTransferManagerIdle::AsyncPixelTransferManagerIdle() |
254 : shared_state_() { | 400 : shared_state_() { |
255 } | 401 } |
256 | 402 |
257 AsyncPixelTransferManagerIdle::~AsyncPixelTransferManagerIdle() {} | 403 AsyncPixelTransferManagerIdle::~AsyncPixelTransferManagerIdle() {} |
258 | 404 |
259 void AsyncPixelTransferManagerIdle::BindCompletedAsyncTransfers() { | 405 void AsyncPixelTransferManagerIdle::BindCompletedAsyncTransfers() { |
260 // Everything is already bound. | 406 // Everything is already bound. |
261 } | 407 } |
262 | 408 |
263 void AsyncPixelTransferManagerIdle::AsyncNotifyCompletion( | 409 void AsyncPixelTransferManagerIdle::AsyncNotifyCompletion( |
264 const AsyncMemoryParams& mem_params, | 410 const AsyncMemoryParams& mem_params, |
265 AsyncPixelTransferCompletionObserver* observer) { | 411 AsyncPixelTransferCompletionObserver* observer) { |
266 if (shared_state_.tasks.empty()) { | 412 if (shared_state_.tasks.empty()) { |
267 observer->DidComplete(mem_params); | 413 observer->DidComplete(mem_params); |
268 return; | 414 return; |
269 } | 415 } |
270 | 416 |
271 shared_state_.tasks.push_back( | 417 shared_state_.tasks.push_back( |
272 Task(0, // 0 transfer_id for notification tasks. | 418 Task(kNotificationTask, |
273 NULL, | 419 NULL, |
274 base::Bind( | 420 base::Bind( |
275 &PerformNotifyCompletion, | 421 &PerformNotifyCompletion, |
276 mem_params, | 422 mem_params, |
277 make_scoped_refptr(observer)))); | 423 make_scoped_refptr(observer)))); |
278 } | 424 } |
279 | 425 |
280 uint32 AsyncPixelTransferManagerIdle::GetTextureUploadCount() { | 426 uint32 AsyncPixelTransferManagerIdle::GetTextureUploadCount() { |
281 return shared_state_.texture_upload_count; | 427 return shared_state_.texture_upload_count; |
282 } | 428 } |
283 | 429 |
284 base::TimeDelta AsyncPixelTransferManagerIdle::GetTotalTextureUploadTime() { | 430 base::TimeDelta AsyncPixelTransferManagerIdle::GetTotalTextureUploadTime() { |
285 return shared_state_.total_texture_upload_time; | 431 return shared_state_.total_texture_upload_time; |
286 } | 432 } |
287 | 433 |
288 void AsyncPixelTransferManagerIdle::ProcessMorePendingTransfers() { | 434 void AsyncPixelTransferManagerIdle::ProcessMorePendingTransfers() { |
289 if (shared_state_.tasks.empty()) | 435 if (shared_state_.tasks.empty()) |
290 return; | 436 return; |
291 | 437 |
292 // First task should always be a pixel transfer task. | 438 // Suspend uploads until waitables have been signalled. |
293 DCHECK(shared_state_.tasks.front().transfer_id); | 439 while (!suspend_waitables_.empty()) { |
| 440 if (!suspend_waitables_.front()->IsSignaled()) |
| 441 return; |
| 442 else |
| 443 suspend_waitables_.erase(suspend_waitables_.begin()); |
| 444 } |
| 445 |
| 446 // First task should always be a pixel transfer task or a suspend task. |
| 447 DCHECK_NE(shared_state_.tasks.front().transfer_id, kNotificationTask); |
294 shared_state_.tasks.front().task.Run(); | 448 shared_state_.tasks.front().task.Run(); |
295 shared_state_.tasks.pop_front(); | 449 shared_state_.tasks.pop_front(); |
296 | 450 |
297 shared_state_.ProcessNotificationTasks(); | 451 shared_state_.ProcessNotificationTasks(); |
298 } | 452 } |
299 | 453 |
300 bool AsyncPixelTransferManagerIdle::NeedsProcessMorePendingTransfers() { | 454 bool AsyncPixelTransferManagerIdle::NeedsProcessMorePendingTransfers() { |
301 return !shared_state_.tasks.empty(); | 455 return !shared_state_.tasks.empty(); |
302 } | 456 } |
303 | 457 |
304 void AsyncPixelTransferManagerIdle::WaitAllAsyncTexImage2D() { | 458 void AsyncPixelTransferManagerIdle::WaitAllAsyncTexImage2D() { |
305 if (shared_state_.tasks.empty()) | 459 if (shared_state_.tasks.empty()) |
306 return; | 460 return; |
307 | 461 |
308 const Task& task = shared_state_.tasks.back(); | 462 const Task& task = shared_state_.tasks.back(); |
309 if (task.delegate) | 463 if (task.delegate) |
310 task.delegate->WaitForTransferCompletion(); | 464 task.delegate->WaitForTransferCompletion(); |
311 } | 465 } |
312 | 466 |
| 467 void AsyncPixelTransferManagerIdle::DoSuspendUploads( |
| 468 scoped_ptr<base::WaitableEvent> waitable) { |
| 469 suspend_waitables_.push_back(waitable.release()); |
| 470 } |
| 471 |
| 472 void AsyncPixelTransferManagerIdle::SuspendUploads( |
| 473 base::WaitableEvent* waitable) { |
| 474 shared_state_.tasks.push_back( |
| 475 Task(kSuspendTask, |
| 476 NULL, |
| 477 base::Bind(&AsyncPixelTransferManagerIdle::DoSuspendUploads, |
| 478 base::Unretained(this), |
| 479 base::Passed( |
| 480 scoped_ptr<base::WaitableEvent>(waitable))))); |
| 481 } |
| 482 |
| 483 void AsyncPixelTransferManagerIdle::SignalWhenUploadsCompleted( |
| 484 base::WaitableEvent* waitable) { |
| 485 shared_state_.tasks.push_back( |
| 486 Task(kNotificationTask, |
| 487 NULL, |
| 488 base::Bind(&base::WaitableEvent::Signal, |
| 489 // WaitableEvent owned by waiter. |
| 490 base::Unretained(waitable)))); |
| 491 } |
| 492 |
313 AsyncPixelTransferDelegate* | 493 AsyncPixelTransferDelegate* |
314 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( | 494 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( |
315 gles2::TextureRef* ref, | 495 gles2::TextureRef* ref, |
316 const AsyncTexImage2DParams& define_params) { | 496 const AsyncTexImage2DParams& define_params) { |
317 return new AsyncPixelTransferDelegateIdle(&shared_state_, | 497 return new AsyncPixelTransferDelegateIdle(&shared_state_, |
318 ref->service_id(), | 498 ref->service_id(), |
319 define_params); | 499 define_params); |
320 } | 500 } |
321 | 501 |
| 502 AsyncPixelTransferDelegate* |
| 503 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( |
| 504 gles2::TextureRef* ref, |
| 505 const AsyncCompressedTexImage2DParams& define_params) { |
| 506 return new AsyncPixelTransferDelegateIdle(&shared_state_, ref->service_id(), |
| 507 define_params); |
| 508 } |
| 509 |
322 } // namespace gpu | 510 } // namespace gpu |
OLD | NEW |