1 /* Copyright © 2013, Intel Corporation
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 /* Perform some simple drawing via OpenGL as follows:
24 * 1. Using GLX to construct an OpenGL context
25 * 2. By directly linking with libGL.so
26 * 3. By using glXGetProcAddress to lookup OpenGL functions
29 #define GL_GLEXT_PROTOTYPES
38 /* The OpenGL header files give typedefs for the types of all
39 * functions provided by etensisons. Here, though, we're using
40 * glxGetProcAddress to lookup core functions, so we provide our own
42 typedef void (*FIPS_GLCLEAR_FN)(GLbitfield);
43 FIPS_GLCLEAR_FN my_glClear;
45 typedef void (*FIPS_GLCLEARCOLOR_FN)(GLclampf, GLclampf, GLclampf, GLclampf);
46 FIPS_GLCLEARCOLOR_FN my_glClearColor;
48 typedef void (*FIPS_GLVIEWPORT_FN)(GLint, GLint, GLsizei, GLsizei);
49 FIPS_GLVIEWPORT_FN my_glViewport;
51 typedef XVisualInfo* (*FIPS_GLXCHOOSEVISUAL_FN)(Display *, int, int *);
52 FIPS_GLXCHOOSEVISUAL_FN my_glXChooseVisual;
54 typedef GLXContext (*FIPS_GLXCREATECONTEXT_FN)(Display *, XVisualInfo *, GLXContext, Bool);
55 FIPS_GLXCREATECONTEXT_FN my_glXCreateContext;
57 typedef void (*FIPS_GLXDESTROYCONTEXT_FN)(Display *, GLXContext);
58 FIPS_GLXDESTROYCONTEXT_FN my_glXDestroyContext;
60 typedef Bool (*FIPS_GLXMAKECURRENT_FN)(Display *, GLXDrawable, GLXContext);
61 FIPS_GLXMAKECURRENT_FN my_glXMakeCurrent;
63 typedef void (*FIPS_GLXSWAPBUFFERS_FN)(Display *, GLXDrawable);
64 FIPS_GLXSWAPBUFFERS_FN my_glXSwapBuffers;
66 #define COMMON_GL_PREFIX my_
70 resolve_symbols (void)
72 my_glClear = (FIPS_GLCLEAR_FN) glXGetProcAddress ((GLubyte*) "glClear");
73 if (my_glClear == NULL) {
74 fprintf (stderr, "Failed to glXGetProcAddress glClear\n");
78 my_glClearColor = (FIPS_GLCLEARCOLOR_FN) glXGetProcAddress ((GLubyte*) "glClearColor");
79 if (my_glClearColor == NULL) {
80 fprintf (stderr, "Failed to glXGetProcAddress glClearColor\n");
84 my_glViewport = (FIPS_GLVIEWPORT_FN) glXGetProcAddress ((GLubyte*) "glViewport");
85 if (my_glViewport == NULL) {
86 fprintf (stderr, "Failed to glXGetProcAddress glViewport\n");
90 my_glXChooseVisual = (FIPS_GLXCHOOSEVISUAL_FN) glXGetProcAddress ((GLubyte*) "glXChooseVisual");
91 if (my_glXChooseVisual == NULL) {
92 fprintf (stderr, "Failed to glXGetProcAddress glXChooseVisual\n");
96 my_glXCreateContext = (FIPS_GLXCREATECONTEXT_FN) glXGetProcAddress ((GLubyte*) "glXCreateContext");
97 if (my_glXCreateContext == NULL) {
98 fprintf (stderr, "Failed to glXGetProcAddress glXCreateContext\n");
102 my_glXDestroyContext = (FIPS_GLXDESTROYCONTEXT_FN) glXGetProcAddress ((GLubyte*) "glXDestroyContext");
103 if (my_glXDestroyContext == NULL) {
104 fprintf (stderr, "Failed to glXGetProcAddress glXDestroyContext\n");
108 my_glXMakeCurrent = (FIPS_GLXMAKECURRENT_FN) glXGetProcAddress ((GLubyte*) "glXMakeCurrent");
109 if (my_glXMakeCurrent == NULL) {
110 fprintf (stderr, "Failed to glXGetProcAddress glXMakeCurrent\n");
114 my_glXSwapBuffers = (FIPS_GLXSWAPBUFFERS_FN) glXGetProcAddress ((GLubyte*) "glXSwapBuffers");
115 if (my_glXSwapBuffers == NULL) {
116 fprintf (stderr, "Failed to glXGetProcAddress glXSwapBuffers\n");
127 XVisualInfo *visual_info;
131 dpy = util_x11_init_display ();
133 common_create_glx_context (dpy, &ctx, &visual_info);
135 window = util_x11_init_window (dpy, visual_info);
137 common_make_current (dpy, ctx, window);
139 common_handle_events (dpy, dpy, window);
141 util_x11_fini_window (dpy, window);
143 util_x11_fini_display (dpy);