Home | History | Annotate | Download | only in service
      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