| 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 |