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

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..dbfed1da522e6eef8710a0eda2d35c946a32448b 100644
--- a/content/common/gpu/client/command_buffer_proxy_impl.cc
+++ b/content/common/gpu/client/command_buffer_proxy_impl.cc
@@ -82,14 +82,15 @@ bool IsImageFormatCompatibleWithGpuMemoryBufferFormat(
} // namespace
-CommandBufferProxyImpl::CommandBufferProxyImpl(
- GpuChannelHost* channel,
- int route_id)
+CommandBufferProxyImpl::CommandBufferProxyImpl(GpuChannelHost* channel,
+ int route_id)
: channel_(channel),
route_id_(route_id),
flush_count_(0),
last_put_offset_(-1),
- next_signal_id_(0) {
+ next_signal_id_(0),
+ main_loop_proxy_(base::MessageLoopProxy::current()),
+ tracker_(new GpuMemoryBufferUsageTracker) {
}
CommandBufferProxyImpl::~CommandBufferProxyImpl() {
@@ -259,6 +260,100 @@ void CommandBufferProxyImpl::SetSwapBuffersCompletionCallback(
swap_buffers_completion_callback_ = callback;
}
+CommandBufferProxyImpl::CallbackMessageLoopPair::CallbackMessageLoopPair(
+ const base::Closure& callback,
+ scoped_refptr<base::MessageLoopProxy> message_loop)
+ : callback(callback), message_loop(message_loop) {
+}
+
+CommandBufferProxyImpl::CallbackMessageLoopPair::~CallbackMessageLoopPair() {
+}
+
+CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::
+ GpuMemoryBufferUsageTracker()
+ : next_gpu_memory_buffer_usage_id_(0) {
+}
+
+void CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::OnWillDeleteImpl() {
+ base::AutoLock lock(gpu_memory_buffer_task_lock_);
+ GpuMemoryBufferUsageCompletedMap::iterator it =
+ gpu_memory_buffer_tasks_.begin();
+ for (; it != gpu_memory_buffer_tasks_.end(); it++) {
+ it->second.message_loop->PostTask(
+ FROM_HERE,
+ base::Bind(&CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::
+ UsageCompletedOnCaller,
+ this,
+ it->first));
+ }
+}
+
+uint32 CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::AddUsage(
+ const CallbackMessageLoopPair& task) {
+ base::AutoLock lock(gpu_memory_buffer_task_lock_);
+ uint32 usage_id = next_gpu_memory_buffer_usage_id_++;
+
+ gpu_memory_buffer_tasks_.insert(std::make_pair(usage_id, task));
+ return usage_id;
+}
+
+void CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::UsageCompleted(
+ uint32 task_id) {
+ base::AutoLock lock(gpu_memory_buffer_task_lock_);
+ GpuMemoryBufferUsageCompletedMap::iterator it =
+ gpu_memory_buffer_tasks_.find(task_id);
+ DCHECK(it != gpu_memory_buffer_tasks_.end());
+ it->second.message_loop->PostTask(
+ FROM_HERE,
+ base::Bind(&CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::
+ UsageCompletedOnCaller,
+ this,
+ task_id));
+}
+
+CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::
+ ~GpuMemoryBufferUsageTracker() {
+}
+
+void
+CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::UsageCompletedOnCaller(
+ uint32 task_id) {
+ base::Closure callback;
+ {
+ base::AutoLock lock(gpu_memory_buffer_task_lock_);
+ GpuMemoryBufferUsageCompletedMap::iterator it =
+ gpu_memory_buffer_tasks_.find(task_id);
+ DCHECK(it != gpu_memory_buffer_tasks_.end());
+
+ callback = it->second.callback;
+ gpu_memory_buffer_tasks_.erase(it);
+ }
+ callback.Run();
+}
+
+void CommandBufferProxyImpl::WaitForPendingGpuMemoryBufferUsageToComplete(
+ const base::Closure& callback) {
+ uint32 usage_id = tracker_->AddUsage(
+ CallbackMessageLoopPair(callback, base::MessageLoopProxy::current()));
+
+ main_loop_proxy_->PostTask(
+ FROM_HERE,
+ base::Bind(&CommandBufferProxyImpl::
+ WaitForPendingGpuMemoryBufferUsageToCompleteOnMain,
+ base::Unretained(this),
+ usage_id));
+}
+
+void CommandBufferProxyImpl::WaitForPendingGpuMemoryBufferUsageToCompleteOnMain(
+ uint32 usage_id) {
+ SignalSyncPoint(
+ InsertSyncPoint(),
+ base::Bind(
+ &CommandBufferProxyImpl::GpuMemoryBufferUsageTracker::UsageCompleted,
+ tracker_,
+ usage_id));
+}
+
void CommandBufferProxyImpl::WaitForTokenInRange(int32 start, int32 end) {
TRACE_EVENT2("gpu",
"CommandBufferProxyImpl::WaitForToken",

Powered by Google App Engine
This is Rietveld 408576698