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 paint_rgb_using_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);
140 glEnable (GL_TEXTURE_2D);
142 draw_fullscreen_textured_quad ();
144 glDisable (GL_TEXTURE_2D);
148 draw (Display *dpy, Window window, int width, int height)
152 int visual_attr[] = {
161 GLX_X_VISUAL_TYPE, GLX_DIRECT_COLOR,
165 /* Window and context setup. */
166 XVisualInfo *visual_info = glXChooseVisual(dpy, 0, visual_attr);
167 GLXContext ctx = glXCreateContext(dpy, visual_info, NULL, True);
168 glXMakeCurrent(dpy, window, ctx);
170 glew_err = glewInit();
171 if (glew_err != GLEW_OK)
173 fprintf (stderr, "glewInit failed: %s\n",
174 glewGetErrorString(glew_err));
178 glViewport(0, 0, width, height);
180 set_2d_projection ();
182 /* Frame 1: Draw a solid (magenta) frame using glClear. */
183 paint_rgb_using_clear (1, 0, 1);
184 glXSwapBuffers (dpy, window);
186 /* Frame 2: Draw a solid (yellow) frame using GLSL. */
187 paint_rgb_using_glsl (1, 1, 0);
188 glXSwapBuffers (dpy, window);
190 /* Frame 3: Draw a solid (cyan) frame using a texture. */
191 paint_rgb_using_texture (0, 1, 1);
192 glXSwapBuffers (dpy, window);
195 glXDestroyContext (dpy, ctx);
199 handle_events(Display *dpy, Window window, int width, int height)
202 KeyCode quit_code = XKeysymToKeycode (dpy, XStringToKeysym("Q"));
204 XNextEvent (dpy, &xev);
207 XNextEvent (dpy, &xev);
210 if (xev.xkey.keycode == quit_code) {
214 case ConfigureNotify:
215 width = xev.xconfigure.width;
216 height = xev.xconfigure.height;
219 if (xev.xexpose.count == 0) {
220 draw (dpy, window, width, height);
234 dpy = XOpenDisplay (NULL);
237 fprintf(stderr, "Failed to open display %s\n",
242 window = XCreateSimpleWindow(dpy, DefaultRootWindow (dpy),
243 0, 0, width, height, 0,
244 BlackPixel (dpy, DefaultScreen (dpy)),
245 BlackPixel (dpy, DefaultScreen (dpy)));
247 XSelectInput(dpy, window,
248 KeyPressMask | StructureNotifyMask | ExposureMask);
250 XMapWindow (dpy, window);
252 handle_events (dpy, window, width, height);
254 XDestroyWindow (dpy, window);