2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * This program opens two GLX windows, renders into one and uses
28 * glCopyPixels to copy the image from the first window into the
29 * second by means of the GLX 1.3 function glxMakeContextCurrent().
30 * This function works just like the glXMakeCurrentReadSGI() function
31 * in the GLX_SGI_make_current_read extension.
35 #define GL_GLEXT_PROTOTYPES
36 #define GLX_GLXEXT_PROTOTYPES
39 #include <X11/keysym.h>
46 #ifdef GLX_VERSION_1_3
51 static GLXContext Context
;
52 static Window Win
[2]; /* Win[0] = source, Win[1] = dest */
53 static GLint Width
[2], Height
[2];
54 static GLboolean TestClipping
= GL_FALSE
;
55 static GLfloat Angle
= 0.0;
57 static GLboolean DrawFront
= GL_FALSE
;
59 PFNGLXMAKECURRENTREADSGIPROC make_context_current
= NULL
;
62 CreateWindow(Display
*dpy
, int scrnum
, XVisualInfo
*visinfo
,
63 int xpos
, int ypos
, int width
, int height
,
67 XSetWindowAttributes attr
;
71 root
= RootWindow(dpy
, scrnum
);
73 /* window attributes */
74 attr
.background_pixel
= 0;
75 attr
.border_pixel
= 0;
76 attr
.colormap
= XCreateColormap(dpy
, root
, visinfo
->visual
, AllocNone
);
77 attr
.event_mask
= StructureNotifyMask
| ExposureMask
| KeyPressMask
;
78 mask
= CWBackPixel
| CWBorderPixel
| CWColormap
| CWEventMask
;
80 win
= XCreateWindow(dpy
, root
, xpos
, ypos
, width
, height
,
81 0, visinfo
->depth
, InputOutput
,
82 visinfo
->visual
, mask
, &attr
);
87 sizehints
.width
= width
;
88 sizehints
.height
= height
;
89 sizehints
.flags
= USSize
| USPosition
;
90 XSetNormalHints(dpy
, win
, &sizehints
);
91 XSetStandardProperties(dpy
, win
, name
, name
,
92 None
, (char **)NULL
, 0, &sizehints
);
103 /* make the first window the current one */
104 if (! (*make_context_current
)(Dpy
, Win
[0], Win
[0], Context
)) {
105 printf("glXMakeContextCurrent failed in Redraw()\n");
112 glDrawBuffer(GL_FRONT
);
113 glReadBuffer(GL_FRONT
);
116 glDrawBuffer(GL_BACK
);
117 glReadBuffer(GL_BACK
);
120 glViewport(0, 0, Width
[0], Height
[0]);
121 glMatrixMode(GL_PROJECTION
);
123 glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
124 glMatrixMode(GL_MODELVIEW
);
126 glShadeModel(GL_FLAT
);
127 glClearColor(0.5, 0.5, 0.5, 0.0);
128 glClear(GL_COLOR_BUFFER_BIT
);
131 glColor3f(0.3, 0.3, 1.0);
133 glRotatef(Angle
, 0, 0, 1);
135 glVertex2f(-0.5, -0.25);
136 glVertex2f( 0.5, -0.25);
137 glVertex2f( 0.5, 0.25);
138 glVertex2f(-0.5, 0.25);
145 glXSwapBuffers(Dpy
, Win
[0]);
148 /* copy image from window 0 to window 1 */
149 if (!(*make_context_current
)(Dpy
, Win
[1], Win
[0], Context
)) {
150 printf("glXMakeContextCurrent failed in Redraw()\n");
154 /* copy the image between windows */
155 glClearColor(0.0, 0.0, 0.0, 0.0);
156 glClear(GL_COLOR_BUFFER_BIT
);
159 glWindowPos2iARB(-2, -2);
160 glCopyPixels(-2, -2, Width
[0] + 4, Height
[0] + 4, GL_COLOR
);
163 glWindowPos2iARB(0, 0);
164 glCopyPixels(0, 0, Width
[0], Height
[0], GL_COLOR
);
170 glXSwapBuffers(Dpy
, Win
[1]);
176 Resize(Window win
, unsigned int width
, unsigned int height
)
187 if (!glXMakeCurrent(Dpy
, Win
[i
], Context
)) {
188 printf("glXMakeCurrent failed in Resize()\n");
200 if (XPending(Dpy
) > 0) {
201 XNextEvent( Dpy
, &event
);
202 switch (event
.type
) {
206 case ConfigureNotify
:
207 Resize(event
.xany
.window
, event
.xconfigure
.width
, event
.xconfigure
.height
);
214 XLookupString(&event
.xkey
, buf
, sizeof(buf
), &keySym
, &stat
);
215 if (keySym
== XK_Escape
) {
219 else if (buf
[0] == 'f') {
220 DrawFront
= !DrawFront
;
221 printf("Drawing to %s buffer\n",
222 DrawFront
? "GL_FRONT" : "GL_BACK");
241 XVisualInfo
*visinfo
;
242 int attrib
[] = { GLX_RGBA
,
250 Dpy
= XOpenDisplay(NULL
);
252 printf("Couldn't open default display!\n");
256 ScrNum
= DefaultScreen(Dpy
);
258 glXQueryVersion(Dpy
, &major
, &minor
);
260 if (major
* 100 + minor
>= 103) {
261 make_context_current
= (PFNGLXMAKECURRENTREADSGIPROC
)
262 glXGetProcAddressARB( (GLubyte
*) "glXMakeContextCurrent" );
265 const char * const glxExtensions
= glXQueryExtensionsString(Dpy
, ScrNum
);
266 const char * ext
= strstr( glxExtensions
, "GLX_SGI_make_current_read" );
267 const size_t len
= strlen( "GLX_SGI_make_current_read" );
270 && ((ext
[len
] == ' ') || (ext
[len
] == '\0')) ) {
271 make_context_current
= (PFNGLXMAKECURRENTREADSGIPROC
)
272 glXGetProcAddressARB( (GLubyte
*) "glXMakeCurrentReadSGI" );
276 if (make_context_current
== NULL
) {
277 fprintf(stderr
, "Sorry, this program requires either GLX 1.3 "
278 "or GLX_SGI_make_current_read.\n");
282 visinfo
= glXChooseVisual(Dpy
, ScrNum
, attrib
);
284 printf("Unable to find RGB, double-buffered visual\n");
288 Context
= glXCreateContext(Dpy
, visinfo
, NULL
, True
);
290 printf("Couldn't create GLX context\n");
295 Win
[0] = CreateWindow(Dpy
, ScrNum
, visinfo
,
296 0, 0, 300, 300, "source window");
298 Win
[1] = CreateWindow(Dpy
, ScrNum
, visinfo
,
299 350, 0, 300, 300, "dest window");
301 printf("Press Esc to exit\n");
302 printf("Press 'f' to toggle front/back buffer drawing\n");
307 main(int argc
, char *argv
[])
309 if (argc
> 1 && strcmp(argv
[1], "-clip") == 0)
310 TestClipping
= GL_TRUE
;
321 main(int argc
, char *argv
[])
323 printf("This program requires GLX 1.3!\n");
328 #endif /* GLX_VERSION_1_3 */