prototype work for Pbuffer support
This commit is contained in:
parent
7e975ba3aa
commit
7d5656bee7
|
@ -1,4 +1,4 @@
|
|||
/* $Id: fakeglx.c,v 1.55 2001/08/20 16:44:43 brianp Exp $ */
|
||||
/* $Id: fakeglx.c,v 1.56 2001/09/01 20:23:25 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
@ -1696,6 +1696,15 @@ Fake_glXGetClientString( Display *dpy, int name )
|
|||
* GLX 1.3 and later
|
||||
*/
|
||||
|
||||
/* XXX Move this when done.
|
||||
* Create an XMesaBuffer as a Pbuffer.
|
||||
* New in Mesa 3.5.1 but untested.
|
||||
*/
|
||||
extern XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
|
||||
unsigned int width, unsigned int height );
|
||||
|
||||
|
||||
|
||||
static GLXFBConfig *
|
||||
Fake_glXChooseFBConfig( Display *dpy, int screen,
|
||||
const int *attribList, int *nitems )
|
||||
|
@ -1712,11 +1721,154 @@ static int
|
|||
Fake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
|
||||
int attribute, int *value )
|
||||
{
|
||||
XMesaVisual v = NULL; /* XXX Fix this */
|
||||
(void) dpy;
|
||||
(void) config;
|
||||
(void) attribute;
|
||||
(void) value;
|
||||
return 0;
|
||||
|
||||
if (!dpy || !config || !value)
|
||||
return -1;
|
||||
|
||||
switch (attribute) {
|
||||
case GLX_FBCONFIG_ID:
|
||||
case GLX_BUFFER_SIZE:
|
||||
if (v->mesa_visual.rgbMode)
|
||||
*value = v->mesa_visual.redBits + v->mesa_visual.greenBits +
|
||||
v->mesa_visual.blueBits + v->mesa_visual.alphaBits;
|
||||
else
|
||||
*value = v->mesa_visual.indexBits;
|
||||
break;
|
||||
case GLX_LEVEL:
|
||||
*value = v->level;
|
||||
break;
|
||||
case GLX_DOUBLEBUFFER:
|
||||
*value = v->mesa_visual.doubleBufferMode;
|
||||
break;
|
||||
case GLX_STEREO:
|
||||
*value = v->mesa_visual.stereoMode;
|
||||
break;
|
||||
case GLX_AUX_BUFFERS:
|
||||
*value = v->mesa_visual.numAuxBuffers;
|
||||
break;
|
||||
case GLX_RED_SIZE:
|
||||
*value = v->mesa_visual.redBits;
|
||||
break;
|
||||
case GLX_GREEN_SIZE:
|
||||
*value = v->mesa_visual.greenBits;
|
||||
break;
|
||||
case GLX_BLUE_SIZE:
|
||||
*value = v->mesa_visual.blueBits;
|
||||
break;
|
||||
case GLX_ALPHA_SIZE:
|
||||
*value = v->mesa_visual.alphaBits;
|
||||
break;
|
||||
case GLX_DEPTH_SIZE:
|
||||
*value = v->mesa_visual.depthBits;
|
||||
break;
|
||||
case GLX_STENCIL_SIZE:
|
||||
*value = v->mesa_visual.stencilBits;
|
||||
break;
|
||||
case GLX_ACCUM_RED_SIZE:
|
||||
*value = v->mesa_visual.accumRedBits;
|
||||
break;
|
||||
case GLX_ACCUM_GREEN_SIZE:
|
||||
*value = v->mesa_visual.accumGreenBits;
|
||||
break;
|
||||
case GLX_ACCUM_BLUE_SIZE:
|
||||
*value = v->mesa_visual.accumBlueBits;
|
||||
break;
|
||||
case GLX_ACCUM_ALPHA_SIZE:
|
||||
*value = v->mesa_visual.accumAlphaBits;
|
||||
break;
|
||||
case GLX_RENDER_TYPE:
|
||||
*value = 0; /* XXX ??? */
|
||||
break;
|
||||
case GLX_DRAWABLE_TYPE:
|
||||
*value = GLX_PBUFFER_BIT; /* XXX fix? */
|
||||
break;
|
||||
case GLX_X_RENDERABLE:
|
||||
*value = False; /* XXX ??? */
|
||||
break;
|
||||
case GLX_X_VISUAL_TYPE:
|
||||
switch (v->vishandle->class) {
|
||||
case GrayScale:
|
||||
*value = GLX_GRAY_SCALE;
|
||||
break;
|
||||
case StaticGray:
|
||||
*value = GLX_STATIC_GRAY;
|
||||
break;
|
||||
case StaticColor:
|
||||
*value = GLX_STATIC_COLOR;
|
||||
break;
|
||||
case PseudoColor:
|
||||
*value = GLX_PSEUDO_COLOR;
|
||||
break;
|
||||
case TrueColor:
|
||||
*value = GLX_TRUE_COLOR;
|
||||
break;
|
||||
case DirectColor:
|
||||
*value = GLX_DIRECT_COLOR;
|
||||
break;
|
||||
default:
|
||||
*value = 0;
|
||||
}
|
||||
break;
|
||||
case GLX_CONFIG_CAVEAT:
|
||||
*value = 0; /* XXX ??? */
|
||||
break;
|
||||
case GLX_TRANSPARENT_TYPE:
|
||||
if (v->level == 0) {
|
||||
/* normal planes */
|
||||
*value = GLX_NONE_EXT;
|
||||
}
|
||||
else if (v->level > 0) {
|
||||
/* overlay */
|
||||
if (v->mesa_visual.rgbMode) {
|
||||
*value = GLX_TRANSPARENT_RGB_EXT;
|
||||
}
|
||||
else {
|
||||
*value = GLX_TRANSPARENT_INDEX_EXT;
|
||||
}
|
||||
}
|
||||
else if (v->level < 0) {
|
||||
/* underlay */
|
||||
*value = GLX_NONE_EXT;
|
||||
}
|
||||
break;
|
||||
case GLX_TRANSPARENT_INDEX_VALUE:
|
||||
*value = transparent_pixel( v );
|
||||
break;
|
||||
case GLX_TRANSPARENT_RED_VALUE:
|
||||
*value = 0; /* not implemented */
|
||||
break;
|
||||
case GLX_TRANSPARENT_GREEN_VALUE:
|
||||
*value = 0; /* not implemented */
|
||||
break;
|
||||
case GLX_TRANSPARENT_BLUE_VALUE:
|
||||
*value = 0; /* not implemented */
|
||||
break;
|
||||
case GLX_TRANSPARENT_ALPHA_VALUE:
|
||||
*value = 0; /* not implemented */
|
||||
break;
|
||||
case GLX_MAX_PBUFFER_WIDTH:
|
||||
*value = DisplayWidth(dpy, v->vishandle->screen);
|
||||
break;
|
||||
case GLX_MAX_PBUFFER_HEIGHT:
|
||||
*value = DisplayHeight(dpy, v->vishandle->screen);
|
||||
break;
|
||||
case GLX_MAX_PBUFFER_PIXELS:
|
||||
*value = DisplayWidth(dpy, v->vishandle->screen) *
|
||||
DisplayHeight(dpy, v->vishandle->screen);
|
||||
break;
|
||||
case GLX_VISUAL_ID:
|
||||
*value = v->vishandle->visualid;
|
||||
break;
|
||||
default:
|
||||
return GLX_BAD_ATTRIBUTE;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1733,9 +1885,13 @@ Fake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
|
|||
static XVisualInfo *
|
||||
Fake_glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
|
||||
{
|
||||
(void) dpy;
|
||||
(void) config;
|
||||
return 0;
|
||||
if (dpy && config) {
|
||||
XMesaVisual v = (XMesaVisual) config;
|
||||
return v->vishandle;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1746,38 +1902,66 @@ Fake_glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
|
|||
(void) dpy;
|
||||
(void) config;
|
||||
(void) win;
|
||||
(void) attribList;
|
||||
return 0;
|
||||
(void) attribList; /* Ignored in GLX 1.3 */
|
||||
|
||||
return win; /* A hack for now */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Fake_glXDestroyWindow( Display *dpy, GLXWindow window )
|
||||
{
|
||||
(void) dpy;
|
||||
(void) window;
|
||||
return;
|
||||
XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable) window);
|
||||
if (b)
|
||||
XMesaDestroyBuffer(b);
|
||||
/* don't destroy X window */
|
||||
}
|
||||
|
||||
|
||||
/* XXX untested */
|
||||
static GLXPixmap
|
||||
Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
|
||||
const int *attribList )
|
||||
{
|
||||
XMesaVisual v = (XMesaVisual) config;
|
||||
XVisualInfo *visinfo;
|
||||
XMesaBuffer b;
|
||||
|
||||
(void) dpy;
|
||||
(void) config;
|
||||
(void) pixmap;
|
||||
(void) attribList;
|
||||
return 0;
|
||||
(void) attribList; /* Ignored in GLX 1.3 */
|
||||
|
||||
if (!dpy || !config || !pixmap)
|
||||
return 0;
|
||||
|
||||
visinfo = v->vishandle;
|
||||
|
||||
v = find_glx_visual( dpy, visinfo );
|
||||
if (!v) {
|
||||
v = create_glx_visual( dpy, visinfo );
|
||||
if (!v) {
|
||||
/* unusable visual */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
b = XMesaCreatePixmapBuffer( v, pixmap, 0 );
|
||||
if (!b) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return pixmap;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
Fake_glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
|
||||
{
|
||||
(void) dpy;
|
||||
(void) pixmap;
|
||||
return;
|
||||
XMesaBuffer b = XMesaFindBuffer(dpy, (XMesaDrawable)pixmap);
|
||||
if (b)
|
||||
XMesaDestroyBuffer(b);
|
||||
/* don't destroy X pixmap */
|
||||
}
|
||||
|
||||
|
||||
|
@ -1785,9 +1969,36 @@ static GLXPbuffer
|
|||
Fake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
|
||||
const int *attribList )
|
||||
{
|
||||
const int *attrib;
|
||||
int width = 0, height = 0;
|
||||
GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
|
||||
|
||||
(void) dpy;
|
||||
(void) config;
|
||||
(void) attribList;
|
||||
|
||||
for (attrib = attribList; attrib; attrib++) {
|
||||
switch (*attrib) {
|
||||
case GLX_PBUFFER_WIDTH:
|
||||
width = *(++attrib);
|
||||
break;
|
||||
case GLX_PBUFFER_HEIGHT:
|
||||
height = *(++attrib);
|
||||
break;
|
||||
case GLX_PRESERVED_CONTENTS:
|
||||
preserveContents = GL_TRUE; /* ignored */
|
||||
break;
|
||||
case GLX_LARGEST_PBUFFER:
|
||||
useLargest = GL_TRUE; /* ignored */
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (width == 0 || height == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1806,8 +2017,18 @@ Fake_glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
|
|||
{
|
||||
(void) dpy;
|
||||
(void) draw;
|
||||
(void) attribute;
|
||||
(void) value;
|
||||
|
||||
switch (attribute) {
|
||||
case GLX_WIDTH:
|
||||
case GLX_HEIGHT:
|
||||
case GLX_PRESERVED_CONTENTS:
|
||||
case GLX_LARGEST_PBUFFER:
|
||||
case GLX_FBCONFIG_ID:
|
||||
*value = 0;
|
||||
return;
|
||||
default:
|
||||
return; /* GLX_BAD_ATTRIBUTE? */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1815,12 +2036,13 @@ static GLXContext
|
|||
Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
|
||||
int renderType, GLXContext shareList, Bool direct )
|
||||
{
|
||||
(void) dpy;
|
||||
(void) config;
|
||||
(void) renderType;
|
||||
(void) shareList;
|
||||
(void) direct;
|
||||
return 0;
|
||||
XMesaVisual v = (XMesaVisual) config;
|
||||
|
||||
if (!dpy || !config ||
|
||||
(renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
|
||||
return 0;
|
||||
|
||||
return Fake_glXCreateContext(dpy, v->vishandle, shareList, direct);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1829,9 +2051,16 @@ Fake_glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
|
|||
{
|
||||
(void) dpy;
|
||||
(void) ctx;
|
||||
(void) attribute;
|
||||
(void) value;
|
||||
return 0;
|
||||
|
||||
switch (attribute) {
|
||||
case GLX_FBCONFIG_ID:
|
||||
case GLX_RENDER_TYPE:
|
||||
case GLX_SCREEN:
|
||||
*value = 0;
|
||||
return Success;
|
||||
default:
|
||||
return GLX_BAD_ATTRIBUTE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: xmesaP.h,v 1.23 2001/05/29 19:48:47 brianp Exp $ */
|
||||
/* $Id: xmesaP.h,v 1.24 2001/09/01 20:23:25 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
@ -147,6 +147,7 @@ struct xmesa_buffer {
|
|||
XMesaContext xm_context; /* the context associated with this buffer */
|
||||
XMesaDisplay *display;
|
||||
GLboolean pixmap_flag; /* is the buffer a Pixmap? */
|
||||
GLboolean pbuffer_flag; /* is the buffer a Pbuffer? */
|
||||
XMesaDrawable frontbuffer; /* either a window or pixmap */
|
||||
XMesaPixmap backpixmap; /* back buffer Pixmap */
|
||||
XMesaImage *backimage; /* back buffer simulated XImage */
|
||||
|
|
Loading…
Reference in New Issue