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

Side by Side Diff: content/common/gpu/client/command_buffer_proxy_impl.cc

Issue 654223006: Cleanup GpuMemoryBuffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "content/common/gpu/client/command_buffer_proxy_impl.h" 5 #include "content/common/gpu/client/command_buffer_proxy_impl.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/shared_memory.h" 10 #include "base/memory/shared_memory.h"
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 deletion_observers_.RemoveObserver(observer); 162 deletion_observers_.RemoveObserver(observer);
163 } 163 }
164 164
165 void CommandBufferProxyImpl::OnSetMemoryAllocation( 165 void CommandBufferProxyImpl::OnSetMemoryAllocation(
166 const gpu::MemoryAllocation& allocation) { 166 const gpu::MemoryAllocation& allocation) {
167 if (!memory_allocation_changed_callback_.is_null()) 167 if (!memory_allocation_changed_callback_.is_null())
168 memory_allocation_changed_callback_.Run(allocation); 168 memory_allocation_changed_callback_.Run(allocation);
169 } 169 }
170 170
171 void CommandBufferProxyImpl::OnSignalSyncPointAck(uint32 id) { 171 void CommandBufferProxyImpl::OnSignalSyncPointAck(uint32 id) {
172 SignalTaskMap::iterator it = signal_tasks_.find(id); 172 base::Closure callback;
173 DCHECK(it != signal_tasks_.end()); 173 {
174 base::Closure callback = it->second; 174 base::AutoLock lock(signal_lock_);
reveman 2014/10/22 22:42:47 Alternatively, we can make sure to only access sig
175 signal_tasks_.erase(it); 175 SignalTaskMap::iterator it = signal_tasks_.find(id);
176 DCHECK(it != signal_tasks_.end());
177 callback = it->second;
178 signal_tasks_.erase(it);
179 }
176 callback.Run(); 180 callback.Run();
177 } 181 }
178 182
179 void CommandBufferProxyImpl::SetChannelErrorCallback( 183 void CommandBufferProxyImpl::SetChannelErrorCallback(
180 const base::Closure& callback) { 184 const base::Closure& callback) {
181 channel_error_callback_ = callback; 185 channel_error_callback_ = callback;
182 } 186 }
183 187
184 bool CommandBufferProxyImpl::Initialize() { 188 bool CommandBufferProxyImpl::Initialize() {
185 TRACE_EVENT0("gpu", "CommandBufferProxyImpl::Initialize"); 189 TRACE_EVENT0("gpu", "CommandBufferProxyImpl::Initialize");
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 const std::vector<ui::LatencyInfo>& latency_info) { 256 const std::vector<ui::LatencyInfo>& latency_info) {
253 for (size_t i = 0; i < latency_info.size(); i++) 257 for (size_t i = 0; i < latency_info.size(); i++)
254 latency_info_.push_back(latency_info[i]); 258 latency_info_.push_back(latency_info[i]);
255 } 259 }
256 260
257 void CommandBufferProxyImpl::SetSwapBuffersCompletionCallback( 261 void CommandBufferProxyImpl::SetSwapBuffersCompletionCallback(
258 const SwapBuffersCompletionCallback& callback) { 262 const SwapBuffersCompletionCallback& callback) {
259 swap_buffers_completion_callback_ = callback; 263 swap_buffers_completion_callback_ = callback;
260 } 264 }
261 265
266 void CommandBufferProxyImpl::WaitForPendingGpuMemoryBufferUsageToComplete(
267 const base::Closure& callback) {
268 uint32 sync_point = InsertSyncPoint();
269 SignalSyncPoint(
270 sync_point,
271 base::Bind(&CommandBufferProxyImpl::GpuMemoryBufferSyncPointSignalled,
272 base::Unretained(this),
273 sync_point));
274
275 base::AutoLock lock(gpu_memory_buffer_task_lock_);
276 gpu_memory_buffer_tasks_.insert(std::make_pair(sync_point, callback));
alexst (slow to review) 2014/10/22 20:05:01 Forgot to add, these are to be called in the destr
reveman 2014/10/22 22:42:47 Will the dtor be called on the same thread that ca
277 }
278
279 void CommandBufferProxyImpl::GpuMemoryBufferSyncPointSignalled(
280 uint32 sync_point) {
281 base::Closure callback;
282 {
283 base::AutoLock lock(gpu_memory_buffer_task_lock_);
284 SignalTaskMap::iterator it = gpu_memory_buffer_tasks_.find(sync_point);
285 DCHECK(it != gpu_memory_buffer_tasks_.end());
286 callback = it->second;
287 signal_tasks_.erase(it);
288 }
289 callback.Run();
290 }
291
292 uint32 CommandBufferProxyImpl::GetNextSignalId() {
293 base::AutoLock lock(signal_lock_);
294 return next_signal_id_++;
295 }
296
262 void CommandBufferProxyImpl::WaitForTokenInRange(int32 start, int32 end) { 297 void CommandBufferProxyImpl::WaitForTokenInRange(int32 start, int32 end) {
263 TRACE_EVENT2("gpu", 298 TRACE_EVENT2("gpu",
264 "CommandBufferProxyImpl::WaitForToken", 299 "CommandBufferProxyImpl::WaitForToken",
265 "start", 300 "start",
266 start, 301 start,
267 "end", 302 "end",
268 end); 303 end);
269 TryUpdateState(); 304 TryUpdateState();
270 if (!InRange(start, end, last_state_.token) && 305 if (!InRange(start, end, last_state_.token) &&
271 last_state_.error == gpu::error::kNoError) { 306 last_state_.error == gpu::error::kNoError) {
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 return; 491 return;
457 492
458 Send(new GpuCommandBufferMsg_RetireSyncPoint(route_id_, sync_point)); 493 Send(new GpuCommandBufferMsg_RetireSyncPoint(route_id_, sync_point));
459 } 494 }
460 495
461 void CommandBufferProxyImpl::SignalSyncPoint(uint32 sync_point, 496 void CommandBufferProxyImpl::SignalSyncPoint(uint32 sync_point,
462 const base::Closure& callback) { 497 const base::Closure& callback) {
463 if (last_state_.error != gpu::error::kNoError) 498 if (last_state_.error != gpu::error::kNoError)
464 return; 499 return;
465 500
466 uint32 signal_id = next_signal_id_++; 501 uint32 signal_id = GetNextSignalId();
467 if (!Send(new GpuCommandBufferMsg_SignalSyncPoint(route_id_, 502 if (!Send(new GpuCommandBufferMsg_SignalSyncPoint(route_id_,
468 sync_point, 503 sync_point,
469 signal_id))) { 504 signal_id))) {
470 return; 505 return;
471 } 506 }
472 507
508 base::AutoLock lock(signal_lock_);
473 signal_tasks_.insert(std::make_pair(signal_id, callback)); 509 signal_tasks_.insert(std::make_pair(signal_id, callback));
474 } 510 }
475 511
476 void CommandBufferProxyImpl::SignalQuery(uint32 query, 512 void CommandBufferProxyImpl::SignalQuery(uint32 query,
477 const base::Closure& callback) { 513 const base::Closure& callback) {
478 if (last_state_.error != gpu::error::kNoError) 514 if (last_state_.error != gpu::error::kNoError)
479 return; 515 return;
480 516
481 // Signal identifiers are hidden, so nobody outside of this class will see 517 // Signal identifiers are hidden, so nobody outside of this class will see
482 // them. (And thus, they cannot save them.) The IDs themselves only last 518 // them. (And thus, they cannot save them.) The IDs themselves only last
483 // until the callback is invoked, which will happen as soon as the GPU 519 // until the callback is invoked, which will happen as soon as the GPU
484 // catches upwith the command buffer. 520 // catches upwith the command buffer.
485 // A malicious caller trying to create a collision by making next_signal_id 521 // A malicious caller trying to create a collision by making next_signal_id
486 // would have to make calls at an astounding rate (300B/s) and even if they 522 // would have to make calls at an astounding rate (300B/s) and even if they
487 // could do that, all they would do is to prevent some callbacks from getting 523 // could do that, all they would do is to prevent some callbacks from getting
488 // called, leading to stalled threads and/or memory leaks. 524 // called, leading to stalled threads and/or memory leaks.
489 uint32 signal_id = next_signal_id_++; 525 uint32 signal_id = GetNextSignalId();
490 if (!Send(new GpuCommandBufferMsg_SignalQuery(route_id_, 526 if (!Send(new GpuCommandBufferMsg_SignalQuery(route_id_,
491 query, 527 query,
492 signal_id))) { 528 signal_id))) {
493 return; 529 return;
494 } 530 }
495 531
532 base::AutoLock lock(signal_lock_);
496 signal_tasks_.insert(std::make_pair(signal_id, callback)); 533 signal_tasks_.insert(std::make_pair(signal_id, callback));
497 } 534 }
498 535
499 void CommandBufferProxyImpl::SetSurfaceVisible(bool visible) { 536 void CommandBufferProxyImpl::SetSurfaceVisible(bool visible) {
500 if (last_state_.error != gpu::error::kNoError) 537 if (last_state_.error != gpu::error::kNoError)
501 return; 538 return;
502 539
503 Send(new GpuCommandBufferMsg_SetSurfaceVisible(route_id_, visible)); 540 Send(new GpuCommandBufferMsg_SetSurfaceVisible(route_id_, visible));
504 } 541 }
505 542
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 if (!ui::LatencyInfo::Verify( 619 if (!ui::LatencyInfo::Verify(
583 latency_info, "CommandBufferProxyImpl::OnSwapBuffersCompleted")) { 620 latency_info, "CommandBufferProxyImpl::OnSwapBuffersCompleted")) {
584 swap_buffers_completion_callback_.Run(std::vector<ui::LatencyInfo>()); 621 swap_buffers_completion_callback_.Run(std::vector<ui::LatencyInfo>());
585 return; 622 return;
586 } 623 }
587 swap_buffers_completion_callback_.Run(latency_info); 624 swap_buffers_completion_callback_.Run(latency_info);
588 } 625 }
589 } 626 }
590 627
591 } // namespace content 628 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698