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