OLD | NEW |
---|---|
(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 | |
OLD | NEW |