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
16namespace gfx {
17
18// static
19bool 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
33scoped_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
56scoped_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
86EGLNativeDisplayType GetPlatformDefaultEGLNativeDisplay() {
87  return EGL_DEFAULT_DISPLAY;
88}
89
90}  // namespace gfx
91