1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 
26 /*
27  * Mesa/X11 interface.  This header file serves as the documentation for
28  * the Mesa/X11 interface functions.
29  *
30  * Note: this interface isn't intended for user programs.  It's primarily
31  * just for implementing the pseudo-GLX interface.
32  */
33 
34 
35 /* Sample Usage:
36 
37 In addition to the usual X calls to select a visual, create a colormap
38 and create a window, you must do the following to use the X/Mesa interface:
39 
40 1. Call XMesaCreateVisual() to make an XMesaVisual from an XVisualInfo.
41 
42 2. Call XMesaCreateContext() to create an X/Mesa rendering context, given
43    the XMesaVisual.
44 
45 3. Call XMesaCreateWindowBuffer() to create an XMesaBuffer from an X window
46    and XMesaVisual.
47 
48 4. Call XMesaMakeCurrent() to bind the XMesaBuffer to an XMesaContext and
49    to make the context the current one.
50 
51 5. Make gl* calls to render your graphics.
52 
53 6. Use XMesaSwapBuffers() when double buffering to swap front/back buffers.
54 
55 7. Before the X window is destroyed, call XMesaDestroyBuffer().
56 
57 8. Before exiting, call XMesaDestroyVisual and XMesaDestroyContext.
58 
59 */
60 
61 
62 
63 
64 #ifndef XMESA_H
65 #define XMESA_H
66 
67 #include <X11/Xlib.h>
68 #include <X11/Xutil.h>
69 #include "xmesa_x.h"
70 #include "GL/gl.h"
71 
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75 
76 #define XMESA_MAJOR_VERSION 6
77 #define XMESA_MINOR_VERSION 3
78 
79 
80 
81 /*
82  * Values passed to XMesaGetString:
83  */
84 #define XMESA_VERSION 1
85 #define XMESA_EXTENSIONS 2
86 
87 
88 typedef struct xmesa_context *XMesaContext;
89 
90 typedef struct xmesa_visual *XMesaVisual;
91 
92 typedef struct xmesa_buffer *XMesaBuffer;
93 
94 
95 
96 /*
97  * Create a new X/Mesa visual.
98  * Input:  display - X11 display
99  *         visinfo - an XVisualInfo pointer
100  *         rgb_flag - GL_TRUE = RGB mode,
101  *                    GL_FALSE = color index mode
102  *         alpha_flag - alpha buffer requested?
103  *         db_flag - GL_TRUE = double-buffered,
104  *                   GL_FALSE = single buffered
105  *         stereo_flag - stereo visual?
106  *         ximage_flag - GL_TRUE = use an XImage for back buffer,
107  *                       GL_FALSE = use an off-screen pixmap for back buffer
108  *         depth_size - requested bits/depth values, or zero
109  *         stencil_size - requested bits/stencil values, or zero
110  *         accum_red_size - requested bits/red accum values, or zero
111  *         accum_green_size - requested bits/green accum values, or zero
112  *         accum_blue_size - requested bits/blue accum values, or zero
113  *         accum_alpha_size - requested bits/alpha accum values, or zero
114  *         num_samples - number of samples/pixel if multisampling, or zero
115  *         level - visual level, usually 0
116  *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
117  * Return;  a new XMesaVisual or 0 if error.
118  */
119 extern XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
120                                       XMesaVisualInfo visinfo,
121                                       GLboolean rgb_flag,
122                                       GLboolean alpha_flag,
123                                       GLboolean db_flag,
124                                       GLboolean stereo_flag,
125                                       GLboolean ximage_flag,
126                                       GLint depth_size,
127                                       GLint stencil_size,
128                                       GLint accum_red_size,
129                                       GLint accum_green_size,
130                                       GLint accum_blue_size,
131                                       GLint accum_alpha_size,
132                                       GLint num_samples,
133                                       GLint level,
134                                       GLint visualCaveat );
135 
136 /*
137  * Destroy an XMesaVisual, but not the associated XVisualInfo.
138  */
139 extern void XMesaDestroyVisual( XMesaVisual v );
140 
141 
142 
143 /*
144  * Create a new XMesaContext for rendering into an X11 window.
145  *
146  * Input:  visual - an XMesaVisual
147  *         share_list - another XMesaContext with which to share display
148  *                      lists or NULL if no sharing is wanted.
149  * Return:  an XMesaContext or NULL if error.
150  */
151 extern XMesaContext XMesaCreateContext( XMesaVisual v,
152 					XMesaContext share_list );
153 
154 
155 /*
156  * Destroy a rendering context as returned by XMesaCreateContext()
157  */
158 extern void XMesaDestroyContext( XMesaContext c );
159 
160 
161 
162 
163 /*
164  * Create an XMesaBuffer from an X window.
165  */
166 extern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w );
167 
168 
169 /*
170  * Create an XMesaBuffer from an X pixmap.
171  */
172 extern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
173 					    XMesaPixmap p,
174 					    XMesaColormap cmap );
175 
176 
177 /*
178  * Destroy an XMesaBuffer, but not the corresponding window or pixmap.
179  */
180 extern void XMesaDestroyBuffer( XMesaBuffer b );
181 
182 
183 /*
184  * Return the XMesaBuffer handle which corresponds to an X drawable, if any.
185  *
186  * New in Mesa 2.3.
187  */
188 extern XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy,
189 				    XMesaDrawable d );
190 
191 
192 
193 /*
194  * Bind a buffer to a context and make the context the current one.
195  */
196 extern GLboolean XMesaMakeCurrent( XMesaContext c,
197 				   XMesaBuffer b );
198 
199 
200 /*
201  * Bind two buffers (read and draw) to a context and make the
202  * context the current one.
203  * New in Mesa 3.3
204  */
205 extern GLboolean XMesaMakeCurrent2( XMesaContext c,
206                                     XMesaBuffer drawBuffer,
207                                     XMesaBuffer readBuffer );
208 
209 
210 /*
211  * Unbind the current context from its buffer.
212  */
213 extern GLboolean XMesaUnbindContext( XMesaContext c );
214 
215 
216 /*
217  * Return a handle to the current context.
218  */
219 extern XMesaContext XMesaGetCurrentContext( void );
220 
221 
222 /*
223  * Return handle to the current (draw) buffer.
224  */
225 extern XMesaBuffer XMesaGetCurrentBuffer( void );
226 
227 
228 /*
229  * Return handle to the current read buffer.
230  * New in Mesa 3.3
231  */
232 extern XMesaBuffer XMesaGetCurrentReadBuffer( void );
233 
234 
235 /*
236  * Return display of current context.
237  */
238 extern Display *XMesaGetCurrentDisplay( void );
239 
240 
241 /*
242  * Swap the front and back buffers for the given buffer.  No action is
243  * taken if the buffer is not double buffered.
244  */
245 extern void XMesaSwapBuffers( XMesaBuffer b );
246 
247 
248 /*
249  * Copy a sub-region of the back buffer to the front buffer.
250  *
251  * New in Mesa 2.6
252  */
253 extern void XMesaCopySubBuffer( XMesaBuffer b,
254 				int x,
255 				int y,
256 				int width,
257 				int height );
258 
259 
260 /*
261  * Return a pointer to the Pixmap or XImage being used as the back
262  * color buffer of an XMesaBuffer.  This function is a way to get "under
263  * the hood" of X/Mesa so one can manipulate the back buffer directly.
264  * Input:  b - the XMesaBuffer
265  * Output:  pixmap - pointer to back buffer's Pixmap, or 0
266  *          ximage - pointer to back buffer's XImage, or NULL
267  * Return:  GL_TRUE = context is double buffered
268  *          GL_FALSE = context is single buffered
269  */
270 extern GLboolean XMesaGetBackBuffer( XMesaBuffer b,
271 				     XMesaPixmap *pixmap,
272 				     XMesaImage **ximage );
273 
274 
275 
276 /*
277  * Return the depth buffer associated with an XMesaBuffer.
278  * Input:  b - the XMesa buffer handle
279  * Output:  width, height - size of buffer in pixels
280  *          bytesPerValue - bytes per depth value (2 or 4)
281  *          buffer - pointer to depth buffer values
282  * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
283  *
284  * New in Mesa 2.4.
285  */
286 extern GLboolean XMesaGetDepthBuffer( XMesaBuffer b,
287 				      GLint *width,
288 				      GLint *height,
289 				      GLint *bytesPerValue,
290 				      void **buffer );
291 
292 
293 
294 /*
295  * Flush/sync a context
296  */
297 extern void XMesaFlush( XMesaContext c );
298 
299 
300 
301 /*
302  * Get an X/Mesa-specific string.
303  * Input:  name - either XMESA_VERSION or XMESA_EXTENSIONS
304  */
305 extern const char *XMesaGetString( XMesaContext c, int name );
306 
307 
308 
309 /*
310  * Scan for XMesaBuffers whose window/pixmap has been destroyed, then free
311  * any memory used by that buffer.
312  *
313  * New in Mesa 2.3.
314  */
315 extern void XMesaGarbageCollect( XMesaDisplay* dpy );
316 
317 
318 
319 /*
320  * Return a dithered pixel value.
321  * Input:  c - XMesaContext
322  *         x, y - window coordinate
323  *         red, green, blue, alpha - color components in [0,1]
324  * Return:  pixel value
325  *
326  * New in Mesa 2.3.
327  */
328 extern unsigned long XMesaDitherColor( XMesaContext xmesa,
329 				       GLint x,
330 				       GLint y,
331 				       GLfloat red,
332 				       GLfloat green,
333 				       GLfloat blue,
334 				       GLfloat alpha );
335 
336 
337 
338 /*
339  * Reallocate the back/depth/stencil/accum/etc/ buffers associated with
340  * buffer <b> if its size has changed.
341  *
342  * New in Mesa 4.0.2
343  */
344 extern void XMesaResizeBuffers( XMesaBuffer b );
345 
346 
347 
348 /*
349  * Create a pbuffer.
350  * New in Mesa 4.1
351  */
352 extern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
353                                       unsigned int width, unsigned int height);
354 
355 
356 
357 /*
358  * Texture from Pixmap
359  * New in Mesa 7.1
360  */
361 extern void
362 XMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer,
363                   const int *attrib_list);
364 
365 extern void
366 XMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer);
367 
368 
369 extern XMesaBuffer
370 XMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p,
371                                XMesaColormap cmap,
372                                int format, int target, int mipmap);
373 
374 
375 
376 #ifdef __cplusplus
377 }
378 #endif
379 
380 
381 #endif
382