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

Unified 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, 2 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 side-by-side diff with in-line comments
Download patch
Index: content/common/gpu/client/command_buffer_proxy_impl.cc
diff --git a/content/common/gpu/client/command_buffer_proxy_impl.cc b/content/common/gpu/client/command_buffer_proxy_impl.cc
index f80521dd4d17799cfe7fb49e797f43fe51d2ef7a..e314a627ff95ee9414d618c26d47e811da09a605 100644
--- a/content/common/gpu/client/command_buffer_proxy_impl.cc
+++ b/content/common/gpu/client/command_buffer_proxy_impl.cc
@@ -169,10 +169,14 @@ void CommandBufferProxyImpl::OnSetMemoryAllocation(
}
void CommandBufferProxyImpl::OnSignalSyncPointAck(uint32 id) {
- SignalTaskMap::iterator it = signal_tasks_.find(id);
- DCHECK(it != signal_tasks_.end());
- base::Closure callback = it->second;
- signal_tasks_.erase(it);
+ base::Closure callback;
+ {
+ base::AutoLock lock(signal_lock_);
reveman 2014/10/22 22:42:47 Alternatively, we can make sure to only access sig
+ SignalTaskMap::iterator it = signal_tasks_.find(id);
+ DCHECK(it != signal_tasks_.end());
+ callback = it->second;
+ signal_tasks_.erase(it);
+ }
callback.Run();
}
@@ -259,6 +263,37 @@ void CommandBufferProxyImpl::SetSwapBuffersCompletionCallback(
swap_buffers_completion_callback_ = callback;
}
+void CommandBufferProxyImpl::WaitForPendingGpuMemoryBufferUsageToComplete(
+ const base::Closure& callback) {
+ uint32 sync_point = InsertSyncPoint();
+ SignalSyncPoint(
+ sync_point,
+ base::Bind(&CommandBufferProxyImpl::GpuMemoryBufferSyncPointSignalled,
+ base::Unretained(this),
+ sync_point));
+
+ base::AutoLock lock(gpu_memory_buffer_task_lock_);
+ 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
+}
+
+void CommandBufferProxyImpl::GpuMemoryBufferSyncPointSignalled(
+ uint32 sync_point) {
+ base::Closure callback;
+ {
+ base::AutoLock lock(gpu_memory_buffer_task_lock_);
+ SignalTaskMap::iterator it = gpu_memory_buffer_tasks_.find(sync_point);
+ DCHECK(it != gpu_memory_buffer_tasks_.end());
+ callback = it->second;
+ signal_tasks_.erase(it);
+ }
+ callback.Run();
+}
+
+uint32 CommandBufferProxyImpl::GetNextSignalId() {
+ base::AutoLock lock(signal_lock_);
+ return next_signal_id_++;
+}
+
void CommandBufferProxyImpl::WaitForTokenInRange(int32 start, int32 end) {
TRACE_EVENT2("gpu",
"CommandBufferProxyImpl::WaitForToken",
@@ -463,13 +498,14 @@ void CommandBufferProxyImpl::SignalSyncPoint(uint32 sync_point,
if (last_state_.error != gpu::error::kNoError)
return;
- uint32 signal_id = next_signal_id_++;
+ uint32 signal_id = GetNextSignalId();
if (!Send(new GpuCommandBufferMsg_SignalSyncPoint(route_id_,
sync_point,
signal_id))) {
return;
}
+ base::AutoLock lock(signal_lock_);
signal_tasks_.insert(std::make_pair(signal_id, callback));
}
@@ -486,13 +522,14 @@ void CommandBufferProxyImpl::SignalQuery(uint32 query,
// would have to make calls at an astounding rate (300B/s) and even if they
// could do that, all they would do is to prevent some callbacks from getting
// called, leading to stalled threads and/or memory leaks.
- uint32 signal_id = next_signal_id_++;
+ uint32 signal_id = GetNextSignalId();
if (!Send(new GpuCommandBufferMsg_SignalQuery(route_id_,
query,
signal_id))) {
return;
}
+ base::AutoLock lock(signal_lock_);
signal_tasks_.insert(std::make_pair(signal_id, callback));
}

Powered by Google App Engine
This is Rietveld 408576698