1 /**************************************************************************
2 * Copyright 2012 Intel corporation
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 **************************************************************************/
41 set_2d_projection (void)
43 glMatrixMode (GL_PROJECTION);
45 glOrtho (0, width, height, 0, 0, 1);
46 glMatrixMode (GL_MODELVIEW);
50 draw_fullscreen_quad (void)
54 glVertex2f (width, 0);
55 glVertex2f (width, height);
56 glVertex2f (0, height);
61 draw_fullscreen_textured_quad (void)
64 glTexCoord2f(0, 0); glVertex2f (0, 0);
65 glTexCoord2f(1, 0); glVertex2f (width, 0);
66 glTexCoord2f(1, 1); glVertex2f (width, height);
67 glTexCoord2f(0, 1); glVertex2f (0, height);
72 paint_rgb_using_clear (double r, double g, double b)
74 glClearColor(r, g, b, 1.0);
75 glClear(GL_COLOR_BUFFER_BIT);
79 paint_rgb_using_glsl (double r, double g, double b)
81 const char * vs_source =
84 " gl_Position = ftransform();\n"
86 const char * fs_source =
88 "uniform vec4 color;\n"
91 " gl_FragColor = color;\n"
94 GLuint vs, fs, program;
97 vs = glCreateShader (GL_VERTEX_SHADER);
98 glShaderSource (vs, 1, &vs_source, NULL);
101 fs = glCreateShader (GL_FRAGMENT_SHADER);
102 glShaderSource (fs, 1, &fs_source, NULL);
103 glCompileShader (fs);
105 program = glCreateProgram ();
106 glAttachShader (program, vs);
107 glAttachShader (program, fs);
109 glLinkProgram (program);
110 glUseProgram (program);
112 color = glGetUniformLocation (program, "color");
114 glUniform4f (color, r, g, b, 1.0);
116 draw_fullscreen_quad ();
122 create_rgb_texture (double r, double g, double b)
127 data[0] = (uint8_t) (255.0 * r);
128 data[1] = (uint8_t) (255.0 * g);
129 data[2] = (uint8_t) (255.0 * b);
131 glGenTextures (1, &texture);
133 glBindTexture (GL_TEXTURE_2D, texture);
135 glTexImage2D (GL_TEXTURE_2D,
136 0, GL_COMPRESSED_RGBA,
138 GL_RGB, GL_UNSIGNED_BYTE, data);
144 paint_using_texture (GLuint texture)
146 glBindTexture (GL_TEXTURE_2D, texture);
148 glEnable (GL_TEXTURE_2D);
150 draw_fullscreen_textured_quad ();
152 glDisable (GL_TEXTURE_2D);
156 draw (Display *dpy, Window window, int width, int height)
161 GLuint texture[PASSES];
163 int visual_attr[] = {
172 GLX_X_VISUAL_TYPE, GLX_DIRECT_COLOR,
176 /* Window and context setup. */
177 XVisualInfo *visual_info = glXChooseVisual(dpy, 0, visual_attr);
178 GLXContext ctx = glXCreateContext(dpy, visual_info, NULL, True);
179 glXMakeCurrent(dpy, window, ctx);
181 glew_err = glewInit();
182 if (glew_err != GLEW_OK)
184 fprintf (stderr, "glewInit failed: %s\n",
185 glewGetErrorString(glew_err));
189 glViewport(0, 0, width, height);
191 set_2d_projection ();
193 /* Simply count through some colors, frame by frame. */
194 #define RGB(frame) (((frame+1)/4) % 2), (((frame+1)/2) % 2), ((frame+1) % 2)
197 for (i = 0; i < PASSES; i++) {
199 /* Frame: Draw a solid frame using glClear. */
200 paint_rgb_using_clear (RGB(frame));
201 glXSwapBuffers (dpy, window);
204 /* Frame: Draw a solid frame using GLSL. */
205 paint_rgb_using_glsl (RGB(frame));
206 glXSwapBuffers (dpy, window);
209 /* Frame: Draw a solid frame using a texture. */
210 texture[i] = create_rgb_texture (RGB(frame));
211 paint_using_texture (texture[i]);
212 glXSwapBuffers (dpy, window);
216 /* Draw another frame with a re-used texture. */
217 paint_using_texture (texture[0]);
218 glXSwapBuffers (dpy, window);
222 glXDestroyContext (dpy, ctx);
226 handle_events(Display *dpy, Window window, int width, int height)
229 KeyCode quit_code = XKeysymToKeycode (dpy, XStringToKeysym("Q"));
231 XNextEvent (dpy, &xev);
234 XNextEvent (dpy, &xev);
237 if (xev.xkey.keycode == quit_code) {
241 case ConfigureNotify:
242 width = xev.xconfigure.width;
243 height = xev.xconfigure.height;
246 if (xev.xexpose.count == 0) {
247 draw (dpy, window, width, height);
261 dpy = XOpenDisplay (NULL);
264 fprintf(stderr, "Failed to open display %s\n",
269 window = XCreateSimpleWindow(dpy, DefaultRootWindow (dpy),
270 0, 0, width, height, 0,
271 BlackPixel (dpy, DefaultScreen (dpy)),
272 BlackPixel (dpy, DefaultScreen (dpy)));
274 XSelectInput(dpy, window,
275 KeyPressMask | StructureNotifyMask | ExposureMask);
277 XMapWindow (dpy, window);
279 handle_events (dpy, window, width, height);
281 XDestroyWindow (dpy, window);