Home | History | Annotate | Download | only in x11
      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 /*
     89  * Values passed to XMesaSetFXmode:
     90  */
     91 #define XMESA_FX_WINDOW       1
     92 #define XMESA_FX_FULLSCREEN   2
     93 
     94 
     95 
     96 typedef struct xmesa_context *XMesaContext;
     97 
     98 typedef struct xmesa_visual *XMesaVisual;
     99 
    100 typedef struct xmesa_buffer *XMesaBuffer;
    101 
    102 
    103 
    104 /*
    105  * Create a new X/Mesa visual.
    106  * Input:  display - X11 display
    107  *         visinfo - an XVisualInfo pointer
    108  *         rgb_flag - GL_TRUE = RGB mode,
    109  *                    GL_FALSE = color index mode
    110  *         alpha_flag - alpha buffer requested?
    111  *         db_flag - GL_TRUE = double-buffered,
    112  *                   GL_FALSE = single buffered
    113  *         stereo_flag - stereo visual?
    114  *         ximage_flag - GL_TRUE = use an XImage for back buffer,
    115  *                       GL_FALSE = use an off-screen pixmap for back buffer
    116  *         depth_size - requested bits/depth values, or zero
    117  *         stencil_size - requested bits/stencil values, or zero
    118  *         accum_red_size - requested bits/red accum values, or zero
    119  *         accum_green_size - requested bits/green accum values, or zero
    120  *         accum_blue_size - requested bits/blue accum values, or zero
    121  *         accum_alpha_size - requested bits/alpha accum values, or zero
    122  *         num_samples - number of samples/pixel if multisampling, or zero
    123  *         level - visual level, usually 0
    124  *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
    125  * Return;  a new XMesaVisual or 0 if error.
    126  */
    127 extern XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
    128                                       XMesaVisualInfo visinfo,
    129                                       GLboolean rgb_flag,
    130                                       GLboolean alpha_flag,
    131                                       GLboolean db_flag,
    132                                       GLboolean stereo_flag,
    133                                       GLboolean ximage_flag,
    134                                       GLint depth_size,
    135                                       GLint stencil_size,
    136                                       GLint accum_red_size,
    137                                       GLint accum_green_size,
    138                                       GLint accum_blue_size,
    139                                       GLint accum_alpha_size,
    140                                       GLint num_samples,
    141                                       GLint level,
    142                                       GLint visualCaveat );
    143 
    144 /*
    145  * Destroy an XMesaVisual, but not the associated XVisualInfo.
    146  */
    147 extern void XMesaDestroyVisual( XMesaVisual v );
    148 
    149 
    150 
    151 /*
    152  * Create a new XMesaContext for rendering into an X11 window.
    153  *
    154  * Input:  visual - an XMesaVisual
    155  *         share_list - another XMesaContext with which to share display
    156  *                      lists or NULL if no sharing is wanted.
    157  * Return:  an XMesaContext or NULL if error.
    158  */
    159 extern XMesaContext XMesaCreateContext( XMesaVisual v,
    160 					XMesaContext share_list );
    161 
    162 
    163 /*
    164  * Destroy a rendering context as returned by XMesaCreateContext()
    165  */
    166 extern void XMesaDestroyContext( XMesaContext c );
    167 
    168 
    169 
    170 
    171 /*
    172  * Create an XMesaBuffer from an X window.
    173  */
    174 extern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w );
    175 
    176 
    177 /*
    178  * Create an XMesaBuffer from an X pixmap.
    179  */
    180 extern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
    181 					    XMesaPixmap p,
    182 					    XMesaColormap cmap );
    183 
    184 
    185 /*
    186  * Destroy an XMesaBuffer, but not the corresponding window or pixmap.
    187  */
    188 extern void XMesaDestroyBuffer( XMesaBuffer b );
    189 
    190 
    191 /*
    192  * Return the XMesaBuffer handle which corresponds to an X drawable, if any.
    193  *
    194  * New in Mesa 2.3.
    195  */
    196 extern XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy,
    197 				    XMesaDrawable d );
    198 
    199 
    200 
    201 /*
    202  * Bind a buffer to a context and make the context the current one.
    203  */
    204 extern GLboolean XMesaMakeCurrent( XMesaContext c,
    205 				   XMesaBuffer b );
    206 
    207 
    208 /*
    209  * Bind two buffers (read and draw) to a context and make the
    210  * context the current one.
    211  * New in Mesa 3.3
    212  */
    213 extern GLboolean XMesaMakeCurrent2( XMesaContext c,
    214                                     XMesaBuffer drawBuffer,
    215                                     XMesaBuffer readBuffer );
    216 
    217 
    218 /*
    219  * Unbind the current context from its buffer.
    220  */
    221 extern GLboolean XMesaUnbindContext( XMesaContext c );
    222 
    223 
    224 /*
    225  * Return a handle to the current context.
    226  */
    227 extern XMesaContext XMesaGetCurrentContext( void );
    228 
    229 
    230 /*
    231  * Return handle to the current (draw) buffer.
    232  */
    233 extern XMesaBuffer XMesaGetCurrentBuffer( void );
    234 
    235 
    236 /*
    237  * Return handle to the current read buffer.
    238  * New in Mesa 3.3
    239  */
    240 extern XMesaBuffer XMesaGetCurrentReadBuffer( void );
    241 
    242 
    243 /*
    244  * Swap the front and back buffers for the given buffer.  No action is
    245  * taken if the buffer is not double buffered.
    246  */
    247 extern void XMesaSwapBuffers( XMesaBuffer b );
    248 
    249 
    250 /*
    251  * Copy a sub-region of the back buffer to the front buffer.
    252  *
    253  * New in Mesa 2.6
    254  */
    255 extern void XMesaCopySubBuffer( XMesaBuffer b,
    256 				int x,
    257 				int y,
    258 				int width,
    259 				int height );
    260 
    261 
    262 /*
    263  * Return a pointer to the Pixmap or XImage being used as the back
    264  * color buffer of an XMesaBuffer.  This function is a way to get "under
    265  * the hood" of X/Mesa so one can manipulate the back buffer directly.
    266  * Input:  b - the XMesaBuffer
    267  * Output:  pixmap - pointer to back buffer's Pixmap, or 0
    268  *          ximage - pointer to back buffer's XImage, or NULL
    269  * Return:  GL_TRUE = context is double buffered
    270  *          GL_FALSE = context is single buffered
    271  */
    272 extern GLboolean XMesaGetBackBuffer( XMesaBuffer b,
    273 				     XMesaPixmap *pixmap,
    274 				     XMesaImage **ximage );
    275 
    276 
    277 
    278 /*
    279  * Return the depth buffer associated with an XMesaBuffer.
    280  * Input:  b - the XMesa buffer handle
    281  * Output:  width, height - size of buffer in pixels
    282  *          bytesPerValue - bytes per depth value (2 or 4)
    283  *          buffer - pointer to depth buffer values
    284  * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
    285  *
    286  * New in Mesa 2.4.
    287  */
    288 extern GLboolean XMesaGetDepthBuffer( XMesaBuffer b,
    289 				      GLint *width,
    290 				      GLint *height,
    291 				      GLint *bytesPerValue,
    292 				      void **buffer );
    293 
    294 
    295 
    296 /*
    297  * Flush/sync a context
    298  */
    299 extern void XMesaFlush( XMesaContext c );
    300 
    301 
    302 
    303 /*
    304  * Get an X/Mesa-specific string.
    305  * Input:  name - either XMESA_VERSION or XMESA_EXTENSIONS
    306  */
    307 extern const char *XMesaGetString( XMesaContext c, int name );
    308 
    309 
    310 
    311 /*
    312  * Scan for XMesaBuffers whose window/pixmap has been destroyed, then free
    313  * any memory used by that buffer.
    314  *
    315  * New in Mesa 2.3.
    316  */
    317 extern void XMesaGarbageCollect( XMesaDisplay* dpy );
    318 
    319 
    320 
    321 /*
    322  * Return a dithered pixel value.
    323  * Input:  c - XMesaContext
    324  *         x, y - window coordinate
    325  *         red, green, blue, alpha - color components in [0,1]
    326  * Return:  pixel value
    327  *
    328  * New in Mesa 2.3.
    329  */
    330 extern unsigned long XMesaDitherColor( XMesaContext xmesa,
    331 				       GLint x,
    332 				       GLint y,
    333 				       GLfloat red,
    334 				       GLfloat green,
    335 				       GLfloat blue,
    336 				       GLfloat alpha );
    337 
    338 
    339 
    340 /*
    341  * 3Dfx Glide driver only!
    342  * Set 3Dfx/Glide full-screen or window rendering mode.
    343  * Input:  mode - either XMESA_FX_WINDOW (window rendering mode) or
    344  *                XMESA_FX_FULLSCREEN (full-screen rendering mode)
    345  * Return:  GL_TRUE if success
    346  *          GL_FALSE if invalid mode or if not using 3Dfx driver
    347  *
    348  * New in Mesa 2.6.
    349  */
    350 extern GLboolean XMesaSetFXmode( GLint mode );
    351 
    352 
    353 
    354 /*
    355  * Reallocate the back/depth/stencil/accum/etc/ buffers associated with
    356  * buffer <b> if its size has changed.
    357  *
    358  * New in Mesa 4.0.2
    359  */
    360 extern void XMesaResizeBuffers( XMesaBuffer b );
    361 
    362 
    363 
    364 /*
    365  * Create a pbuffer.
    366  * New in Mesa 4.1
    367  */
    368 extern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
    369                                       unsigned int width, unsigned int height);
    370 
    371 
    372 
    373 /*
    374  * Texture from Pixmap
    375  * New in Mesa 7.1
    376  */
    377 extern void
    378 XMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer,
    379                   const int *attrib_list);
    380 
    381 extern void
    382 XMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer);
    383 
    384 
    385 extern XMesaBuffer
    386 XMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p,
    387                                XMesaColormap cmap,
    388                                int format, int target, int mipmap);
    389 
    390 
    391 
    392 #ifdef __cplusplus
    393 }
    394 #endif
    395 
    396 
    397 #endif
    398