Home | History | Annotate | Download | only in src
      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