Index: gpu/ipc/common/gpu_memory_buffer_support.cc |
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc |
index 64412459f3b269c0587f8218267da4628fee6e85..f5df73ee1cfd930656c9e80c4bf71ee9cfca4fea 100644 |
--- a/gpu/ipc/common/gpu_memory_buffer_support.cc |
+++ b/gpu/ipc/common/gpu_memory_buffer_support.cc |
@@ -4,8 +4,12 @@ |
#include "gpu/ipc/common/gpu_memory_buffer_support.h" |
+#include "base/command_line.h" |
#include "base/logging.h" |
#include "build/build_config.h" |
+#include "gpu/ipc/common/gpu_switches.h" |
+#include "ui/gl/gl_bindings.h" |
+#include "ui/gl/gl_switches.h" |
#if defined(USE_OZONE) |
#include "ui/ozone/public/client_native_pixmap_factory.h" |
@@ -13,6 +17,22 @@ |
namespace gpu { |
+bool AreNativeGpuMemoryBuffersEnabled() { |
+ // Disable native buffers when using Mesa. |
+ if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
+ switches::kUseGL) == gl::kGLImplementationOSMesaName) { |
+ return false; |
+ } |
+ |
+#if defined(OS_MACOSX) |
+ return !base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisableNativeGpuMemoryBuffers); |
+#else |
+ return base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableNativeGpuMemoryBuffers); |
+#endif |
+} |
+ |
gfx::GpuMemoryBufferType GetNativeGpuMemoryBufferType() { |
#if defined(OS_MACOSX) |
return gfx::IO_SURFACE_BUFFER; |
@@ -25,6 +45,11 @@ gfx::GpuMemoryBufferType GetNativeGpuMemoryBufferType() { |
bool IsNativeGpuMemoryBufferConfigurationSupported(gfx::BufferFormat format, |
gfx::BufferUsage usage) { |
+ bool never_cpu_read = |
+ usage == gfx::BufferUsage::SCANOUT || usage == gfx::BufferUsage::GPU_READ; |
+ if (!(AreNativeGpuMemoryBuffersEnabled() || never_cpu_read)) |
dshwang
2017/03/07 21:50:03
reveman@, besides video GMB support, I think this
|
+ return false; |
+ |
DCHECK_NE(gfx::SHARED_MEMORY_BUFFER, GetNativeGpuMemoryBufferType()); |
DCHECK_NE(gfx::EMPTY_BUFFER, GetNativeGpuMemoryBufferType()); |
#if defined(OS_MACOSX) |
@@ -58,4 +83,84 @@ bool IsNativeGpuMemoryBufferConfigurationSupported(gfx::BufferFormat format, |
return false; |
} |
+GpuMemoryBufferConfigurationSet GetNativeGpuMemoryBufferConfigurations() { |
+ GpuMemoryBufferConfigurationSet configurations; |
+ |
+#if defined(USE_OZONE) || defined(OS_MACOSX) |
+ if (AreNativeGpuMemoryBuffersEnabled()) { |
+ const gfx::BufferFormat kNativeFormats[] = { |
+ gfx::BufferFormat::R_8, |
+ gfx::BufferFormat::RG_88, |
+ gfx::BufferFormat::BGR_565, |
+ gfx::BufferFormat::RGBA_4444, |
+ gfx::BufferFormat::RGBA_8888, |
+ gfx::BufferFormat::BGRA_8888, |
+ gfx::BufferFormat::UYVY_422, |
+ gfx::BufferFormat::YVU_420, |
+ gfx::BufferFormat::YUV_420_BIPLANAR}; |
+ const gfx::BufferUsage kNativeUsages[] = { |
+ gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT, |
+ gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, |
+ gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT}; |
+ for (auto format : kNativeFormats) { |
+ for (auto usage : kNativeUsages) { |
+ if (IsNativeGpuMemoryBufferConfigurationSupported(format, usage)) |
+ configurations.insert(std::make_pair(format, usage)); |
+ } |
+ } |
+ } |
+ |
+ // Disable native buffers only when using Mesa. |
+ bool force_native_gpu_read_write_formats = |
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
+ switches::kUseGL) != gl::kGLImplementationOSMesaName; |
+ if (force_native_gpu_read_write_formats) { |
+ const gfx::BufferFormat kGPUReadWriteFormats[] = { |
+ gfx::BufferFormat::BGR_565, gfx::BufferFormat::RGBA_8888, |
+ gfx::BufferFormat::RGBX_8888, gfx::BufferFormat::BGRA_8888, |
+ gfx::BufferFormat::BGRX_8888, gfx::BufferFormat::UYVY_422, |
+ gfx::BufferFormat::YVU_420, gfx::BufferFormat::YUV_420_BIPLANAR}; |
+ const gfx::BufferUsage kGPUReadWriteUsages[] = {gfx::BufferUsage::GPU_READ, |
+ gfx::BufferUsage::SCANOUT}; |
+ for (auto format : kGPUReadWriteFormats) { |
+ for (auto usage : kGPUReadWriteUsages) { |
+ if (IsNativeGpuMemoryBufferConfigurationSupported(format, usage)) |
+ configurations.insert(std::make_pair(format, usage)); |
+ } |
+ } |
+ } |
+#endif // defined(USE_OZONE) || defined(OS_MACOSX) |
+ |
+ return configurations; |
+} |
+ |
+uint32_t GetImageTextureTarget(gfx::BufferFormat format, |
+ gfx::BufferUsage usage) { |
+#if defined(USE_OZONE) || defined(OS_MACOSX) |
+ GpuMemoryBufferConfigurationSet native_configurations = |
+ GetNativeGpuMemoryBufferConfigurations(); |
+ if (native_configurations.find(std::make_pair(format, usage)) == |
+ native_configurations.end()) { |
+ return GL_TEXTURE_2D; |
+ } |
+ |
+ switch (GetNativeGpuMemoryBufferType()) { |
+ case gfx::OZONE_NATIVE_PIXMAP: |
+ // GPU memory buffers that are shared with the GL using EGLImages |
+ // require TEXTURE_EXTERNAL_OES. |
+ return GL_TEXTURE_EXTERNAL_OES; |
+ case gfx::IO_SURFACE_BUFFER: |
+ // IOSurface backed images require GL_TEXTURE_RECTANGLE_ARB. |
+ return GL_TEXTURE_RECTANGLE_ARB; |
+ case gfx::SHARED_MEMORY_BUFFER: |
+ case gfx::EMPTY_BUFFER: |
+ break; |
+ } |
+ NOTREACHED(); |
+ return GL_TEXTURE_2D; |
+#else // defined(USE_OZONE) || defined(OS_MACOSX) |
+ return GL_TEXTURE_2D; |
+#endif |
+} |
+ |
} // namespace gpu |