| 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" | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 100     const AsyncMemoryParams& mem_params, | 100     const AsyncMemoryParams& mem_params, | 
| 101     const base::Closure& bind_callback) { | 101     const base::Closure& bind_callback) { | 
| 102   TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); | 102   TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); | 
| 103   DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); | 103   DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); | 
| 104   DCHECK(mem_params.shared_memory); | 104   DCHECK(mem_params.shared_memory); | 
| 105   DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, | 105   DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, | 
| 106             mem_params.shm_size); | 106             mem_params.shm_size); | 
| 107 | 107 | 
| 108   shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( | 108   shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( | 
| 109       id_, | 109       id_, | 
|  | 110       this, | 
| 110       base::Bind( | 111       base::Bind( | 
| 111           &AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D, | 112           &AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D, | 
| 112           AsWeakPtr(), | 113           AsWeakPtr(), | 
| 113           tex_params, | 114           tex_params, | 
| 114           mem_params, | 115           mem_params, | 
| 115           bind_callback, | 116           bind_callback, | 
| 116           base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), | 117           base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), | 
| 117                                                  mem_params.shared_memory, | 118                                                  mem_params.shared_memory, | 
| 118                                                  mem_params.shm_size))))); | 119                                                  mem_params.shm_size))))); | 
| 119 | 120 | 
| 120   transfer_in_progress_ = true; | 121   transfer_in_progress_ = true; | 
| 121 } | 122 } | 
| 122 | 123 | 
| 123 void AsyncPixelTransferDelegateIdle::AsyncTexSubImage2D( | 124 void AsyncPixelTransferDelegateIdle::AsyncTexSubImage2D( | 
| 124     const AsyncTexSubImage2DParams& tex_params, | 125     const AsyncTexSubImage2DParams& tex_params, | 
| 125     const AsyncMemoryParams& mem_params) { | 126     const AsyncMemoryParams& mem_params) { | 
| 126   TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); | 127   TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); | 
| 127   DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); | 128   DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); | 
| 128   DCHECK(mem_params.shared_memory); | 129   DCHECK(mem_params.shared_memory); | 
| 129   DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, | 130   DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, | 
| 130             mem_params.shm_size); | 131             mem_params.shm_size); | 
| 131 | 132 | 
| 132   shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( | 133   shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( | 
| 133       id_, | 134       id_, | 
|  | 135       this, | 
| 134       base::Bind( | 136       base::Bind( | 
| 135           &AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D, | 137           &AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D, | 
| 136           AsWeakPtr(), | 138           AsWeakPtr(), | 
| 137           tex_params, | 139           tex_params, | 
| 138           mem_params, | 140           mem_params, | 
| 139           base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), | 141           base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), | 
| 140                                                  mem_params.shared_memory, | 142                                                  mem_params.shared_memory, | 
| 141                                                  mem_params.shm_size))))); | 143                                                  mem_params.shm_size))))); | 
| 142 | 144 | 
| 143   transfer_in_progress_ = true; | 145   transfer_in_progress_ = true; | 
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 248   } | 250   } | 
| 249 | 251 | 
| 250   TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); | 252   TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); | 
| 251   transfer_in_progress_ = false; | 253   transfer_in_progress_ = false; | 
| 252   shared_state_->texture_upload_count++; | 254   shared_state_->texture_upload_count++; | 
| 253   shared_state_->total_texture_upload_time += | 255   shared_state_->total_texture_upload_time += | 
| 254       base::TimeTicks::HighResNow() - begin_time; | 256       base::TimeTicks::HighResNow() - begin_time; | 
| 255 } | 257 } | 
| 256 | 258 | 
| 257 AsyncPixelTransferManagerIdle::Task::Task( | 259 AsyncPixelTransferManagerIdle::Task::Task( | 
| 258     uint64 transfer_id, const base::Closure& task) | 260     uint64 transfer_id, | 
|  | 261     AsyncPixelTransferDelegate* delegate, | 
|  | 262     const base::Closure& task) | 
| 259     : transfer_id(transfer_id), | 263     : transfer_id(transfer_id), | 
|  | 264       delegate(delegate), | 
| 260       task(task) { | 265       task(task) { | 
| 261 } | 266 } | 
| 262 | 267 | 
| 263 AsyncPixelTransferManagerIdle::Task::~Task() {} | 268 AsyncPixelTransferManagerIdle::Task::~Task() {} | 
| 264 | 269 | 
| 265 AsyncPixelTransferManagerIdle::SharedState::SharedState() | 270 AsyncPixelTransferManagerIdle::SharedState::SharedState() | 
| 266     : texture_upload_count(0) {} | 271     : texture_upload_count(0) {} | 
| 267 | 272 | 
| 268 AsyncPixelTransferManagerIdle::SharedState::~SharedState() {} | 273 AsyncPixelTransferManagerIdle::SharedState::~SharedState() {} | 
| 269 | 274 | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 291 void AsyncPixelTransferManagerIdle::AsyncNotifyCompletion( | 296 void AsyncPixelTransferManagerIdle::AsyncNotifyCompletion( | 
| 292     const AsyncMemoryParams& mem_params, | 297     const AsyncMemoryParams& mem_params, | 
| 293     AsyncPixelTransferCompletionObserver* observer) { | 298     AsyncPixelTransferCompletionObserver* observer) { | 
| 294   if (shared_state_.tasks.empty()) { | 299   if (shared_state_.tasks.empty()) { | 
| 295     observer->DidComplete(mem_params); | 300     observer->DidComplete(mem_params); | 
| 296     return; | 301     return; | 
| 297   } | 302   } | 
| 298 | 303 | 
| 299   shared_state_.tasks.push_back( | 304   shared_state_.tasks.push_back( | 
| 300       Task(0,  // 0 transfer_id for notification tasks. | 305       Task(0,  // 0 transfer_id for notification tasks. | 
| 301            base::Bind( | 306            NULL, | 
| 302                &PerformNotifyCompletion, | 307            base::Bind(&PerformNotifyCompletion, | 
| 303                mem_params, | 308                       mem_params, | 
| 304                base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), | 309                       base::Owned( | 
| 305                                                       mem_params.shared_memory, | 310                           new ScopedSafeSharedMemory(safe_shared_memory_pool(), | 
| 306                                                       mem_params.shm_size)), | 311                                                      mem_params.shared_memory, | 
| 307                make_scoped_refptr(observer)))); | 312                                                      mem_params.shm_size)), | 
|  | 313                       make_scoped_refptr(observer)))); | 
| 308 } | 314 } | 
| 309 | 315 | 
| 310 uint32 AsyncPixelTransferManagerIdle::GetTextureUploadCount() { | 316 uint32 AsyncPixelTransferManagerIdle::GetTextureUploadCount() { | 
| 311   return shared_state_.texture_upload_count; | 317   return shared_state_.texture_upload_count; | 
| 312 } | 318 } | 
| 313 | 319 | 
| 314 base::TimeDelta AsyncPixelTransferManagerIdle::GetTotalTextureUploadTime() { | 320 base::TimeDelta AsyncPixelTransferManagerIdle::GetTotalTextureUploadTime() { | 
| 315   return shared_state_.total_texture_upload_time; | 321   return shared_state_.total_texture_upload_time; | 
| 316 } | 322 } | 
| 317 | 323 | 
| 318 void AsyncPixelTransferManagerIdle::ProcessMorePendingTransfers() { | 324 void AsyncPixelTransferManagerIdle::ProcessMorePendingTransfers() { | 
| 319   if (shared_state_.tasks.empty()) | 325   if (shared_state_.tasks.empty()) | 
| 320     return; | 326     return; | 
| 321 | 327 | 
| 322   // First task should always be a pixel transfer task. | 328   // First task should always be a pixel transfer task. | 
| 323   DCHECK(shared_state_.tasks.front().transfer_id); | 329   DCHECK(shared_state_.tasks.front().transfer_id); | 
| 324   shared_state_.tasks.front().task.Run(); | 330   shared_state_.tasks.front().task.Run(); | 
| 325   shared_state_.tasks.pop_front(); | 331   shared_state_.tasks.pop_front(); | 
| 326 | 332 | 
| 327   shared_state_.ProcessNotificationTasks(); | 333   shared_state_.ProcessNotificationTasks(); | 
| 328 } | 334 } | 
| 329 | 335 | 
| 330 bool AsyncPixelTransferManagerIdle::NeedsProcessMorePendingTransfers() { | 336 bool AsyncPixelTransferManagerIdle::NeedsProcessMorePendingTransfers() { | 
| 331   return !shared_state_.tasks.empty(); | 337   return !shared_state_.tasks.empty(); | 
| 332 } | 338 } | 
| 333 | 339 | 
|  | 340 void AsyncPixelTransferManagerIdle::WaitAllAsyncTexImage2D() { | 
|  | 341   if (shared_state_.tasks.empty()) | 
|  | 342     return; | 
|  | 343 | 
|  | 344   const Task& task = shared_state_.tasks.back(); | 
|  | 345   if (task.delegate) | 
|  | 346     task.delegate->WaitForTransferCompletion(); | 
|  | 347 } | 
|  | 348 | 
| 334 AsyncPixelTransferDelegate* | 349 AsyncPixelTransferDelegate* | 
| 335 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( | 350 AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( | 
| 336     gles2::TextureRef* ref, | 351     gles2::TextureRef* ref, | 
| 337     const AsyncTexImage2DParams& define_params) { | 352     const AsyncTexImage2DParams& define_params) { | 
| 338   return new AsyncPixelTransferDelegateIdle(&shared_state_, | 353   return new AsyncPixelTransferDelegateIdle(&shared_state_, | 
| 339                                             ref->service_id(), | 354                                             ref->service_id(), | 
| 340                                             define_params); | 355                                             define_params); | 
| 341 } | 356 } | 
| 342 | 357 | 
| 343 }  // namespace gpu | 358 }  // namespace gpu | 
| OLD | NEW | 
|---|