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 <stdio.h>
6
7#include <GL/gl.h>
8#include <GL/glx.h>
9
10#include <X11/Xlib.h>
11#include <X11/Xutil.h>
12
13#include <string>
14
15bool InitGraphics(Display** display,
16                  Window* window,
17                  GLXContext* context) {
18  const int kWindowWidth = 100;
19  const int kWindowHeight = 100;
20
21  *display = XOpenDisplay(NULL);
22  if (*display == NULL) {
23    printf("ERROR: XOpenDisplay failed\n");
24    return false;
25  }
26
27  Window root_window = DefaultRootWindow(*display);
28  GLint att[] = { GLX_RGBA,
29                  GLX_DEPTH_SIZE,
30                  24,
31                  None };
32  XVisualInfo* vi = glXChooseVisual(*display, 0, att);
33  if (vi == NULL) {
34    printf("ERROR: glXChooseVisual failed\n");
35    return false;
36  }
37
38  XSetWindowAttributes swa;
39  swa.colormap = XCreateColormap(*display,
40                                 root_window,
41                                 vi->visual,
42                                 AllocNone);
43  *window = XCreateWindow(*display, root_window,
44                          0, 0, kWindowWidth, kWindowHeight,
45                          0, vi->depth, InputOutput, vi->visual,
46                          CWColormap,
47                          &swa);
48  XMapWindow(*display, *window);
49
50  *context = glXCreateContext(*display, vi, NULL, GL_TRUE);
51  if (*context == NULL) {
52    printf("ERROR: glXCreateContext failed\n");
53  } else {
54    glXMakeCurrent(*display, *window, *context);
55  }
56
57  XFree(vi);
58  return (*context != NULL);
59}
60
61void ExitGraphics(Display* display,
62                  Window window,
63                  GLXContext context) {
64  if (display != NULL) {
65    glXMakeCurrent(display, None, NULL);
66    if (context != NULL)
67      glXDestroyContext(display, context);
68    XDestroyWindow(display, window);
69    XCloseDisplay(display);
70  }
71}
72
73bool GetGLVersion() {
74  const GLubyte* version_string = glGetString(GL_VERSION);
75  if (version_string == NULL) {
76    printf("ERROR: glGetString(GL_VERSION) failed\n");
77    return false;
78  }
79  printf("GL_VERSION = %s\n", version_string);
80  return true;
81}
82
83bool GetGLExtensions() {
84  const GLubyte* ext_string = glGetString(GL_EXTENSIONS);
85  if (ext_string == NULL) {
86    printf("ERROR: glGetString(GL_EXTENSIONS) failed\n");
87    return false;
88  }
89  printf("GL_EXTENSIONS = %s\n", ext_string);
90  return true;
91}
92
93bool GetGLXExtensions(Display* display) {
94  const char* ext_string = glXQueryExtensionsString(display, 0);
95  if (ext_string == NULL) {
96    printf("ERROR: glXQueryExtensionsString failed\n");
97    return false;
98  }
99  printf("GLX_EXTENSIONS = %s\n", ext_string);
100  return true;
101}
102
103bool GetXExtensions(Display* display) {
104  int ext_num;
105  char** ext_list = XListExtensions(display, &ext_num);
106  printf("X_EXTENSIONS =");
107  for (int i = 0; i < ext_num; ++i) {
108    printf(" %s", ext_list[i]);
109  }
110  printf("\n");
111  XFreeExtensionList(ext_list);
112  return true;
113}
114
115int main(int argc, char* argv[]) {
116  // Initialize graphics.
117  Display* display = NULL;
118  Window window = 0;
119  GLXContext context = NULL;
120  bool rt_code = InitGraphics(&display, &window, &context);
121
122  // Get OpenGL major/minor version number.
123  if (rt_code)
124    rt_code = GetGLVersion();
125
126  // Get OpenGL extentions.
127  if (rt_code)
128    rt_code = GetGLExtensions();
129
130  // Get GLX extensions.
131  if (rt_code)
132    rt_code = GetGLXExtensions(display);
133
134  // Get X11 extensions.
135  if (rt_code)
136    rt_code = GetXExtensions(display);
137
138  ExitGraphics(display, window, context);
139  printf("SUCCEED: run to the end\n");
140  return 0;
141}
142
143