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

Side by Side Diff: content/browser/gpu/browser_gpu_memory_buffer_manager.cc

Issue 634083002: gpu: Compositor management of GpuMemoryBuffer instances. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cc-pre-chromium-image-refactor
Patch Set: mac build fix 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
6
7 #include "base/bind.h"
8 #include "base/debug/trace_event.h"
9 #include "base/lazy_instance.h"
10 #include "base/synchronization/waitable_event.h"
11 #include "base/threading/thread_restrictions.h"
12 #include "content/common/gpu/client/gpu_memory_buffer_impl.h"
13 #include "content/public/browser/browser_thread.h"
14
15 namespace content {
16 namespace {
17
18 void GpuMemoryBufferAllocatedForChildProcess(
19 const BrowserGpuMemoryBufferManager::AllocationCallback& callback,
20 const gfx::GpuMemoryBufferHandle& handle) {
21 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
22
23 callback.Run(handle);
24 }
25
26 base::LazyInstance<BrowserGpuMemoryBufferManager> g_gpu_memory_buffer_manager =
27 LAZY_INSTANCE_INITIALIZER;
28
29 } // namespace
30
31 struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest {
32 AllocateGpuMemoryBufferRequest(const gfx::Size& size,
33 gfx::GpuMemoryBuffer::Format format,
34 gfx::GpuMemoryBuffer::Usage usage,
35 int client_id)
36 : event(true, false),
37 size(size),
38 format(format),
39 usage(usage),
40 client_id(client_id) {}
41 ~AllocateGpuMemoryBufferRequest() {}
42 base::WaitableEvent event;
43 gfx::Size size;
44 gfx::GpuMemoryBuffer::Format format;
45 gfx::GpuMemoryBuffer::Usage usage;
46 int client_id;
47 scoped_ptr<gfx::GpuMemoryBuffer> result;
48 };
49
50 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager()
51 : gpu_client_id_(0) {
52 }
53
54 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() {
55 }
56
57 // static
58 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() {
59 return g_gpu_memory_buffer_manager.Pointer();
60 }
61
62 scoped_ptr<gfx::GpuMemoryBuffer>
63 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBuffer(
64 const gfx::Size& size,
65 gfx::GpuMemoryBuffer::Format format,
66 gfx::GpuMemoryBuffer::Usage usage) {
67 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
68
69 AllocateGpuMemoryBufferRequest request(size, format, usage, gpu_client_id_);
70 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)
71 ->PostTask(
piman 2014/10/09 21:33:02 nit: BrowserThread::PostTask(BrowserThread::IO, ..
reveman 2014/10/10 02:20:16 Done.
72 FROM_HERE,
73 base::Bind(
74 &BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO,
75 base::Unretained(&request)));
76
77 // We're blocking the UI thread, which is generally undesirable.
78 TRACE_EVENT0("browser",
79 "BrowserGpuMemoryBufferManager::AllocateGpuMemoryBuffer");
80 base::ThreadRestrictions::ScopedAllowWait allow_wait;
81 request.event.Wait();
82 return request.result.Pass();
83 }
84
85 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
86 const gfx::Size& size,
87 gfx::GpuMemoryBuffer::Format format,
88 gfx::GpuMemoryBuffer::Usage usage,
89 base::ProcessHandle child_process_handle,
90 int child_client_id,
91 const AllocationCallback& callback) {
92 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
93
94 GpuMemoryBufferImpl::AllocateForChildProcess(
95 size,
96 format,
97 usage,
98 child_process_handle,
99 child_client_id,
100 base::Bind(&GpuMemoryBufferAllocatedForChildProcess, callback));
101 }
102
103 gfx::GpuMemoryBuffer*
104 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer(
105 ClientBuffer buffer) {
106 return GpuMemoryBufferImpl::FromClientBuffer(buffer);
107 }
108
109 void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer(
110 gfx::GpuMemoryBufferType type,
111 const gfx::GpuMemoryBufferId& id,
112 base::ProcessHandle child_process_handle) {
113 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
114
115 GpuMemoryBufferImpl::DeletedByChildProcess(type, id, child_process_handle);
116 }
117
118 void BrowserGpuMemoryBufferManager::ProcessRemoved(
119 base::ProcessHandle process_handle) {
120 // TODO(reveman): Handle child process removal correctly.
121 }
122
123 // static
124 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO(
125 AllocateGpuMemoryBufferRequest* request) {
126 GpuMemoryBufferImpl::Create(
127 request->size,
128 request->format,
129 request->usage,
130 request->client_id,
131 base::Bind(&BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO,
132 base::Unretained(request)));
133 }
134
135 // static
136 void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO(
137 AllocateGpuMemoryBufferRequest* request,
138 scoped_ptr<GpuMemoryBufferImpl> buffer) {
139 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
140
141 request->result = buffer.PassAs<gfx::GpuMemoryBuffer>();
142 request->event.Signal();
143 }
144
145 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698