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