1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the "Software"),
8848b8605Smrg * to deal in the Software without restriction, including without limitation
9848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
11848b8605Smrg * Software is furnished to do so, subject to the following conditions:
12848b8605Smrg *
13848b8605Smrg * The above copyright notice and this permission notice shall be included
14848b8605Smrg * in all copies or substantial portions of the Software.
15848b8605Smrg *
16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
23848b8605Smrg */
24848b8605Smrg
25848b8605Smrg
26848b8605Smrg/*
27848b8605Smrg * Mesa/X11 interface.  This header file serves as the documentation for
28848b8605Smrg * the Mesa/X11 interface functions.
29848b8605Smrg *
30848b8605Smrg * Note: this interface isn't intended for user programs.  It's primarily
31848b8605Smrg * just for implementing the pseudo-GLX interface.
32848b8605Smrg */
33848b8605Smrg
34848b8605Smrg
35848b8605Smrg/* Sample Usage:
36848b8605Smrg
37848b8605SmrgIn addition to the usual X calls to select a visual, create a colormap
38848b8605Smrgand create a window, you must do the following to use the X/Mesa interface:
39848b8605Smrg
40848b8605Smrg1. Call XMesaCreateVisual() to make an XMesaVisual from an XVisualInfo.
41848b8605Smrg
42848b8605Smrg2. Call XMesaCreateContext() to create an X/Mesa rendering context, given
43848b8605Smrg   the XMesaVisual.
44848b8605Smrg
45848b8605Smrg3. Call XMesaCreateWindowBuffer() to create an XMesaBuffer from an X window
46848b8605Smrg   and XMesaVisual.
47848b8605Smrg
48848b8605Smrg4. Call XMesaMakeCurrent() to bind the XMesaBuffer to an XMesaContext and
49848b8605Smrg   to make the context the current one.
50848b8605Smrg
51848b8605Smrg5. Make gl* calls to render your graphics.
52848b8605Smrg
53848b8605Smrg6. Use XMesaSwapBuffers() when double buffering to swap front/back buffers.
54848b8605Smrg
55848b8605Smrg7. Before the X window is destroyed, call XMesaDestroyBuffer().
56848b8605Smrg
57848b8605Smrg8. Before exiting, call XMesaDestroyVisual and XMesaDestroyContext.
58848b8605Smrg
59848b8605Smrg*/
60848b8605Smrg
61848b8605Smrg
62848b8605Smrg
63848b8605Smrg
64848b8605Smrg#ifndef XMESA_H
65848b8605Smrg#define XMESA_H
66848b8605Smrg
67848b8605Smrg#include <X11/Xlib.h>
68848b8605Smrg#include <X11/Xutil.h>
69848b8605Smrg#include "xmesa_x.h"
70848b8605Smrg#include "GL/gl.h"
71848b8605Smrg
72b8e80941Smrg#ifdef __cplusplus
73b8e80941Smrgextern "C" {
74b8e80941Smrg#endif
75b8e80941Smrg
76848b8605Smrg#define XMESA_MAJOR_VERSION 6
77848b8605Smrg#define XMESA_MINOR_VERSION 3
78848b8605Smrg
79848b8605Smrg
80848b8605Smrg
81848b8605Smrg/*
82848b8605Smrg * Values passed to XMesaGetString:
83848b8605Smrg */
84848b8605Smrg#define XMESA_VERSION 1
85848b8605Smrg#define XMESA_EXTENSIONS 2
86848b8605Smrg
87848b8605Smrg
88848b8605Smrgtypedef struct xmesa_context *XMesaContext;
89848b8605Smrg
90848b8605Smrgtypedef struct xmesa_visual *XMesaVisual;
91848b8605Smrg
92848b8605Smrgtypedef struct xmesa_buffer *XMesaBuffer;
93848b8605Smrg
94848b8605Smrg
95848b8605Smrg
96848b8605Smrg/*
97848b8605Smrg * Create a new X/Mesa visual.
98848b8605Smrg * Input:  display - X11 display
99848b8605Smrg *         visinfo - an XVisualInfo pointer
100848b8605Smrg *         rgb_flag - GL_TRUE = RGB mode,
101848b8605Smrg *                    GL_FALSE = color index mode
102848b8605Smrg *         alpha_flag - alpha buffer requested?
103848b8605Smrg *         db_flag - GL_TRUE = double-buffered,
104848b8605Smrg *                   GL_FALSE = single buffered
105848b8605Smrg *         stereo_flag - stereo visual?
106848b8605Smrg *         ximage_flag - GL_TRUE = use an XImage for back buffer,
107848b8605Smrg *                       GL_FALSE = use an off-screen pixmap for back buffer
108848b8605Smrg *         depth_size - requested bits/depth values, or zero
109848b8605Smrg *         stencil_size - requested bits/stencil values, or zero
110848b8605Smrg *         accum_red_size - requested bits/red accum values, or zero
111848b8605Smrg *         accum_green_size - requested bits/green accum values, or zero
112848b8605Smrg *         accum_blue_size - requested bits/blue accum values, or zero
113848b8605Smrg *         accum_alpha_size - requested bits/alpha accum values, or zero
114848b8605Smrg *         num_samples - number of samples/pixel if multisampling, or zero
115848b8605Smrg *         level - visual level, usually 0
116848b8605Smrg *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
117848b8605Smrg * Return;  a new XMesaVisual or 0 if error.
118848b8605Smrg */
119848b8605Smrgextern XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
120848b8605Smrg                                      XMesaVisualInfo visinfo,
121848b8605Smrg                                      GLboolean rgb_flag,
122848b8605Smrg                                      GLboolean alpha_flag,
123848b8605Smrg                                      GLboolean db_flag,
124848b8605Smrg                                      GLboolean stereo_flag,
125848b8605Smrg                                      GLboolean ximage_flag,
126848b8605Smrg                                      GLint depth_size,
127848b8605Smrg                                      GLint stencil_size,
128848b8605Smrg                                      GLint accum_red_size,
129848b8605Smrg                                      GLint accum_green_size,
130848b8605Smrg                                      GLint accum_blue_size,
131848b8605Smrg                                      GLint accum_alpha_size,
132848b8605Smrg                                      GLint num_samples,
133848b8605Smrg                                      GLint level,
134848b8605Smrg                                      GLint visualCaveat );
135848b8605Smrg
136848b8605Smrg/*
137848b8605Smrg * Destroy an XMesaVisual, but not the associated XVisualInfo.
138848b8605Smrg */
139848b8605Smrgextern void XMesaDestroyVisual( XMesaVisual v );
140848b8605Smrg
141848b8605Smrg
142848b8605Smrg
143848b8605Smrg/*
144848b8605Smrg * Create a new XMesaContext for rendering into an X11 window.
145848b8605Smrg *
146848b8605Smrg * Input:  visual - an XMesaVisual
147848b8605Smrg *         share_list - another XMesaContext with which to share display
148848b8605Smrg *                      lists or NULL if no sharing is wanted.
149848b8605Smrg * Return:  an XMesaContext or NULL if error.
150848b8605Smrg */
151848b8605Smrgextern XMesaContext XMesaCreateContext( XMesaVisual v,
152848b8605Smrg					XMesaContext share_list );
153848b8605Smrg
154848b8605Smrg
155848b8605Smrg/*
156848b8605Smrg * Destroy a rendering context as returned by XMesaCreateContext()
157848b8605Smrg */
158848b8605Smrgextern void XMesaDestroyContext( XMesaContext c );
159848b8605Smrg
160848b8605Smrg
161848b8605Smrg
162848b8605Smrg
163848b8605Smrg/*
164848b8605Smrg * Create an XMesaBuffer from an X window.
165848b8605Smrg */
166848b8605Smrgextern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w );
167848b8605Smrg
168848b8605Smrg
169848b8605Smrg/*
170848b8605Smrg * Create an XMesaBuffer from an X pixmap.
171848b8605Smrg */
172848b8605Smrgextern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
173848b8605Smrg					    XMesaPixmap p,
174848b8605Smrg					    XMesaColormap cmap );
175848b8605Smrg
176848b8605Smrg
177848b8605Smrg/*
178848b8605Smrg * Destroy an XMesaBuffer, but not the corresponding window or pixmap.
179848b8605Smrg */
180848b8605Smrgextern void XMesaDestroyBuffer( XMesaBuffer b );
181848b8605Smrg
182848b8605Smrg
183848b8605Smrg/*
184848b8605Smrg * Return the XMesaBuffer handle which corresponds to an X drawable, if any.
185848b8605Smrg *
186848b8605Smrg * New in Mesa 2.3.
187848b8605Smrg */
188848b8605Smrgextern XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy,
189848b8605Smrg				    XMesaDrawable d );
190848b8605Smrg
191848b8605Smrg
192848b8605Smrg
193848b8605Smrg/*
194848b8605Smrg * Bind a buffer to a context and make the context the current one.
195848b8605Smrg */
196848b8605Smrgextern GLboolean XMesaMakeCurrent( XMesaContext c,
197848b8605Smrg				   XMesaBuffer b );
198848b8605Smrg
199848b8605Smrg
200848b8605Smrg/*
201848b8605Smrg * Bind two buffers (read and draw) to a context and make the
202848b8605Smrg * context the current one.
203848b8605Smrg * New in Mesa 3.3
204848b8605Smrg */
205848b8605Smrgextern GLboolean XMesaMakeCurrent2( XMesaContext c,
206848b8605Smrg                                    XMesaBuffer drawBuffer,
207848b8605Smrg                                    XMesaBuffer readBuffer );
208848b8605Smrg
209848b8605Smrg
210848b8605Smrg/*
211848b8605Smrg * Unbind the current context from its buffer.
212848b8605Smrg */
213848b8605Smrgextern GLboolean XMesaUnbindContext( XMesaContext c );
214848b8605Smrg
215848b8605Smrg
216848b8605Smrg/*
217848b8605Smrg * Return a handle to the current context.
218848b8605Smrg */
219848b8605Smrgextern XMesaContext XMesaGetCurrentContext( void );
220848b8605Smrg
221848b8605Smrg
222848b8605Smrg/*
223848b8605Smrg * Return handle to the current (draw) buffer.
224848b8605Smrg */
225848b8605Smrgextern XMesaBuffer XMesaGetCurrentBuffer( void );
226848b8605Smrg
227848b8605Smrg
228848b8605Smrg/*
229848b8605Smrg * Return handle to the current read buffer.
230848b8605Smrg * New in Mesa 3.3
231848b8605Smrg */
232848b8605Smrgextern XMesaBuffer XMesaGetCurrentReadBuffer( void );
233848b8605Smrg
234848b8605Smrg
235b8e80941Smrg/*
236b8e80941Smrg * Return display of current context.
237b8e80941Smrg */
238b8e80941Smrgextern Display *XMesaGetCurrentDisplay( void );
239b8e80941Smrg
240b8e80941Smrg
241848b8605Smrg/*
242848b8605Smrg * Swap the front and back buffers for the given buffer.  No action is
243848b8605Smrg * taken if the buffer is not double buffered.
244848b8605Smrg */
245848b8605Smrgextern void XMesaSwapBuffers( XMesaBuffer b );
246848b8605Smrg
247848b8605Smrg
248848b8605Smrg/*
249848b8605Smrg * Copy a sub-region of the back buffer to the front buffer.
250848b8605Smrg *
251848b8605Smrg * New in Mesa 2.6
252848b8605Smrg */
253848b8605Smrgextern void XMesaCopySubBuffer( XMesaBuffer b,
254848b8605Smrg				int x,
255848b8605Smrg				int y,
256848b8605Smrg				int width,
257848b8605Smrg				int height );
258848b8605Smrg
259848b8605Smrg
260848b8605Smrg/*
261848b8605Smrg * Return a pointer to the Pixmap or XImage being used as the back
262848b8605Smrg * color buffer of an XMesaBuffer.  This function is a way to get "under
263848b8605Smrg * the hood" of X/Mesa so one can manipulate the back buffer directly.
264848b8605Smrg * Input:  b - the XMesaBuffer
265848b8605Smrg * Output:  pixmap - pointer to back buffer's Pixmap, or 0
266848b8605Smrg *          ximage - pointer to back buffer's XImage, or NULL
267848b8605Smrg * Return:  GL_TRUE = context is double buffered
268848b8605Smrg *          GL_FALSE = context is single buffered
269848b8605Smrg */
270848b8605Smrgextern GLboolean XMesaGetBackBuffer( XMesaBuffer b,
271848b8605Smrg				     XMesaPixmap *pixmap,
272848b8605Smrg				     XMesaImage **ximage );
273848b8605Smrg
274848b8605Smrg
275848b8605Smrg
276848b8605Smrg/*
277848b8605Smrg * Return the depth buffer associated with an XMesaBuffer.
278848b8605Smrg * Input:  b - the XMesa buffer handle
279848b8605Smrg * Output:  width, height - size of buffer in pixels
280848b8605Smrg *          bytesPerValue - bytes per depth value (2 or 4)
281848b8605Smrg *          buffer - pointer to depth buffer values
282848b8605Smrg * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
283848b8605Smrg *
284848b8605Smrg * New in Mesa 2.4.
285848b8605Smrg */
286848b8605Smrgextern GLboolean XMesaGetDepthBuffer( XMesaBuffer b,
287848b8605Smrg				      GLint *width,
288848b8605Smrg				      GLint *height,
289848b8605Smrg				      GLint *bytesPerValue,
290848b8605Smrg				      void **buffer );
291848b8605Smrg
292848b8605Smrg
293848b8605Smrg
294848b8605Smrg/*
295848b8605Smrg * Flush/sync a context
296848b8605Smrg */
297848b8605Smrgextern void XMesaFlush( XMesaContext c );
298848b8605Smrg
299848b8605Smrg
300848b8605Smrg
301848b8605Smrg/*
302848b8605Smrg * Get an X/Mesa-specific string.
303848b8605Smrg * Input:  name - either XMESA_VERSION or XMESA_EXTENSIONS
304848b8605Smrg */
305848b8605Smrgextern const char *XMesaGetString( XMesaContext c, int name );
306848b8605Smrg
307848b8605Smrg
308848b8605Smrg
309848b8605Smrg/*
310848b8605Smrg * Scan for XMesaBuffers whose window/pixmap has been destroyed, then free
311848b8605Smrg * any memory used by that buffer.
312848b8605Smrg *
313848b8605Smrg * New in Mesa 2.3.
314848b8605Smrg */
315848b8605Smrgextern void XMesaGarbageCollect( XMesaDisplay* dpy );
316848b8605Smrg
317848b8605Smrg
318848b8605Smrg
319848b8605Smrg/*
320848b8605Smrg * Return a dithered pixel value.
321848b8605Smrg * Input:  c - XMesaContext
322848b8605Smrg *         x, y - window coordinate
323848b8605Smrg *         red, green, blue, alpha - color components in [0,1]
324848b8605Smrg * Return:  pixel value
325848b8605Smrg *
326848b8605Smrg * New in Mesa 2.3.
327848b8605Smrg */
328848b8605Smrgextern unsigned long XMesaDitherColor( XMesaContext xmesa,
329848b8605Smrg				       GLint x,
330848b8605Smrg				       GLint y,
331848b8605Smrg				       GLfloat red,
332848b8605Smrg				       GLfloat green,
333848b8605Smrg				       GLfloat blue,
334848b8605Smrg				       GLfloat alpha );
335848b8605Smrg
336848b8605Smrg
337848b8605Smrg
338848b8605Smrg/*
339848b8605Smrg * Reallocate the back/depth/stencil/accum/etc/ buffers associated with
340848b8605Smrg * buffer <b> if its size has changed.
341848b8605Smrg *
342848b8605Smrg * New in Mesa 4.0.2
343848b8605Smrg */
344848b8605Smrgextern void XMesaResizeBuffers( XMesaBuffer b );
345848b8605Smrg
346848b8605Smrg
347848b8605Smrg
348848b8605Smrg/*
349848b8605Smrg * Create a pbuffer.
350848b8605Smrg * New in Mesa 4.1
351848b8605Smrg */
352848b8605Smrgextern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
353848b8605Smrg                                      unsigned int width, unsigned int height);
354848b8605Smrg
355848b8605Smrg
356848b8605Smrg
357848b8605Smrg/*
358848b8605Smrg * Texture from Pixmap
359848b8605Smrg * New in Mesa 7.1
360848b8605Smrg */
361848b8605Smrgextern void
362848b8605SmrgXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer,
363848b8605Smrg                  const int *attrib_list);
364848b8605Smrg
365848b8605Smrgextern void
366848b8605SmrgXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer);
367848b8605Smrg
368848b8605Smrg
369848b8605Smrgextern XMesaBuffer
370848b8605SmrgXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p,
371848b8605Smrg                               XMesaColormap cmap,
372848b8605Smrg                               int format, int target, int mipmap);
373848b8605Smrg
374848b8605Smrg
375848b8605Smrg
376848b8605Smrg#ifdef __cplusplus
377848b8605Smrg}
378848b8605Smrg#endif
379848b8605Smrg
380848b8605Smrg
381848b8605Smrg#endif
382