diff options
Diffstat (limited to 'src/mesa/drivers/x11/xm_api.c')
-rw-r--r-- | src/mesa/drivers/x11/xm_api.c | 343 |
1 files changed, 56 insertions, 287 deletions
diff --git a/src/mesa/drivers/x11/xm_api.c b/src/mesa/drivers/x11/xm_api.c index 24028a44ba7..a07d0a90cf3 100644 --- a/src/mesa/drivers/x11/xm_api.c +++ b/src/mesa/drivers/x11/xm_api.c @@ -1036,10 +1036,16 @@ setup_monochrome( XMesaVisual v, XMesaBuffer b ) * \return GL_TRUE=success, GL_FALSE=failure */ static GLboolean -initialize_visual_and_buffer(int client, XMesaVisual v, XMesaBuffer b, +initialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, GLboolean rgb_flag, XMesaDrawable window, XMesaColormap cmap) { + int client = 0; + +#ifdef XFree86Server + client = (window) ? CLIENT_ID(window->id) : 0; +#endif + ASSERT(!b || b->xm_visual == v); /* Save true bits/pixel */ @@ -1103,6 +1109,8 @@ initialize_visual_and_buffer(int client, XMesaVisual v, XMesaBuffer b, } if (b && window) { + char *data; + /* Do window-specific initializations */ /* these should have been set in create_xmesa_buffer */ @@ -1170,15 +1178,15 @@ initialize_visual_and_buffer(int client, XMesaVisual v, XMesaBuffer b, } /* Initialize the row buffer XImage for use in write_color_span() */ + data = (char*) MALLOC(MAX_WIDTH*4); #ifdef XFree86Server - b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, - (char *)MALLOC(MAX_WIDTH*4)); + b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data); #else b->rowimage = XCreateImage( v->display, v->visinfo->visual, v->visinfo->depth, ZPixmap, 0, /*format, offset*/ - (char*) MALLOC(MAX_WIDTH*4), /*data*/ + data, /*data*/ MAX_WIDTH, 1, /*width, height*/ 32, /*bitmap_pad*/ 0 /*bytes_per_line*/ ); @@ -1308,6 +1316,7 @@ xmesa_convert_from_x_visual_type( int visualType ) * visualCaveat - ala the GLX extension, usually GLX_NONE * Return; a new XMesaVisual or 0 if error. */ +PUBLIC XMesaVisual XMesaCreateVisual( XMesaDisplay *display, XMesaVisualInfo visinfo, GLboolean rgb_flag, @@ -1409,7 +1418,7 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display, if (alpha_flag) v->mesa_visual.alphaBits = 8; - (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 ); + (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 ); { const int xclass = v->mesa_visual.visualType; @@ -1450,6 +1459,7 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display, } +PUBLIC void XMesaDestroyVisual( XMesaVisual v ) { #ifndef XFree86Server @@ -1467,6 +1477,7 @@ void XMesaDestroyVisual( XMesaVisual v ) * lists or NULL if no sharing is wanted. * \return an XMesaContext or NULL if error. */ +PUBLIC XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) { static GLboolean firstTime = GL_TRUE; @@ -1550,15 +1561,15 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) +PUBLIC void XMesaDestroyContext( XMesaContext c ) { GLcontext *mesaCtx = &c->mesa; -#ifdef FX - XMesaBuffer xmbuf = XMESA_BUFFER(mesaCtx->DrawBuffer); - if (xmbuf && xmbuf->FXctx) - fxMesaDestroyContext(xmbuf->FXctx); +#ifdef FX + FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) ); #endif + _swsetup_DestroyContext( mesaCtx ); _swrast_DestroyContext( mesaCtx ); _tnl_DestroyContext( mesaCtx ); @@ -1574,44 +1585,33 @@ void XMesaDestroyContext( XMesaContext c ) * X window or pixmap. * \param v the window's XMesaVisual * \param w the window we're wrapping - * \param c context used to initialize the buffer if 3Dfx mode in use. * \return new XMesaBuffer or NULL if error */ -XMesaBuffer -XMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c) +PUBLIC XMesaBuffer +XMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) { #ifndef XFree86Server XWindowAttributes attr; #endif -#ifdef FX - char *fxEnvVar; -#endif - int client = 0; XMesaBuffer b; XMesaColormap cmap; + int depth; assert(v); assert(w); - (void) c; /* Check that window depth matches visual depth */ #ifdef XFree86Server - client = CLIENT_ID(((XMesaDrawable)w)->id); - - if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) { - _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", - GET_VISUAL_DEPTH(v), ((XMesaDrawable) w)->depth); - return NULL; - } + depth = ((XMesaDrawable)w)->depth; #else XGetWindowAttributes( v->display, w, &attr ); - - if (GET_VISUAL_DEPTH(v) != attr.depth) { + depth = attr.depth; +#endif + if (GET_VISUAL_DEPTH(v) != depth) { _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", - GET_VISUAL_DEPTH(v), attr.depth); + GET_VISUAL_DEPTH(v), depth); return NULL; } -#endif /* Find colormap */ #ifdef XFree86Server @@ -1632,101 +1632,16 @@ XMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c) if (!b) return NULL; - if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode, + if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode, (XMesaDrawable) w, cmap )) { xmesa_free_buffer(b); return NULL; } -#ifdef FX - fxEnvVar = _mesa_getenv("MESA_GLX_FX"); - if (fxEnvVar) { - if (fxEnvVar[0]!='d') { - int attribs[100]; - int numAttribs = 0; - int hw; - if (v->mesa_visual.depthBits > 0) { - attribs[numAttribs++] = FXMESA_DEPTH_SIZE; - attribs[numAttribs++] = v->mesa_visual.depthBits; - } - if (v->mesa_visual.doubleBufferMode) { - attribs[numAttribs++] = FXMESA_DOUBLEBUFFER; - } - if (v->mesa_visual.accumRedBits > 0) { - attribs[numAttribs++] = FXMESA_ACCUM_SIZE; - attribs[numAttribs++] = v->mesa_visual.accumRedBits; - } - if (v->mesa_visual.stencilBits > 0) { - attribs[numAttribs++] = FXMESA_STENCIL_SIZE; - attribs[numAttribs++] = v->mesa_visual.stencilBits; - } - if (v->mesa_visual.alphaBits > 0) { - attribs[numAttribs++] = FXMESA_ALPHA_SIZE; - attribs[numAttribs++] = v->mesa_visual.alphaBits; - } - if (1) { - attribs[numAttribs++] = FXMESA_SHARE_CONTEXT; - attribs[numAttribs++] = (int) &(c->mesa); - } - attribs[numAttribs++] = FXMESA_NONE; - - /* [dBorca] we should take an envvar for `fxMesaSelectCurrentBoard'!!! */ - hw = fxMesaSelectCurrentBoard(0); - - /* if these fail, there's a new bug somewhere */ - ASSERT(b->mesa_buffer.Width > 0); - ASSERT(b->mesa_buffer.Height > 0); - - if ((hw == GR_SSTTYPE_VOODOO) || (hw == GR_SSTTYPE_Voodoo2)) { - b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width, - b->mesa_buffer.Height, attribs); - if ((v->undithered_pf!=PF_Index) && (b->backxrb->ximage)) { - b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE; - if (b->FXctx && (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')) { - b->FXwindowHack = GL_TRUE; - FX_grSstControl(GR_CONTROL_DEACTIVATE); - } - else { - b->FXwindowHack = GL_FALSE; - } - } - } - else { - if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W') - b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE, - GR_REFRESH_75Hz, attribs); - else - b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width, - b->mesa_buffer.Height, attribs); - b->FXisHackUsable = GL_FALSE; - b->FXwindowHack = GL_FALSE; - } - /* - fprintf(stderr, - "voodoo %d, wid %d height %d hack: usable %d active %d\n", - hw, b->mesa_buffer.Width, b->mesa_buffer.Height, - b->FXisHackUsable, b->FXwindowHack); - */ - } - } - else { - _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n"); - _mesa_warning(NULL, " you have not defined the MESA_GLX_FX env. var.\n"); - _mesa_warning(NULL, " (check the README.3DFX file for more information).\n\n"); - _mesa_warning(NULL, " you can disable this message with a 'export MESA_GLX_FX=disable'.\n"); - } -#endif - return b; } -XMesaBuffer -XMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) -{ - return XMesaCreateWindowBuffer2( v, w, NULL ); -} - /** * Create a new XMesaBuffer from an X pixmap. @@ -1737,10 +1652,9 @@ XMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) * \c GLX_DIRECT_COLOR visual for the pixmap * \returns new XMesaBuffer or NULL if error */ -XMesaBuffer +PUBLIC XMesaBuffer XMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) { - int client = 0; XMesaBuffer b; assert(v); @@ -1749,11 +1663,7 @@ XMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) if (!b) return NULL; -#ifdef XFree86Server - client = CLIENT_ID(((XMesaDrawable)p)->id); -#endif - - if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode, + if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, (XMesaDrawable) p, cmap)) { xmesa_free_buffer(b); return NULL; @@ -1768,10 +1678,7 @@ XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, unsigned int width, unsigned int height) { -#ifdef XFree86Server - return 0; -#else - int client = 0; +#ifndef XFree86Server XMesaWindow root; XMesaDrawable drawable; /* X Pixmap Drawable */ XMesaBuffer b; @@ -1787,13 +1694,15 @@ XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, if (!b) return NULL; - if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode, + if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, drawable, cmap)) { xmesa_free_buffer(b); return NULL; } return b; +#else + return 0; #endif } @@ -1802,7 +1711,7 @@ XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, /* * Deallocate an XMesaBuffer structure and all related info. */ -void +PUBLIC void XMesaDestroyBuffer(XMesaBuffer b) { xmesa_free_buffer(b); @@ -1845,6 +1754,7 @@ GLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) /* * Bind buffer b to context c and make c the current rendering context. */ +PUBLIC GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, XMesaBuffer readBuffer ) { @@ -1852,15 +1762,6 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, if (!drawBuffer || !readBuffer) return GL_FALSE; /* must specify buffers! */ -#ifdef FX - if (drawBuffer->FXctx) { - fxMesaMakeCurrent(drawBuffer->FXctx); - - c->xm_buffer = drawBuffer; - - return GL_TRUE; - } -#endif if (&(c->mesa) == _mesa_get_current_context() && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer && c->mesa.ReadBuffer == &readBuffer->mesa_buffer @@ -1871,6 +1772,11 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, c->xm_buffer = drawBuffer; +#ifdef FX + if (FXmakeCurrent( drawBuffer )) + return GL_TRUE; +#endif + /* Call this periodically to detect when the user has begun using * GL rendering from multiple threads. */ @@ -1958,12 +1864,12 @@ XMesaBuffer XMesaGetCurrentReadBuffer( void ) } +#ifdef XFree86Server +PUBLIC GLboolean XMesaForceCurrent(XMesaContext c) { if (c) { -#ifdef XGLServer _glapi_set_dispatch(c->mesa.CurrentDispatch); -#endif if (&(c->mesa) != _mesa_get_current_context()) { _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer); @@ -1976,6 +1882,7 @@ GLboolean XMesaForceCurrent(XMesaContext c) } +PUBLIC GLboolean XMesaLoseCurrent(XMesaContext c) { (void) c; @@ -1984,157 +1891,30 @@ GLboolean XMesaLoseCurrent(XMesaContext c) } +PUBLIC GLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask ) { _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask); return GL_TRUE; } +#endif /* XFree86Server */ -/* - * Switch 3Dfx support hack between window and full-screen mode. - */ +#ifndef FX GLboolean XMesaSetFXmode( GLint mode ) { -#ifdef FX - const char *fx = _mesa_getenv("MESA_GLX_FX"); - if (fx && fx[0] != 'd') { - GET_CURRENT_CONTEXT(ctx); - GrHwConfiguration hw; - if (!FX_grSstQueryHardware(&hw)) { - /*fprintf(stderr, "!grSstQueryHardware\n");*/ - return GL_FALSE; - } - if (hw.num_sst < 1) { - /*fprintf(stderr, "hw.num_sst < 1\n");*/ - return GL_FALSE; - } - if (ctx) { - /* [dBorca] Hack alert: - * oh, this is sooo wrong: ctx above is - * really an fxMesaContext, not an XMesaContext - */ - XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); - if (mode == XMESA_FX_WINDOW) { - if (xmbuf->FXisHackUsable) { - FX_grSstControl(GR_CONTROL_DEACTIVATE); - xmbuf->FXwindowHack = GL_TRUE; - return GL_TRUE; - } - } - else if (mode == XMESA_FX_FULLSCREEN) { - FX_grSstControl(GR_CONTROL_ACTIVATE); - xmbuf->FXwindowHack = GL_FALSE; - return GL_TRUE; - } - else { - /* Error: Bad mode value */ - } - } - } - /*fprintf(stderr, "fallthrough\n");*/ -#else (void) mode; -#endif return GL_FALSE; } - - - -#ifdef FX -/* - * Read image from VooDoo frame buffer into X/Mesa's back XImage. - */ -static void FXgetImage( XMesaBuffer b ) -{ - GET_CURRENT_CONTEXT(ctx); - static unsigned short pixbuf[MAX_WIDTH]; - GLuint x, y; - GLuint width, height; - XMesaContext xmesa = XMESA_CONTEXT(ctx); - -#ifdef XFree86Server - x = b->frontxrb->pixmap->x; - y = b->frontxrb->pixmap->y; - width = b->frontxrb->pixmap->width; - height = b->frontxrb->pixmap->height; - depth = b->frontxrb->pixmap->depth; -#else - xmesa_get_window_size(b->display, b, &width, &height); - x = y = 0; -#endif - if (b->mesa_buffer.Width != width || b->mesa_buffer.Height != height) { - b->mesa_buffer.Width = MIN2((int)width, b->FXctx->width); - b->mesa_buffer.Height = MIN2((int)height, b->FXctx->height); - if (b->mesa_buffer.Width & 1) - b->mesa_buffer.Width--; /* prevent odd width */ - } - - /* [dBorca] we're always in the right GR_COLORFORMAT... aren't we? */ - /* grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); */ - if (b->xm_visual->undithered_pf==PF_5R6G5B) { - /* Special case: 16bpp RGB */ - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, /* src buffer */ - 0, b->FXctx->height - b->mesa_buffer.Height, /*pos*/ - b->mesa_buffer.Width, b->mesa_buffer.Height, /* size */ - b->mesa_buffer.Width * sizeof(GLushort), /* stride */ - b->backxrb->ximage->data); /* dest buffer */ - } - else if (b->xm_visual->dithered_pf==PF_Dither - && GET_VISUAL_DEPTH(b->xm_visual)==8) { - /* Special case: 8bpp RGB */ - for (y=0;y<b->mesa_buffer.Height;y++) { - GLubyte *ptr = (GLubyte*) b->backxrb->ximage->data - + b->backxrb->ximage->bytes_per_line * y; - XDITHER_SETUP(y); - - /* read row from 3Dfx frame buffer */ - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, b->FXctx->height-(b->mesa_buffer.Height-y), - b->mesa_buffer.Width, 1, - 0, - pixbuf ); - - /* write to XImage back buffer */ - for (x=0;x<b->mesa_buffer.Width;x++) { - GLubyte r = (pixbuf[x] & 0xf800) >> 8; - GLubyte g = (pixbuf[x] & 0x07e0) >> 3; - GLubyte b = (pixbuf[x] & 0x001f) << 3; - *ptr++ = XDITHER( x, r, g, b); - } - } - } - else { - /* General case: slow! */ - for (y=0;y<b->mesa_buffer.Height;y++) { - /* read row from 3Dfx frame buffer */ - grLfbReadRegion( GR_BUFFER_FRONTBUFFER, - 0, b->FXctx->height-(b->mesa_buffer.Height-y), - b->mesa_buffer.Width, 1, - 0, - pixbuf ); - - /* write to XImage back buffer */ - for (x=0;x<b->mesa_buffer.Width;x++) { - XMesaPutPixel(b->backxrb->ximage,x,y, - xmesa_color_to_pixel(ctx, - (pixbuf[x] & 0xf800) >> 8, - (pixbuf[x] & 0x07e0) >> 3, - (pixbuf[x] & 0x001f) << 3, - 0xff, - b->xm_visual->undithered_pf)); - } - } - } - /* grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); */ -} #endif + /* * Copy the back buffer to the front buffer. If there's no back buffer * this is a no-op. */ +PUBLIC void XMesaSwapBuffers( XMesaBuffer b ) { GET_CURRENT_CONTEXT(ctx); @@ -2152,16 +1932,10 @@ void XMesaSwapBuffers( XMesaBuffer b ) if (b->db_mode) { #ifdef FX - if (b->FXctx) { - fxMesaSwapBuffers(); - - if (b->FXwindowHack) - FXgetImage(b); - else - return; - } + if (FXswapBuffers(b)) + return; #endif - if (b->backxrb->ximage) { + if (b->backxrb->ximage) { /* Copy Ximage (back buf) from client memory to server window */ #if defined(USE_XSHM) && !defined(XFree86Server) if (b->shm) { @@ -2228,13 +2002,8 @@ void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) if (b->db_mode) { int yTop = b->mesa_buffer.Height - y - height; #ifdef FX - if (b->FXctx) { - fxMesaSwapBuffers(); - if (b->FXwindowHack) - FXgetImage(b); - else - return; - } + if (FXswapBuffers(b)) + return; #endif if (b->backxrb->ximage) { /* Copy Ximage from host's memory to server's window */ @@ -2475,7 +2244,7 @@ unsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, * This is typically called when the window size changes and we need * to reallocate the buffer's back/depth/stencil/accum buffers. */ -void +PUBLIC void XMesaResizeBuffers( XMesaBuffer b ) { GET_CURRENT_CONTEXT(ctx); |