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

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: rebase 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 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr;
27
28 } // namespace
29
30 struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest {
31 AllocateGpuMemoryBufferRequest(const gfx::Size& size,
32 gfx::GpuMemoryBuffer::Format format,
33 gfx::GpuMemoryBuffer::Usage usage,
34 int client_id)
35 : event(true, false),
36 size(size),
37 format(format),
38 usage(usage),
39 client_id(client_id) {}
40 ~AllocateGpuMemoryBufferRequest() {}
41 base::WaitableEvent event;
42 gfx::Size size;
43 gfx::GpuMemoryBuffer::Format format;
44 gfx::GpuMemoryBuffer::Usage usage;
45 int client_id;
46 scoped_ptr<gfx::GpuMemoryBuffer> result;
47 };
48
49 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(int gpu_client_id)
50 : gpu_client_id_(gpu_client_id) {
51 DCHECK(!g_gpu_memory_buffer_manager);
52 g_gpu_memory_buffer_manager = this;
53 }
54
55 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() {
56 g_gpu_memory_buffer_manager = nullptr;
57 }
58
59 // static
60 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() {
61 return g_gpu_memory_buffer_manager;
62 }
63
64 scoped_ptr<gfx::GpuMemoryBuffer>
65 BrowserGpuMemoryBufferManager::AllocateGpuMemoryBuffer(
66 const gfx::Size& size,
67 gfx::GpuMemoryBuffer::Format format,
68 gfx::GpuMemoryBuffer::Usage usage) {
69 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
70
71 AllocateGpuMemoryBufferRequest request(size, format, usage, gpu_client_id_);
72 BrowserThread::PostTask(
73 BrowserThread::IO,
74 FROM_HERE,
75 base::Bind(&BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO,
76 base::Unretained(&request)));
77
78 // We're blocking the UI thread, which is generally undesirable.
79 TRACE_EVENT0("browser",
80 "BrowserGpuMemoryBufferManager::AllocateGpuMemoryBuffer");
81 base::ThreadRestrictions::ScopedAllowWait allow_wait;
82 request.event.Wait();
83 return request.result.Pass();
84 }
85
86 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
87 const gfx::Size& size,
88 gfx::GpuMemoryBuffer::Format format,
89 gfx::GpuMemoryBuffer::Usage usage,
90 base::ProcessHandle child_process_handle,
91 int child_client_id,
92 const AllocationCallback& callback) {
93 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
94
95 GpuMemoryBufferImpl::AllocateForChildProcess(
96 size,
97 format,
98 usage,
99 child_process_handle,
100 child_client_id,
101 base::Bind(&GpuMemoryBufferAllocatedForChildProcess, callback));
102 }
103
104 gfx::GpuMemoryBuffer*
105 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer(
106 ClientBuffer buffer) {
107 return GpuMemoryBufferImpl::FromClientBuffer(buffer);
108 }
109
110 void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer(
111 gfx::GpuMemoryBufferType type,
112 const gfx::GpuMemoryBufferId& id,
113 base::ProcessHandle child_process_handle) {
114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
115
116 GpuMemoryBufferImpl::DeletedByChildProcess(type, id, child_process_handle);
117 }
118
119 void BrowserGpuMemoryBufferManager::ProcessRemoved(
120 base::ProcessHandle process_handle) {
121 // TODO(reveman): Handle child process removal correctly.
122 }
123
124 // static
125 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO(
126 AllocateGpuMemoryBufferRequest* request) {
127 GpuMemoryBufferImpl::Create(
128 request->size,
129 request->format,
130 request->usage,
131 request->client_id,
132 base::Bind(&BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO,
133 base::Unretained(request)));
134 }
135
136 // static
137 void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO(
138 AllocateGpuMemoryBufferRequest* request,
139 scoped_ptr<GpuMemoryBufferImpl> buffer) {
140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
141
142 request->result = buffer.PassAs<gfx::GpuMemoryBuffer>();
143 request->event.Signal();
144 }
145
146 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | content/browser/gpu/gpu_memory_buffer_factory_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698