diff options
author | sievers <sievers@chromium.org> | 2014-09-15 19:23:50 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-16 02:27:03 +0000 |
commit | b46831d14f773db39a3e90dc01281bff3c269649 (patch) | |
tree | 6ac11c53dff7dc9ffa47b27aa313c027cc9bc005 /gpu/command_buffer | |
parent | 87c58249f011d9d18a04cc135ba4bc7c460405ac (diff) | |
download | chromium_src-b46831d14f773db39a3e90dc01281bff3c269649.zip chromium_src-b46831d14f773db39a3e90dc01281bff3c269649.tar.gz chromium_src-b46831d14f773db39a3e90dc01281bff3c269649.tar.bz2 |
android: Disable transfer thread on Adreno 420
BUG=407184,386735
Review URL: https://codereview.chromium.org/564373006
Cr-Commit-Position: refs/heads/master@{#294983}
Diffstat (limited to 'gpu/command_buffer')
-rw-r--r-- | gpu/command_buffer/service/async_pixel_transfer_manager_android.cc | 70 |
1 files changed, 47 insertions, 23 deletions
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 ba1ad2e..eadc34f 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,49 @@ 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, +}; + +std::string MakeString(const char* s) { + return std::string(s ? s : ""); } -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 = MakeString( + reinterpret_cast<const char*>(glGetString(GL_VENDOR))); + const std::string renderer = MakeString( + reinterpret_cast<const char*>(glGetString(GL_RENDERER))); + const std::string version = MakeString( + 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; + } + + return GPU_OTHER; } -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; +bool AllowTransferThreadForGpu() { + GpuType gpu = GetGpuType(); + return gpu != GPU_BROADCOM && gpu != GPU_IMAGINATION && + gpu != GPU_NVIDIA_ES31 && gpu != GPU_ADRENO_420; } } @@ -51,24 +74,25 @@ bool IsNvidia31() { // resolution of crbug.com/271929 AsyncPixelTransferManager* AsyncPixelTransferManager::Create( gfx::GLContext* context) { - TRACE_EVENT0("gpu", "AsyncPixelTransferManager::Create"); + DCHECK(context->IsCurrent(NULL)); 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()) { + AllowTransferThreadForGpu()) { + TRACE_EVENT0("gpu", "AsyncPixelTransferManager_CreateWithThread"); return new AsyncPixelTransferManagerEGL; } return new AsyncPixelTransferManagerIdle; - case gfx::kGLImplementationOSMesaGL: + case gfx::kGLImplementationOSMesaGL: { + TRACE_EVENT0("gpu", "AsyncPixelTransferManager_CreateIdle"); return new AsyncPixelTransferManagerIdle; + } case gfx::kGLImplementationMockGL: return new AsyncPixelTransferManagerStub; default: |