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

Side by Side Diff: gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc

Issue 116863003: gpu: Reuse transfer buffers more aggresively (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebased; removed unnecessary barrier; use CheckedNumeric Created 6 years, 9 months 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
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698