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 mtx_t 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 int 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