| 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 |