1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" 6 7 #include "base/debug/trace_event.h" 8 #include "gpu/command_buffer/service/async_pixel_transfer_manager_egl.h" 9 #include "gpu/command_buffer/service/async_pixel_transfer_manager_idle.h" 10 #include "gpu/command_buffer/service/async_pixel_transfer_manager_stub.h" 11 #include "gpu/command_buffer/service/async_pixel_transfer_manager_sync.h" 12 #include "ui/gl/gl_context.h" 13 #include "ui/gl/gl_implementation.h" 14 15 namespace gpu { 16 namespace { 17 18 bool IsBroadcom() { 19 const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); 20 if (vendor) 21 return std::string(vendor).find("Broadcom") != std::string::npos; 22 return false; 23 } 24 25 bool IsImagination() { 26 const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); 27 if (vendor) 28 return std::string(vendor).find("Imagination") != std::string::npos; 29 return false; 30 } 31 32 } 33 34 // We only used threaded uploads when we can: 35 // - Create EGLImages out of OpenGL textures (EGL_KHR_gl_texture_2D_image) 36 // - Bind EGLImages to OpenGL textures (GL_OES_EGL_image) 37 // - Use fences (to test for upload completion). 38 // - The heap size is large enough. 39 // TODO(kaanb|epenner): Remove the IsImagination() check pending the 40 // resolution of crbug.com/249147 41 AsyncPixelTransferManager* AsyncPixelTransferManager::Create( 42 gfx::GLContext* context) { 43 TRACE_EVENT0("gpu", "AsyncPixelTransferManager::Create"); 44 switch (gfx::GetGLImplementation()) { 45 case gfx::kGLImplementationEGLGLES2: 46 DCHECK(context); 47 if (context->HasExtension("EGL_KHR_fence_sync") && 48 context->HasExtension("EGL_KHR_image") && 49 context->HasExtension("EGL_KHR_image_base") && 50 context->HasExtension("EGL_KHR_gl_texture_2D_image") && 51 context->HasExtension("GL_OES_EGL_image") && 52 !IsBroadcom() && 53 !IsImagination()) { 54 return new AsyncPixelTransferManagerEGL; 55 } 56 LOG(INFO) << "Async pixel transfers not supported"; 57 return new AsyncPixelTransferManagerIdle; 58 case gfx::kGLImplementationMockGL: 59 return new AsyncPixelTransferManagerStub; 60 default: 61 NOTREACHED(); 62 return NULL; 63 } 64 } 65 66 } // namespace gpu 67