Home | History | Annotate | Download | only in xlib
      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 /* Sample Usage:
     28 
     29 In addition to the usual X calls to select a visual, create a colormap
     30 and create a window, you must do the following to use the X/Mesa interface:
     31 
     32 1. Call XMesaCreateVisual() to make an XMesaVisual from an XVisualInfo.
     33 
     34 2. Call XMesaCreateContext() to create an X/Mesa rendering context, given
     35    the XMesaVisual.
     36 
     37 3. Call XMesaCreateWindowBuffer() to create an XMesaBuffer from an X window
     38    and XMesaVisual.
     39 
     40 4. Call XMesaMakeCurrent() to bind the XMesaBuffer to an XMesaContext and
     41    to make the context the current one.
     42 
     43 5. Make gl* calls to render your graphics.
     44 
     45 6. Use XMesaSwapBuffers() when double buffering to swap front/back buffers.
     46 
     47 7. Before the X window is destroyed, call XMesaDestroyBuffer().
     48 
     49 8. Before exiting, call XMesaDestroyVisual and XMesaDestroyContext.
     50 
     51 */
     52 
     53 
     54 
     55 
     56 #ifndef XMESA_H
     57 #define XMESA_H
     58 
     59 
     60 #include "main/core.h" /* for gl_config */
     61 #include "state_tracker/st_api.h"
     62 #include "os/os_thread.h"
     63 
     64 #include "state_tracker/xlibsw_api.h"
     65 
     66 # include <X11/Xlib.h>
     67 # include <X11/Xlibint.h>
     68 # include <X11/Xutil.h>
     69 
     70 struct hud_context;
     71 
     72 typedef struct xmesa_display *XMesaDisplay;
     73 typedef struct xmesa_buffer *XMesaBuffer;
     74 typedef struct xmesa_context *XMesaContext;
     75 typedef struct xmesa_visual *XMesaVisual;
     76 
     77 
     78 struct xmesa_display {
     79    pipe_mutex mutex;
     80 
     81    Display *display;
     82    struct pipe_screen *screen;
     83    struct st_manager *smapi;
     84 
     85    struct pipe_context *pipe;
     86 };
     87 
     88 
     89 /*
     90  * Create a new X/Mesa visual.
     91  * Input:  display - X11 display
     92  *         visinfo - an XVisualInfo pointer
     93  *         rgb_flag - GL_TRUE = RGB mode,
     94  *                    GL_FALSE = color index mode
     95  *         alpha_flag - alpha buffer requested?
     96  *         db_flag - GL_TRUE = double-buffered,
     97  *                   GL_FALSE = single buffered
     98  *         stereo_flag - stereo visual?
     99  *         ximage_flag - GL_TRUE = use an XImage for back buffer,
    100  *                       GL_FALSE = use an off-screen pixmap for back buffer
    101  *         depth_size - requested bits/depth values, or zero
    102  *         stencil_size - requested bits/stencil values, or zero
    103  *         accum_red_size - requested bits/red accum values, or zero
    104  *         accum_green_size - requested bits/green accum values, or zero
    105  *         accum_blue_size - requested bits/blue accum values, or zero
    106  *         accum_alpha_size - requested bits/alpha accum values, or zero
    107  *         num_samples - number of samples/pixel if multisampling, or zero
    108  *         level - visual level, usually 0
    109  *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
    110  * Return;  a new XMesaVisual or 0 if error.
    111  */
    112 extern XMesaVisual XMesaCreateVisual( Display *display,
    113                                       XVisualInfo * visinfo,
    114                                       GLboolean rgb_flag,
    115                                       GLboolean alpha_flag,
    116                                       GLboolean db_flag,
    117                                       GLboolean stereo_flag,
    118                                       GLboolean ximage_flag,
    119                                       GLint depth_size,
    120                                       GLint stencil_size,
    121                                       GLint accum_red_size,
    122                                       GLint accum_green_size,
    123                                       GLint accum_blue_size,
    124                                       GLint accum_alpha_size,
    125                                       GLint num_samples,
    126                                       GLint level,
    127                                       GLint visualCaveat );
    128 
    129 /*
    130  * Destroy an XMesaVisual, but not the associated XVisualInfo.
    131  */
    132 extern void XMesaDestroyVisual( XMesaVisual v );
    133 
    134 
    135 
    136 /*
    137  * Create a new XMesaContext for rendering into an X11 window.
    138  *
    139  * Input:  visual - an XMesaVisual
    140  *         share_list - another XMesaContext with which to share display
    141  *                      lists or NULL if no sharing is wanted.
    142  * Return:  an XMesaContext or NULL if error.
    143  */
    144 extern XMesaContext XMesaCreateContext( XMesaVisual v,
    145 					XMesaContext share_list,
    146                                         GLuint major, GLuint minor,
    147                                         GLuint profileMask,
    148                                         GLuint contextFlags);
    149 
    150 
    151 /*
    152  * Destroy a rendering context as returned by XMesaCreateContext()
    153  */
    154 extern void XMesaDestroyContext( XMesaContext c );
    155 
    156 
    157 
    158 /*
    159  * Create an XMesaBuffer from an X window.
    160  */
    161 extern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, Window w );
    162 
    163 
    164 /*
    165  * Create an XMesaBuffer from an X pixmap.
    166  */
    167 extern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
    168 					    Pixmap p,
    169 					    Colormap cmap );
    170 
    171 
    172 /*
    173  * Destroy an XMesaBuffer, but not the corresponding window or pixmap.
    174  */
    175 extern void XMesaDestroyBuffer( XMesaBuffer b );
    176 
    177 
    178 /*
    179  * Return the XMesaBuffer handle which corresponds to an X drawable, if any.
    180  *
    181  * New in Mesa 2.3.
    182  */
    183 extern XMesaBuffer XMesaFindBuffer( Display *dpy,
    184 				    Drawable d );
    185 
    186 
    187 
    188 /*
    189  * Bind two buffers (read and draw) to a context and make the
    190  * context the current one.
    191  * New in Mesa 3.3
    192  */
    193 extern GLboolean XMesaMakeCurrent2( XMesaContext c,
    194                                     XMesaBuffer drawBuffer,
    195                                     XMesaBuffer readBuffer );
    196 
    197 
    198 /*
    199  * Unbind the current context from its buffer.
    200  */
    201 extern GLboolean XMesaUnbindContext( XMesaContext c );
    202 
    203 
    204 /*
    205  * Return a handle to the current context.
    206  */
    207 extern XMesaContext XMesaGetCurrentContext( void );
    208 
    209 
    210 /*
    211  * Swap the front and back buffers for the given buffer.  No action is
    212  * taken if the buffer is not double buffered.
    213  */
    214 extern void XMesaSwapBuffers( XMesaBuffer b );
    215 
    216 
    217 /*
    218  * Copy a sub-region of the back buffer to the front buffer.
    219  *
    220  * New in Mesa 2.6
    221  */
    222 extern void XMesaCopySubBuffer( XMesaBuffer b,
    223 				int x,
    224 				int y,
    225 				int width,
    226 				int height );
    227 
    228 
    229 
    230 
    231 
    232 /*
    233  * Flush/sync a context
    234  */
    235 extern void XMesaFlush( XMesaContext c );
    236 
    237 
    238 
    239 /*
    240  * Scan for XMesaBuffers whose window/pixmap has been destroyed, then free
    241  * any memory used by that buffer.
    242  *
    243  * New in Mesa 2.3.
    244  */
    245 extern void XMesaGarbageCollect( void );
    246 
    247 
    248 
    249 /*
    250  * Create a pbuffer.
    251  * New in Mesa 4.1
    252  */
    253 extern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, Colormap cmap,
    254                                       unsigned int width, unsigned int height);
    255 
    256 
    257 
    258 /*
    259  * Texture from Pixmap
    260  * New in Mesa 7.1
    261  */
    262 extern void
    263 XMesaBindTexImage(Display *dpy, XMesaBuffer drawable, int buffer,
    264                   const int *attrib_list);
    265 
    266 extern void
    267 XMesaReleaseTexImage(Display *dpy, XMesaBuffer drawable, int buffer);
    268 
    269 
    270 extern XMesaBuffer
    271 XMesaCreatePixmapTextureBuffer(XMesaVisual v, Pixmap p,
    272                                Colormap cmap,
    273                                int format, int target, int mipmap);
    274 
    275 
    276 extern void
    277 XMesaCopyContext(XMesaContext src, XMesaContext dst, unsigned long mask);
    278 
    279 
    280 /***********************************************************************
    281  */
    282 
    283 /**
    284  * Visual inforation, derived from GLvisual.
    285  * Basically corresponds to an XVisualInfo.
    286  */
    287 struct xmesa_visual {
    288    struct gl_config mesa_visual;/* Device independent visual parameters */
    289    int screen, visualID, visualType;
    290    Display *display;	/* The X11 display */
    291    XVisualInfo * visinfo;	/* X's visual info (pointer to private copy) */
    292    XVisualInfo *vishandle;	/* Only used in fakeglx.c */
    293    GLint BitsPerPixel;		/* True bits per pixel for XImages */
    294 
    295    GLboolean ximage_flag;	/* Use XImage for back buffer (not pixmap)? */
    296 
    297    struct st_visual stvis;
    298 };
    299 
    300 
    301 /**
    302  * Context info, derived from st_context.
    303  * Basically corresponds to a GLXContext.
    304  */
    305 struct xmesa_context {
    306    struct st_context_iface *st;
    307    XMesaVisual xm_visual;	/** pixel format info */
    308    XMesaBuffer xm_buffer;	/** current drawbuffer */
    309    XMesaBuffer xm_read_buffer;  /** current readbuffer */
    310    struct hud_context *hud;
    311 };
    312 
    313 
    314 /**
    315  * Types of X/GLX drawables we might render into.
    316  */
    317 typedef enum {
    318    WINDOW,          /* An X window */
    319    GLXWINDOW,       /* GLX window */
    320    PIXMAP,          /* GLX pixmap */
    321    PBUFFER          /* GLX Pbuffer */
    322 } BufferType;
    323 
    324 
    325 /**
    326  * Framebuffer information, derived from.
    327  * Basically corresponds to a GLXDrawable.
    328  */
    329 struct xmesa_buffer {
    330    struct st_framebuffer_iface *stfb;
    331    struct xlib_drawable ws;
    332 
    333    GLboolean wasCurrent;	/* was ever the current buffer? */
    334    XMesaVisual xm_visual;	/* the X/Mesa visual */
    335    Colormap cmap;		/* the X colormap */
    336    BufferType type;             /* window, pixmap, pbuffer or glxwindow */
    337 
    338    GLboolean largestPbuffer;    /**< for pbuffers */
    339    GLboolean preservedContents; /**< for pbuffers */
    340 
    341    XImage *tempImage;
    342    unsigned long selectedEvents;/* for pbuffers only */
    343 
    344 
    345    GC gc;			/* scratch GC for span, line, tri drawing */
    346 
    347    /* GLX_EXT_texture_from_pixmap */
    348    GLint TextureTarget; /** GLX_TEXTURE_1D_EXT, for example */
    349    GLint TextureFormat; /** GLX_TEXTURE_FORMAT_RGB_EXT, for example */
    350    GLint TextureMipmap; /** 0 or 1 */
    351 
    352    struct xmesa_buffer *Next;	/* Linked list pointer: */
    353 
    354    unsigned width, height;
    355 };
    356 
    357 
    358 
    359 extern const char *
    360 xmesa_get_name(void);
    361 
    362 extern void
    363 xmesa_init(Display *dpy);
    364 
    365 extern XMesaBuffer
    366 xmesa_find_buffer(Display *dpy, Colormap cmap, XMesaBuffer notThis);
    367 
    368 extern void
    369 xmesa_get_window_size(Display *dpy, XMesaBuffer b,
    370                       GLuint *width, GLuint *height);
    371 
    372 extern void
    373 xmesa_notify_invalid_buffer(XMesaBuffer b);
    374 
    375 extern void
    376 xmesa_check_buffer_size(XMesaBuffer b);
    377 
    378 extern void
    379 xmesa_destroy_buffers_on_display(Display *dpy);
    380 
    381 extern void
    382 xmesa_close_display(Display *dpy);
    383 
    384 static inline GLuint
    385 xmesa_buffer_width(XMesaBuffer b)
    386 {
    387    return b->width;
    388 }
    389 
    390 static inline GLuint
    391 xmesa_buffer_height(XMesaBuffer b)
    392 {
    393    return b->height;
    394 }
    395 
    396 extern boolean xmesa_strict_invalidate;
    397 
    398 #endif
    399