Chromium Code Reviews| Index: gpu/command_buffer/service/async_pixel_transfer_manager_android.cc |
| diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc |
| index ba1ad2e41936d65636c4801e5a86c8bf8c9644ff..7782840e292d786ec9ceee45967c2cd37cbb977c 100644 |
| --- a/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc |
| +++ b/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc |
| @@ -16,26 +16,39 @@ |
| namespace gpu { |
| namespace { |
| -bool IsBroadcom() { |
| - const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); |
| - if (vendor) |
| - return std::string(vendor).find("Broadcom") != std::string::npos; |
| - return false; |
| -} |
| +enum GpuType { |
| + GPU_BROADCOM, |
| + GPU_IMAGINATION, |
| + GPU_NVIDIA_ES31, |
| + GPU_ADRENO_420, |
| + GPU_OTHER, |
| +}; |
| -bool IsImagination() { |
| - const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); |
| - if (vendor) |
| - return std::string(vendor).find("Imagination") != std::string::npos; |
| - return false; |
| -} |
| +GpuType GetGpuType() { |
| + const std::string vendor( |
| + reinterpret_cast<const char*>(glGetString(GL_VENDOR))); |
| + const std::string renderer( |
| + reinterpret_cast<const char*>(glGetString(GL_RENDERER))); |
| + const std::string version( |
| + reinterpret_cast<const char*>(glGetString(GL_VERSION))); |
| + |
| + if (vendor.find("Broadcom") != std::string::npos) |
| + return GPU_BROADCOM; |
| + |
| + if (vendor.find("Imagination") != std::string::npos) |
| + return GPU_IMAGINATION; |
| + |
| + if (vendor.find("NVIDIA") != std::string::npos && |
| + version.find("OpenGL ES 3.1") != std::string::npos) { |
| + return GPU_NVIDIA_ES31; |
| + } |
| + |
| + if (vendor.find("Qualcomm") != std::string::npos && |
| + renderer.find("Adreno (TM) 420") != std::string::npos) { |
| + return GPU_ADRENO_420; |
| + } |
| -bool IsNvidia31() { |
| - const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); |
| - const char* version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); |
| - return vendor && version && |
| - std::string(vendor).find("NVIDIA") != std::string::npos && |
| - std::string(version).find("OpenGL ES 3.1") != std::string::npos; |
| + return GPU_OTHER; |
| } |
| } |
| @@ -51,19 +64,22 @@ bool IsNvidia31() { |
| // resolution of crbug.com/271929 |
| AsyncPixelTransferManager* AsyncPixelTransferManager::Create( |
| gfx::GLContext* context) { |
| - TRACE_EVENT0("gpu", "AsyncPixelTransferManager::Create"); |
| + DCHECK(context->IsCurrent(NULL)); |
| + GpuType gpu = GetGpuType(); |
|
epennerAtGoogle
2014/09/16 00:07:15
This will likely fail some unit tests. They are ve
|
| + TRACE_EVENT1("gpu", "AsyncPixelTransferManager::Create", "type", gpu); |
| switch (gfx::GetGLImplementation()) { |
| case gfx::kGLImplementationEGLGLES2: |
| DCHECK(context); |
| - if (context->HasExtension("EGL_KHR_fence_sync") && |
| + if (!base::SysInfo::IsLowEndDevice() && |
| + context->HasExtension("EGL_KHR_fence_sync") && |
| context->HasExtension("EGL_KHR_image") && |
| context->HasExtension("EGL_KHR_image_base") && |
| context->HasExtension("EGL_KHR_gl_texture_2D_image") && |
| context->HasExtension("GL_OES_EGL_image") && |
| - !IsBroadcom() && |
| - !IsImagination() && |
| - !IsNvidia31() && |
| - !base::SysInfo::IsLowEndDevice()) { |
| + gpu != GPU_BROADCOM && |
| + gpu != GPU_IMAGINATION && |
| + gpu != GPU_NVIDIA_ES31 && |
| + gpu != GPU_ADRENO_420) { |
| return new AsyncPixelTransferManagerEGL; |
| } |
| return new AsyncPixelTransferManagerIdle; |