OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" | 5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 } | 44 } |
45 | 45 |
46 void GpuMemoryBufferDeleted( | 46 void GpuMemoryBufferDeleted( |
47 scoped_refptr<base::SingleThreadTaskRunner> destruction_task_runner, | 47 scoped_refptr<base::SingleThreadTaskRunner> destruction_task_runner, |
48 const gpu::GpuMemoryBufferImpl::DestructionCallback& destruction_callback, | 48 const gpu::GpuMemoryBufferImpl::DestructionCallback& destruction_callback, |
49 const gpu::SyncToken& sync_token) { | 49 const gpu::SyncToken& sync_token) { |
50 destruction_task_runner->PostTask( | 50 destruction_task_runner->PostTask( |
51 FROM_HERE, base::Bind(destruction_callback, sync_token)); | 51 FROM_HERE, base::Bind(destruction_callback, sync_token)); |
52 } | 52 } |
53 | 53 |
54 GpuMemoryBufferConfigurationSet GetNativeGpuMemoryBufferConfigurations() { | |
55 GpuMemoryBufferConfigurationSet configurations; | |
56 | |
57 if (BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBuffersEnabled()) { | |
58 const gfx::BufferFormat kNativeFormats[] = { | |
59 gfx::BufferFormat::R_8, | |
60 gfx::BufferFormat::RG_88, | |
61 gfx::BufferFormat::BGR_565, | |
62 gfx::BufferFormat::RGBA_4444, | |
63 gfx::BufferFormat::RGBA_8888, | |
64 gfx::BufferFormat::BGRA_8888, | |
65 gfx::BufferFormat::UYVY_422, | |
66 gfx::BufferFormat::YVU_420, | |
67 gfx::BufferFormat::YUV_420_BIPLANAR}; | |
68 const gfx::BufferUsage kNativeUsages[] = { | |
69 gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, | |
70 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, | |
71 gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT}; | |
72 for (auto& format : kNativeFormats) { | |
73 for (auto& usage : kNativeUsages) { | |
74 if (gpu::IsNativeGpuMemoryBufferConfigurationSupported(format, usage)) | |
75 configurations.insert(std::make_pair(format, usage)); | |
76 } | |
77 } | |
78 } | |
79 | |
80 #if defined(USE_OZONE) || defined(OS_MACOSX) | |
81 // Disable native buffers only when using Mesa. | |
82 bool force_native_gpu_read_write_formats = | |
83 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
84 switches::kUseGL) != gl::kGLImplementationOSMesaName; | |
85 #else | |
86 bool force_native_gpu_read_write_formats = false; | |
87 #endif | |
88 if (force_native_gpu_read_write_formats) { | |
89 const gfx::BufferFormat kGPUReadWriteFormats[] = { | |
90 gfx::BufferFormat::BGR_565, gfx::BufferFormat::RGBA_8888, | |
91 gfx::BufferFormat::RGBX_8888, gfx::BufferFormat::BGRA_8888, | |
92 gfx::BufferFormat::BGRX_8888, gfx::BufferFormat::UYVY_422, | |
93 gfx::BufferFormat::YVU_420, gfx::BufferFormat::YUV_420_BIPLANAR}; | |
94 const gfx::BufferUsage kGPUReadWriteUsages[] = { | |
95 gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT}; | |
96 for (auto& format : kGPUReadWriteFormats) { | |
97 for (auto& usage : kGPUReadWriteUsages) { | |
98 if (gpu::IsNativeGpuMemoryBufferConfigurationSupported(format, usage)) | |
99 configurations.insert(std::make_pair(format, usage)); | |
100 } | |
101 } | |
102 } | |
103 | |
104 return configurations; | |
105 } | |
106 | |
107 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr; | 54 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr; |
108 | 55 |
109 } // namespace | 56 } // namespace |
110 | 57 |
111 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferRequest { | 58 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferRequest { |
112 CreateGpuMemoryBufferRequest(const gfx::Size& size, | 59 CreateGpuMemoryBufferRequest(const gfx::Size& size, |
113 gfx::BufferFormat format, | 60 gfx::BufferFormat format, |
114 gfx::BufferUsage usage, | 61 gfx::BufferUsage usage, |
115 int client_id, | 62 int client_id, |
116 gpu::SurfaceHandle surface_handle) | 63 gpu::SurfaceHandle surface_handle) |
(...skipping 27 matching lines...) Expand all Loading... |
144 client_id, | 91 client_id, |
145 gpu::kNullSurfaceHandle), | 92 gpu::kNullSurfaceHandle), |
146 handle(handle) {} | 93 handle(handle) {} |
147 ~CreateGpuMemoryBufferFromHandleRequest() {} | 94 ~CreateGpuMemoryBufferFromHandleRequest() {} |
148 gfx::GpuMemoryBufferHandle handle; | 95 gfx::GpuMemoryBufferHandle handle; |
149 }; | 96 }; |
150 | 97 |
151 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( | 98 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( |
152 int gpu_client_id, | 99 int gpu_client_id, |
153 uint64_t gpu_client_tracing_id) | 100 uint64_t gpu_client_tracing_id) |
154 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()), | 101 : native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()), |
155 gpu_client_id_(gpu_client_id), | 102 gpu_client_id_(gpu_client_id), |
156 gpu_client_tracing_id_(gpu_client_tracing_id), | 103 gpu_client_tracing_id_(gpu_client_tracing_id), |
157 gpu_host_id_(0) { | 104 gpu_host_id_(0) { |
158 DCHECK(!g_gpu_memory_buffer_manager); | 105 DCHECK(!g_gpu_memory_buffer_manager); |
159 g_gpu_memory_buffer_manager = this; | 106 g_gpu_memory_buffer_manager = this; |
160 } | 107 } |
161 | 108 |
162 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() { | 109 BrowserGpuMemoryBufferManager::~BrowserGpuMemoryBufferManager() { |
163 g_gpu_memory_buffer_manager = nullptr; | 110 g_gpu_memory_buffer_manager = nullptr; |
164 } | 111 } |
165 | 112 |
166 // static | 113 // static |
167 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() { | 114 BrowserGpuMemoryBufferManager* BrowserGpuMemoryBufferManager::current() { |
168 return g_gpu_memory_buffer_manager; | 115 return g_gpu_memory_buffer_manager; |
169 } | 116 } |
170 | 117 |
171 // static | 118 // static |
172 bool BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBuffersEnabled() { | |
173 // Disable native buffers when using Mesa. | |
174 if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
175 switches::kUseGL) == gl::kGLImplementationOSMesaName) { | |
176 return false; | |
177 } | |
178 | |
179 #if defined(OS_MACOSX) | |
180 return !base::CommandLine::ForCurrentProcess()->HasSwitch( | |
181 switches::kDisableNativeGpuMemoryBuffers); | |
182 #else | |
183 return base::CommandLine::ForCurrentProcess()->HasSwitch( | |
184 switches::kEnableNativeGpuMemoryBuffers); | |
185 #endif | |
186 } | |
187 | |
188 // static | |
189 uint32_t BrowserGpuMemoryBufferManager::GetImageTextureTarget( | 119 uint32_t BrowserGpuMemoryBufferManager::GetImageTextureTarget( |
190 gfx::BufferFormat format, | 120 gfx::BufferFormat format, |
191 gfx::BufferUsage usage) { | 121 gfx::BufferUsage usage) { |
192 GpuMemoryBufferConfigurationSet native_configurations = | 122 gpu::GpuMemoryBufferConfigurationSet native_configurations = |
193 GetNativeGpuMemoryBufferConfigurations(); | 123 gpu::GetNativeGpuMemoryBufferConfigurations(); |
194 if (native_configurations.find(std::make_pair(format, usage)) == | 124 if (native_configurations.find(std::make_pair(format, usage)) == |
195 native_configurations.end()) { | 125 native_configurations.end()) { |
196 return GL_TEXTURE_2D; | 126 return GL_TEXTURE_2D; |
197 } | 127 } |
198 | 128 |
199 switch (gpu::GetNativeGpuMemoryBufferType()) { | 129 switch (gpu::GetNativeGpuMemoryBufferType()) { |
200 case gfx::OZONE_NATIVE_PIXMAP: | 130 case gfx::OZONE_NATIVE_PIXMAP: |
201 // GPU memory buffers that are shared with the GL using EGLImages | 131 // GPU memory buffers that are shared with the GL using EGLImages |
202 // require TEXTURE_EXTERNAL_OES. | 132 // require TEXTURE_EXTERNAL_OES. |
203 return GL_TEXTURE_EXTERNAL_OES; | 133 return GL_TEXTURE_EXTERNAL_OES; |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 format(format), | 606 format(format), |
677 usage(usage), | 607 usage(usage), |
678 gpu_host_id(gpu_host_id) {} | 608 gpu_host_id(gpu_host_id) {} |
679 | 609 |
680 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = | 610 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = |
681 default; | 611 default; |
682 | 612 |
683 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} | 613 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} |
684 | 614 |
685 } // namespace content | 615 } // namespace content |
OLD | NEW |