| 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..eadc34f07a196d298f11be321b339b1b4c26dd81 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:
|
|
|