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