| /* |
| * Mesa 3-D graphics library |
| * Version: 7.1 |
| * |
| * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
| * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| |
| |
| /* Sample Usage: |
| |
| In addition to the usual X calls to select a visual, create a colormap |
| and create a window, you must do the following to use the X/Mesa interface: |
| |
| 1. Call XMesaCreateVisual() to make an XMesaVisual from an XVisualInfo. |
| |
| 2. Call XMesaCreateContext() to create an X/Mesa rendering context, given |
| the XMesaVisual. |
| |
| 3. Call XMesaCreateWindowBuffer() to create an XMesaBuffer from an X window |
| and XMesaVisual. |
| |
| 4. Call XMesaMakeCurrent() to bind the XMesaBuffer to an XMesaContext and |
| to make the context the current one. |
| |
| 5. Make gl* calls to render your graphics. |
| |
| 6. Use XMesaSwapBuffers() when double buffering to swap front/back buffers. |
| |
| 7. Before the X window is destroyed, call XMesaDestroyBuffer(). |
| |
| 8. Before exiting, call XMesaDestroyVisual and XMesaDestroyContext. |
| |
| */ |
| |
| |
| |
| |
| #ifndef XMESA_H |
| #define XMESA_H |
| |
| |
| #include "main/core.h" /* for gl_config */ |
| #include "state_tracker/st_api.h" |
| #include "os/os_thread.h" |
| |
| #include "state_tracker/xlib_sw_winsys.h" |
| |
| # include <X11/Xlib.h> |
| # include <X11/Xlibint.h> |
| # include <X11/Xutil.h> |
| |
| struct hud_context; |
| |
| typedef struct xmesa_display *XMesaDisplay; |
| typedef struct xmesa_buffer *XMesaBuffer; |
| typedef struct xmesa_context *XMesaContext; |
| typedef struct xmesa_visual *XMesaVisual; |
| |
| |
| struct xmesa_display { |
| pipe_mutex mutex; |
| |
| Display *display; |
| struct pipe_screen *screen; |
| struct st_manager *smapi; |
| |
| struct pipe_context *pipe; |
| }; |
| |
| |
| /* |
| * Create a new X/Mesa visual. |
| * Input: display - X11 display |
| * visinfo - an XVisualInfo pointer |
| * rgb_flag - GL_TRUE = RGB mode, |
| * GL_FALSE = color index mode |
| * alpha_flag - alpha buffer requested? |
| * db_flag - GL_TRUE = double-buffered, |
| * GL_FALSE = single buffered |
| * stereo_flag - stereo visual? |
| * ximage_flag - GL_TRUE = use an XImage for back buffer, |
| * GL_FALSE = use an off-screen pixmap for back buffer |
| * depth_size - requested bits/depth values, or zero |
| * stencil_size - requested bits/stencil values, or zero |
| * accum_red_size - requested bits/red accum values, or zero |
| * accum_green_size - requested bits/green accum values, or zero |
| * accum_blue_size - requested bits/blue accum values, or zero |
| * accum_alpha_size - requested bits/alpha accum values, or zero |
| * num_samples - number of samples/pixel if multisampling, or zero |
| * level - visual level, usually 0 |
| * visualCaveat - ala the GLX extension, usually GLX_NONE_EXT |
| * Return; a new XMesaVisual or 0 if error. |
| */ |
| extern XMesaVisual XMesaCreateVisual( Display *display, |
| XVisualInfo * visinfo, |
| GLboolean rgb_flag, |
| GLboolean alpha_flag, |
| GLboolean db_flag, |
| GLboolean stereo_flag, |
| GLboolean ximage_flag, |
| GLint depth_size, |
| GLint stencil_size, |
| GLint accum_red_size, |
| GLint accum_green_size, |
| GLint accum_blue_size, |
| GLint accum_alpha_size, |
| GLint num_samples, |
| GLint level, |
| GLint visualCaveat ); |
| |
| /* |
| * Destroy an XMesaVisual, but not the associated XVisualInfo. |
| */ |
| extern void XMesaDestroyVisual( XMesaVisual v ); |
| |
| |
| |
| /* |
| * Create a new XMesaContext for rendering into an X11 window. |
| * |
| * Input: visual - an XMesaVisual |
| * share_list - another XMesaContext with which to share display |
| * lists or NULL if no sharing is wanted. |
| * Return: an XMesaContext or NULL if error. |
| */ |
| extern XMesaContext XMesaCreateContext( XMesaVisual v, |
| XMesaContext share_list, |
| GLuint major, GLuint minor, |
| GLuint profileMask, |
| GLuint contextFlags); |
| |
| |
| /* |
| * Destroy a rendering context as returned by XMesaCreateContext() |
| */ |
| extern void XMesaDestroyContext( XMesaContext c ); |
| |
| |
| |
| /* |
| * Create an XMesaBuffer from an X window. |
| */ |
| extern XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, Window w ); |
| |
| |
| /* |
| * Create an XMesaBuffer from an X pixmap. |
| */ |
| extern XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v, |
| Pixmap p, |
| Colormap cmap ); |
| |
| |
| /* |
| * Destroy an XMesaBuffer, but not the corresponding window or pixmap. |
| */ |
| extern void XMesaDestroyBuffer( XMesaBuffer b ); |
| |
| |
| /* |
| * Return the XMesaBuffer handle which corresponds to an X drawable, if any. |
| * |
| * New in Mesa 2.3. |
| */ |
| extern XMesaBuffer XMesaFindBuffer( Display *dpy, |
| Drawable d ); |
| |
| |
| |
| /* |
| * Bind two buffers (read and draw) to a context and make the |
| * context the current one. |
| * New in Mesa 3.3 |
| */ |
| extern GLboolean XMesaMakeCurrent2( XMesaContext c, |
| XMesaBuffer drawBuffer, |
| XMesaBuffer readBuffer ); |
| |
| |
| /* |
| * Unbind the current context from its buffer. |
| */ |
| extern GLboolean XMesaUnbindContext( XMesaContext c ); |
| |
| |
| /* |
| * Return a handle to the current context. |
| */ |
| extern XMesaContext XMesaGetCurrentContext( void ); |
| |
| |
| /* |
| * Swap the front and back buffers for the given buffer. No action is |
| * taken if the buffer is not double buffered. |
| */ |
| extern void XMesaSwapBuffers( XMesaBuffer b ); |
| |
| |
| /* |
| * Copy a sub-region of the back buffer to the front buffer. |
| * |
| * New in Mesa 2.6 |
| */ |
| extern void XMesaCopySubBuffer( XMesaBuffer b, |
| int x, |
| int y, |
| int width, |
| int height ); |
| |
| |
| |
| |
| |
| /* |
| * Flush/sync a context |
| */ |
| extern void XMesaFlush( XMesaContext c ); |
| |
| |
| |
| /* |
| * Scan for XMesaBuffers whose window/pixmap has been destroyed, then free |
| * any memory used by that buffer. |
| * |
| * New in Mesa 2.3. |
| */ |
| extern void XMesaGarbageCollect( void ); |
| |
| |
| |
| /* |
| * Create a pbuffer. |
| * New in Mesa 4.1 |
| */ |
| extern XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, Colormap cmap, |
| unsigned int width, unsigned int height); |
| |
| |
| |
| /* |
| * Texture from Pixmap |
| * New in Mesa 7.1 |
| */ |
| extern void |
| XMesaBindTexImage(Display *dpy, XMesaBuffer drawable, int buffer, |
| const int *attrib_list); |
| |
| extern void |
| XMesaReleaseTexImage(Display *dpy, XMesaBuffer drawable, int buffer); |
| |
| |
| extern XMesaBuffer |
| XMesaCreatePixmapTextureBuffer(XMesaVisual v, Pixmap p, |
| Colormap cmap, |
| int format, int target, int mipmap); |
| |
| |
| extern void |
| XMesaCopyContext(XMesaContext src, XMesaContext dst, unsigned long mask); |
| |
| |
| /*********************************************************************** |
| */ |
| |
| /** |
| * Visual inforation, derived from GLvisual. |
| * Basically corresponds to an XVisualInfo. |
| */ |
| struct xmesa_visual { |
| struct gl_config mesa_visual;/* Device independent visual parameters */ |
| int screen, visualID, visualType; |
| Display *display; /* The X11 display */ |
| XVisualInfo * visinfo; /* X's visual info (pointer to private copy) */ |
| XVisualInfo *vishandle; /* Only used in fakeglx.c */ |
| GLint BitsPerPixel; /* True bits per pixel for XImages */ |
| |
| GLboolean ximage_flag; /* Use XImage for back buffer (not pixmap)? */ |
| |
| struct st_visual stvis; |
| }; |
| |
| |
| /** |
| * Context info, derived from st_context. |
| * Basically corresponds to a GLXContext. |
| */ |
| struct xmesa_context { |
| struct st_context_iface *st; |
| XMesaVisual xm_visual; /** pixel format info */ |
| XMesaBuffer xm_buffer; /** current drawbuffer */ |
| XMesaBuffer xm_read_buffer; /** current readbuffer */ |
| struct hud_context *hud; |
| }; |
| |
| |
| /** |
| * Types of X/GLX drawables we might render into. |
| */ |
| typedef enum { |
| WINDOW, /* An X window */ |
| GLXWINDOW, /* GLX window */ |
| PIXMAP, /* GLX pixmap */ |
| PBUFFER /* GLX Pbuffer */ |
| } BufferType; |
| |
| |
| /** |
| * Framebuffer information, derived from. |
| * Basically corresponds to a GLXDrawable. |
| */ |
| struct xmesa_buffer { |
| struct st_framebuffer_iface *stfb; |
| struct xlib_drawable ws; |
| |
| GLboolean wasCurrent; /* was ever the current buffer? */ |
| XMesaVisual xm_visual; /* the X/Mesa visual */ |
| Colormap cmap; /* the X colormap */ |
| BufferType type; /* window, pixmap, pbuffer or glxwindow */ |
| |
| GLboolean largestPbuffer; /**< for pbuffers */ |
| GLboolean preservedContents; /**< for pbuffers */ |
| |
| XImage *tempImage; |
| unsigned long selectedEvents;/* for pbuffers only */ |
| |
| |
| GC gc; /* scratch GC for span, line, tri drawing */ |
| |
| /* GLX_EXT_texture_from_pixmap */ |
| GLint TextureTarget; /** GLX_TEXTURE_1D_EXT, for example */ |
| GLint TextureFormat; /** GLX_TEXTURE_FORMAT_RGB_EXT, for example */ |
| GLint TextureMipmap; /** 0 or 1 */ |
| |
| struct xmesa_buffer *Next; /* Linked list pointer: */ |
| |
| unsigned width, height; |
| }; |
| |
| |
| |
| extern const char * |
| xmesa_get_name(void); |
| |
| extern void |
| xmesa_init(Display *dpy); |
| |
| extern XMesaBuffer |
| xmesa_find_buffer(Display *dpy, Colormap cmap, XMesaBuffer notThis); |
| |
| extern void |
| xmesa_get_window_size(Display *dpy, XMesaBuffer b, |
| GLuint *width, GLuint *height); |
| |
| extern void |
| xmesa_notify_invalid_buffer(XMesaBuffer b); |
| |
| extern void |
| xmesa_check_buffer_size(XMesaBuffer b); |
| |
| extern void |
| xmesa_destroy_buffers_on_display(Display *dpy); |
| |
| static INLINE GLuint |
| xmesa_buffer_width(XMesaBuffer b) |
| { |
| return b->width; |
| } |
| |
| static INLINE GLuint |
| xmesa_buffer_height(XMesaBuffer b) |
| { |
| return b->height; |
| } |
| |
| extern boolean xmesa_strict_invalidate; |
| |
| #endif |