| 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" |
| 11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 12 #include "base/synchronization/waitable_event.h" | 12 #include "base/synchronization/waitable_event.h" |
| 13 #include "base/threading/thread_restrictions.h" | 13 #include "base/threading/thread_restrictions.h" |
| 14 #include "base/trace_event/process_memory_dump.h" | 14 #include "base/trace_event/process_memory_dump.h" |
| 15 #include "base/trace_event/trace_event.h" | 15 #include "base/trace_event/trace_event.h" |
| 16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 17 #include "content/browser/gpu/gpu_process_host.h" | 17 #include "content/browser/gpu/gpu_process_host.h" |
| 18 #include "content/common/child_process_host_impl.h" | 18 #include "content/common/child_process_host_impl.h" |
| 19 #include "content/common/generic_shared_memory_id_generator.h" | 19 #include "content/common/generic_shared_memory_id_generator.h" |
| 20 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" | 20 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" |
| 21 #include "content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h" | 21 #include "content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.h" |
| 22 #include "content/common/gpu/gpu_memory_buffer_factory.h" | |
| 23 #include "content/public/browser/browser_thread.h" | 22 #include "content/public/browser/browser_thread.h" |
| 24 #include "content/public/common/content_switches.h" | 23 #include "content/public/common/content_switches.h" |
| 25 #include "gpu/GLES2/gl2extchromium.h" | 24 #include "gpu/GLES2/gl2extchromium.h" |
| 25 #include "gpu/ipc/common/gpu_memory_buffer_support.h" |
| 26 #include "ui/gfx/buffer_format_util.h" | 26 #include "ui/gfx/buffer_format_util.h" |
| 27 #include "ui/gl/gl_switches.h" | 27 #include "ui/gl/gl_switches.h" |
| 28 | 28 |
| 29 #if defined(OS_MACOSX) | |
| 30 #include "content/common/gpu/gpu_memory_buffer_factory_io_surface.h" | |
| 31 #endif | |
| 32 | |
| 33 #if defined(OS_ANDROID) | |
| 34 #include "content/common/gpu/gpu_memory_buffer_factory_surface_texture.h" | |
| 35 #endif | |
| 36 | |
| 37 #if defined(USE_OZONE) | |
| 38 #include "content/common/gpu/gpu_memory_buffer_factory_ozone_native_pixmap.h" | |
| 39 #endif | |
| 40 | |
| 41 namespace content { | 29 namespace content { |
| 42 namespace { | 30 namespace { |
| 43 | 31 |
| 44 void HostCreateGpuMemoryBuffer( | 32 void HostCreateGpuMemoryBuffer( |
| 45 int surface_id, | 33 int surface_id, |
| 46 GpuProcessHost* host, | 34 GpuProcessHost* host, |
| 47 gfx::GpuMemoryBufferId id, | 35 gfx::GpuMemoryBufferId id, |
| 48 const gfx::Size& size, | 36 const gfx::Size& size, |
| 49 gfx::BufferFormat format, | 37 gfx::BufferFormat format, |
| 50 gfx::BufferUsage usage, | 38 gfx::BufferUsage usage, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 71 scoped_refptr<base::SingleThreadTaskRunner> destruction_task_runner, | 59 scoped_refptr<base::SingleThreadTaskRunner> destruction_task_runner, |
| 72 const GpuMemoryBufferImpl::DestructionCallback& destruction_callback, | 60 const GpuMemoryBufferImpl::DestructionCallback& destruction_callback, |
| 73 const gpu::SyncToken& sync_token) { | 61 const gpu::SyncToken& sync_token) { |
| 74 destruction_task_runner->PostTask( | 62 destruction_task_runner->PostTask( |
| 75 FROM_HERE, base::Bind(destruction_callback, sync_token)); | 63 FROM_HERE, base::Bind(destruction_callback, sync_token)); |
| 76 } | 64 } |
| 77 | 65 |
| 78 bool IsNativeGpuMemoryBufferFactoryConfigurationSupported( | 66 bool IsNativeGpuMemoryBufferFactoryConfigurationSupported( |
| 79 gfx::BufferFormat format, | 67 gfx::BufferFormat format, |
| 80 gfx::BufferUsage usage) { | 68 gfx::BufferUsage usage) { |
| 81 switch (GpuMemoryBufferFactory::GetNativeType()) { | 69 switch (gpu::GetNativeGpuMemoryBufferType()) { |
| 82 case gfx::SHARED_MEMORY_BUFFER: | 70 case gfx::SHARED_MEMORY_BUFFER: |
| 83 return false; | 71 return false; |
| 84 #if defined(OS_MACOSX) | |
| 85 case gfx::IO_SURFACE_BUFFER: | 72 case gfx::IO_SURFACE_BUFFER: |
| 86 return GpuMemoryBufferFactoryIOSurface:: | |
| 87 IsGpuMemoryBufferConfigurationSupported(format, usage); | |
| 88 #endif | |
| 89 #if defined(OS_ANDROID) | |
| 90 case gfx::SURFACE_TEXTURE_BUFFER: | 73 case gfx::SURFACE_TEXTURE_BUFFER: |
| 91 return GpuMemoryBufferFactorySurfaceTexture:: | |
| 92 IsGpuMemoryBufferConfigurationSupported(format, usage); | |
| 93 #endif | |
| 94 #if defined(USE_OZONE) | |
| 95 case gfx::OZONE_NATIVE_PIXMAP: | 74 case gfx::OZONE_NATIVE_PIXMAP: |
| 96 return GpuMemoryBufferFactoryOzoneNativePixmap:: | 75 return gpu::IsNativeGpuMemoryBufferConfigurationSupported(format, usage); |
| 97 IsGpuMemoryBufferConfigurationSupported(format, usage); | |
| 98 #endif | |
| 99 default: | 76 default: |
| 100 NOTREACHED(); | 77 NOTREACHED(); |
| 101 return false; | 78 return false; |
| 102 } | 79 } |
| 103 } | 80 } |
| 104 | 81 |
| 105 GpuMemoryBufferConfigurationSet GetNativeGpuMemoryBufferConfigurations() { | 82 GpuMemoryBufferConfigurationSet GetNativeGpuMemoryBufferConfigurations() { |
| 106 GpuMemoryBufferConfigurationSet configurations; | 83 GpuMemoryBufferConfigurationSet configurations; |
| 107 | 84 |
| 108 if (BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBuffersEnabled()) { | 85 if (BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBuffersEnabled()) { |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 uint32_t BrowserGpuMemoryBufferManager::GetImageTextureTarget( | 209 uint32_t BrowserGpuMemoryBufferManager::GetImageTextureTarget( |
| 233 gfx::BufferFormat format, | 210 gfx::BufferFormat format, |
| 234 gfx::BufferUsage usage) { | 211 gfx::BufferUsage usage) { |
| 235 GpuMemoryBufferConfigurationSet native_configurations = | 212 GpuMemoryBufferConfigurationSet native_configurations = |
| 236 GetNativeGpuMemoryBufferConfigurations(); | 213 GetNativeGpuMemoryBufferConfigurations(); |
| 237 if (native_configurations.find(std::make_pair(format, usage)) == | 214 if (native_configurations.find(std::make_pair(format, usage)) == |
| 238 native_configurations.end()) { | 215 native_configurations.end()) { |
| 239 return GL_TEXTURE_2D; | 216 return GL_TEXTURE_2D; |
| 240 } | 217 } |
| 241 | 218 |
| 242 switch (GpuMemoryBufferFactory::GetNativeType()) { | 219 switch (gpu::GetNativeGpuMemoryBufferType()) { |
| 243 case gfx::SURFACE_TEXTURE_BUFFER: | 220 case gfx::SURFACE_TEXTURE_BUFFER: |
| 244 case gfx::OZONE_NATIVE_PIXMAP: | 221 case gfx::OZONE_NATIVE_PIXMAP: |
| 245 // GPU memory buffers that are shared with the GL using EGLImages | 222 // GPU memory buffers that are shared with the GL using EGLImages |
| 246 // require TEXTURE_EXTERNAL_OES. | 223 // require TEXTURE_EXTERNAL_OES. |
| 247 return GL_TEXTURE_EXTERNAL_OES; | 224 return GL_TEXTURE_EXTERNAL_OES; |
| 248 case gfx::IO_SURFACE_BUFFER: | 225 case gfx::IO_SURFACE_BUFFER: |
| 249 // IOSurface backed images require GL_TEXTURE_RECTANGLE_ARB. | 226 // IOSurface backed images require GL_TEXTURE_RECTANGLE_ARB. |
| 250 return GL_TEXTURE_RECTANGLE_ARB; | 227 return GL_TEXTURE_RECTANGLE_ARB; |
| 251 case gfx::SHARED_MEMORY_BUFFER: | 228 case gfx::SHARED_MEMORY_BUFFER: |
| 252 return GL_TEXTURE_2D; | 229 return GL_TEXTURE_2D; |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 | 487 |
| 511 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO( | 488 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO( |
| 512 CreateGpuMemoryBufferFromHandleRequest* request) { | 489 CreateGpuMemoryBufferFromHandleRequest* request) { |
| 513 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 490 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 514 | 491 |
| 515 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); | 492 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId(); |
| 516 | 493 |
| 517 // Use service side allocation for native types. | 494 // Use service side allocation for native types. |
| 518 if (request->handle.type != gfx::SHARED_MEMORY_BUFFER) { | 495 if (request->handle.type != gfx::SHARED_MEMORY_BUFFER) { |
| 519 // Early out if service side allocation is not supported. | 496 // Early out if service side allocation is not supported. |
| 520 if (request->handle.type != GpuMemoryBufferFactory::GetNativeType() || | 497 if (request->handle.type != gpu::GetNativeGpuMemoryBufferType() || |
| 521 !IsNativeGpuMemoryBufferConfiguration(request->format, | 498 !IsNativeGpuMemoryBufferConfiguration(request->format, |
| 522 request->usage)) { | 499 request->usage)) { |
| 523 request->event.Signal(); | 500 request->event.Signal(); |
| 524 return; | 501 return; |
| 525 } | 502 } |
| 526 // Note: Unretained is safe as this is only used for synchronous allocation | 503 // Note: Unretained is safe as this is only used for synchronous allocation |
| 527 // from a non-IO thread. | 504 // from a non-IO thread. |
| 528 CreateGpuMemoryBufferOnIO( | 505 CreateGpuMemoryBufferOnIO( |
| 529 base::Bind(&HostCreateGpuMemoryBufferFromHandle, request->handle), | 506 base::Bind(&HostCreateGpuMemoryBufferFromHandle, request->handle), |
| 530 new_id, request->size, request->format, request->usage, | 507 new_id, request->size, request->format, request->usage, |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 747 return gpu_client_tracing_id_; | 724 return gpu_client_tracing_id_; |
| 748 } | 725 } |
| 749 | 726 |
| 750 // In normal cases, |client_id| is a child process id, so we can perform | 727 // In normal cases, |client_id| is a child process id, so we can perform |
| 751 // the standard conversion. | 728 // the standard conversion. |
| 752 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( | 729 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( |
| 753 client_id); | 730 client_id); |
| 754 } | 731 } |
| 755 | 732 |
| 756 } // namespace content | 733 } // namespace content |
| OLD | NEW |