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