|
|
@@ -1557,12 +1557,6 @@ PUBLIC |
|
|
|
void XMesaDestroyContext( XMesaContext c ) |
|
|
|
{ |
|
|
|
GLcontext *mesaCtx = &c->mesa; |
|
|
|
#ifdef FX |
|
|
|
XMesaBuffer xmbuf = XMESA_BUFFER(mesaCtx->DrawBuffer); |
|
|
|
|
|
|
|
if (xmbuf && xmbuf->FXctx) |
|
|
|
fxMesaDestroyContext(xmbuf->FXctx); |
|
|
|
#endif |
|
|
|
_swsetup_DestroyContext( mesaCtx ); |
|
|
|
_swrast_DestroyContext( mesaCtx ); |
|
|
|
_tnl_DestroyContext( mesaCtx ); |
|
|
@@ -1578,17 +1572,13 @@ 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; |
|
|
@@ -1596,7 +1586,6 @@ XMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c) |
|
|
|
|
|
|
|
assert(v); |
|
|
|
assert(w); |
|
|
|
(void) c; |
|
|
|
|
|
|
|
/* Check that window depth matches visual depth */ |
|
|
|
#ifdef XFree86Server |
|
|
@@ -1642,96 +1631,10 @@ XMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c) |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
PUBLIC XMesaBuffer |
|
|
|
XMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) |
|
|
|
{ |
|
|
|
return XMesaCreateWindowBuffer2( v, w, NULL ); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Create a new XMesaBuffer from an X pixmap. |
|
|
|
* |
|
|
@@ -1857,15 +1760,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 |
|
|
@@ -2006,141 +1900,12 @@ GLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mas |
|
|
|
*/ |
|
|
|
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. |
|
|
@@ -2162,16 +1927,6 @@ void XMesaSwapBuffers( XMesaBuffer b ) |
|
|
|
_mesa_notifySwapBuffers(ctx); |
|
|
|
|
|
|
|
if (b->db_mode) { |
|
|
|
#ifdef FX |
|
|
|
if (b->FXctx) { |
|
|
|
fxMesaSwapBuffers(); |
|
|
|
|
|
|
|
if (b->FXwindowHack) |
|
|
|
FXgetImage(b); |
|
|
|
else |
|
|
|
return; |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (b->backxrb->ximage) { |
|
|
|
/* Copy Ximage (back buf) from client memory to server window */ |
|
|
|
#if defined(USE_XSHM) && !defined(XFree86Server) |
|
|
@@ -2238,15 +1993,6 @@ 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; |
|
|
|
} |
|
|
|
#endif |
|
|
|
if (b->backxrb->ximage) { |
|
|
|
/* Copy Ximage from host's memory to server's window */ |
|
|
|
#if defined(USE_XSHM) && !defined(XFree86Server) |