• 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 
Create()13 GLInterface* GLInterface::Create() {
14   return new EGLInterface;
15 }
16 
Init()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 
Cleanup()38 void EGLInterface::Cleanup() {
39   eglMakeCurrent(display_, NULL, NULL, NULL);
40   DeleteContext(context_);
41   eglDestroySurface(display_, surface_);
42 }
43 
GetXVisual()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 
57     EGLNativeDisplayType native_display =
58       static_cast<EGLNativeDisplayType>(g_xlib_display);
59 
60     display_ = eglGetDisplay(native_display);
61     CheckError();
62 
63     eglInitialize(display_, NULL, NULL);
64     CheckError();
65 
66     EGLint num_configs = -1;
67     eglGetConfigs(display_, NULL, 0, &num_configs);
68     CheckError();
69 
70     eglChooseConfig(display_, attribs, &config_, 1, &num_configs);
71     CheckError();
72   }
73 
74   // TODO: for some reason on some systems EGL_NATIVE_VISUAL_ID returns an ID
75   // that XVisualIDFromVisual cannot find.  Use default visual until this is
76   // resolved.
77 #if 0
78   EGLint visual_id;
79   eglGetConfigAttrib(display_, config_, EGL_NATIVE_VISUAL_ID, &visual_id);
80   CheckError();
81   XVisualInfo vinfo_template;
82   vinfo_template.visualid = static_cast<VisualID>(visual_id);
83 #else
84   XVisualInfo vinfo_template;
85   vinfo_template.visualid = XVisualIDFromVisual(DefaultVisual(
86       g_xlib_display, DefaultScreen(g_xlib_display)));
87 #endif
88 
89   int nitems = 0;
90   XVisualInfo* ret = XGetVisualInfo(g_xlib_display, VisualIDMask,
91                                     &vinfo_template, &nitems);
92   CHECK(nitems == 1);
93   return ret;
94 }
95 
SwapBuffers()96 void EGLInterface::SwapBuffers() {
97   eglSwapBuffers(display_, surface_);
98 }
99 
SwapInterval(int interval)100 bool EGLInterface::SwapInterval(int interval) {
101   return (eglSwapInterval(display_, interval) == EGL_TRUE);
102 }
103 
MakeCurrent(const GLContext & context)104 bool EGLInterface::MakeCurrent(const GLContext& context) {
105   return eglMakeCurrent(display_, surface_, surface_, context);
106 }
107 
CreateContext()108 const GLContext EGLInterface::CreateContext() {
109   EGLint attribs[] = {
110     EGL_CONTEXT_CLIENT_VERSION, 2,
111     EGL_NONE
112   };
113   CHECK(display_ != EGL_NO_DISPLAY);
114   CHECK(config_);
115   return eglCreateContext(display_, config_, NULL, attribs);
116 }
117 
CheckError()118 void EGLInterface::CheckError() {
119   CHECK_EQ(eglGetError(), EGL_SUCCESS);
120 }
121 
DeleteContext(const GLContext & context)122 void EGLInterface::DeleteContext(const GLContext& context) {
123   eglDestroyContext(display_, context);
124 }
125 
TerminateGL()126 void EGLInterface::TerminateGL() {
127   eglDestroySurface(display_, surface_);
128   eglTerminate(display_);
129 }
130