1 // Copyright 2014 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 "ui/gl/gl_surface.h" 6 7 #include "base/logging.h" 8 #include "base/memory/ref_counted.h" 9 #include "third_party/khronos/EGL/egl.h" 10 #include "ui/gfx/native_widget_types.h" 11 #include "ui/gl/gl_implementation.h" 12 #include "ui/gl/gl_surface_egl.h" 13 #include "ui/gl/gl_surface_osmesa.h" 14 #include "ui/gl/gl_surface_stub.h" 15 16 namespace gfx { 17 18 // static 19 bool GLSurface::InitializeOneOffInternal() { 20 switch (GetGLImplementation()) { 21 case kGLImplementationEGLGLES2: 22 if (!GLSurfaceEGL::InitializeOneOff()) { 23 LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; 24 return false; 25 } 26 default: 27 break; 28 } 29 return true; 30 } 31 32 // static 33 scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( 34 gfx::AcceleratedWidget window) { 35 CHECK_NE(kGLImplementationNone, GetGLImplementation()); 36 if (GetGLImplementation() == kGLImplementationOSMesaGL) { 37 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesaHeadless()); 38 if (!surface->Initialize()) 39 return NULL; 40 return surface; 41 } 42 DCHECK(GetGLImplementation() == kGLImplementationEGLGLES2); 43 if (window != kNullAcceleratedWidget) { 44 scoped_refptr<GLSurface> surface = new NativeViewGLSurfaceEGL(window); 45 if (surface->Initialize()) 46 return surface; 47 } else { 48 scoped_refptr<GLSurface> surface = new GLSurfaceStub(); 49 if (surface->Initialize()) 50 return surface; 51 } 52 return NULL; 53 } 54 55 // static 56 scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface( 57 const gfx::Size& size) { 58 CHECK_NE(kGLImplementationNone, GetGLImplementation()); 59 switch (GetGLImplementation()) { 60 case kGLImplementationOSMesaGL: { 61 scoped_refptr<GLSurface> surface(new GLSurfaceOSMesa(1, size)); 62 if (!surface->Initialize()) 63 return NULL; 64 65 return surface; 66 } 67 case kGLImplementationEGLGLES2: { 68 scoped_refptr<GLSurface> surface; 69 if (GLSurfaceEGL::IsEGLSurfacelessContextSupported() && 70 (size.width() == 0 && size.height() == 0)) { 71 surface = new SurfacelessEGL(size); 72 } else { 73 surface = new PbufferGLSurfaceEGL(size); 74 } 75 76 if (!surface->Initialize()) 77 return NULL; 78 return surface; 79 } 80 default: 81 NOTREACHED(); 82 return NULL; 83 } 84 } 85 86 EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() { 87 return EGL_DEFAULT_DISPLAY; 88 } 89 90 } // namespace gfx 91