• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium OS 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 <memory>
6 
7 #include "egl_stuff.h"
8 #include "main.h"
9 #include "xlib_window.h"
10 
11 std::unique_ptr<GLInterface> g_main_gl_interface;
12 
13 GLInterface* GLInterface::Create() {
14   return new EGLInterface;
15 }
16 
17 bool EGLInterface::Init() {
18   if (!XlibInit())
19     return false;
20 
21   EGLNativeWindowType native_window =
22       static_cast<EGLNativeWindowType>(g_xlib_window);
23   surface_ = eglCreateWindowSurface(display_, config_, native_window, NULL);
24   CheckError();
25 
26   context_ = CreateContext();
27   CheckError();
28 
29   eglMakeCurrent(display_, surface_, surface_, context_);
30   CheckError();
31 
32   eglQuerySurface(display_, surface_, EGL_WIDTH, &g_width);
33   eglQuerySurface(display_, surface_, EGL_HEIGHT, &g_height);
34 
35   return true;
36 }
37 
38 void EGLInterface::Cleanup() {
39   eglMakeCurrent(display_, NULL, NULL, NULL);
40   DeleteContext(context_);
41   eglDestroySurface(display_, surface_);
42 }
43 
44 XVisualInfo* EGLInterface::GetXVisual() {
45   if (!config_) {
46     EGLint attribs[] = {
47       EGL_RED_SIZE, 1,
48       EGL_GREEN_SIZE, 1,
49       EGL_BLUE_SIZE, 1,
50       EGL_DEPTH_SIZE, 1,
51       EGL_STENCIL_SIZE, 1,
52       EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
53       EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
54       EGL_NONE};
55 
56     EGLNativeDisplayType native_display =
57         static_cast<EGLNativeDisplayType>(g_xlib_display);
58 
59     display_ = eglGetDisplay(native_display);
60     CheckError();
61 
62     eglInitialize(display_, NULL, NULL);
63     CheckError();
64 
65     EGLint num_configs = -1;
66     eglGetConfigs(display_, NULL, 0, &num_configs);
67     CheckError();
68 
69     eglChooseConfig(display_, attribs, &config_, 1, &num_configs);
70     CheckError();
71   }
72 
73 // TODO: for some reason on some systems EGL_NATIVE_VISUAL_ID returns an ID
74 // that XVisualIDFromVisual cannot find.  Use default visual until this is
75 // resolved.
76 #if 0
77   EGLint visual_id;
78   eglGetConfigAttrib(display_, config_, EGL_NATIVE_VISUAL_ID, &visual_id);
79   CheckError();
80   XVisualInfo vinfo_template;
81   vinfo_template.visualid = static_cast<VisualID>(visual_id);
82 #else
83   XVisualInfo vinfo_template;
84   vinfo_template.visualid = XVisualIDFromVisual(
85       DefaultVisual(g_xlib_display, DefaultScreen(g_xlib_display)));
86 #endif
87 
88   int nitems = 0;
89   XVisualInfo* ret =
90       XGetVisualInfo(g_xlib_display, VisualIDMask, &vinfo_template, &nitems);
91   CHECK(nitems == 1);
92   return ret;
93 }
94 
95 void EGLInterface::SwapBuffers() {
96   eglSwapBuffers(display_, surface_);
97 }
98 
99 bool EGLInterface::SwapInterval(int interval) {
100   return (eglSwapInterval(display_, interval) == EGL_TRUE);
101 }
102 
103 bool EGLInterface::MakeCurrent(const GLContext& context) {
104   return eglMakeCurrent(display_, surface_, surface_, context);
105 }
106 
107 const GLContext EGLInterface::CreateContext() {
108   EGLint attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
109   CHECK(display_ != EGL_NO_DISPLAY);
110   CHECK(config_);
111   return eglCreateContext(display_, config_, NULL, attribs);
112 }
113 
114 void EGLInterface::CheckError() {
115   CHECK_EQ(eglGetError(), EGL_SUCCESS);
116 }
117 
118 void EGLInterface::DeleteContext(const GLContext& context) {
119   eglDestroyContext(display_, context);
120 }
121 
122 void EGLInterface::TerminateGL() {
123   eglDestroySurface(display_, surface_);
124   eglTerminate(display_);
125 }
126