clean up buffer creation code

This commit is contained in:
Brian Paul 2005-04-20 17:12:10 +00:00
parent fc8f202181
commit 8d51bbf2a3

View file

@ -329,11 +329,47 @@ static GLboolean window_exists( XMesaDisplay *dpy, Window win )
static XMesaBuffer XMesaBufferList = NULL;
/* Allocate a new XMesaBuffer, add to linked list */
static XMesaBuffer alloc_xmesa_buffer(void)
/**
* Allocate a new XMesaBuffer, initialize basic fields and add to
* the list of all buffers.
*/
static XMesaBuffer
alloc_xmesa_buffer(XMesaVisual vis, BufferType type, XMesaColormap cmap)
{
XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
if (b) {
b->display = vis->display;
b->xm_visual = vis;
b->type = type;
b->cmap = cmap;
_mesa_initialize_framebuffer(&b->mesa_buffer,
&vis->mesa_visual,
vis->mesa_visual.depthBits > 0,
vis->mesa_visual.stencilBits > 0,
vis->mesa_visual.accumRedBits +
vis->mesa_visual.accumGreenBits +
vis->mesa_visual.accumBlueBits > 0,
vis->mesa_visual.alphaBits > 0
/*v->mesa_visual.numAuxBuffers > 0*/ );
/* XXX hack */
if (vis->mesa_visual.numAuxBuffers > 0)
b->mesa_buffer.UseSoftwareAuxBuffers = GL_TRUE;
/* determine back buffer implementation */
if (vis->mesa_visual.doubleBufferMode) {
if (vis->ximage_flag) {
b->db_state = BACK_XIMAGE;
}
else {
b->db_state = BACK_PIXMAP;
}
}
else {
b->db_state = 0;
}
/* insert into linked list */
b->Next = XMesaBufferList;
XMesaBufferList = b;
}
@ -618,14 +654,20 @@ void xmesa_alloc_back_buffer( XMesaBuffer b )
}
else if (b->db_state==BACK_PIXMAP) {
XMesaPixmap old_pixmap = b->backpixmap;
int width = b->mesa_buffer.Width, height = b->mesa_buffer.Height;
if (!width)
width = 1;
if (!height)
height = 1;
/* Free the old back pixmap */
if (b->backpixmap) {
XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
}
/* Allocate new back pixmap */
b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer,
b->mesa_buffer.Width,
b->mesa_buffer.Height,
width, height,
GET_VISUAL_DEPTH(b->xm_visual) );
b->backimage = NULL;
/* update other references to backpixmap */
@ -1719,8 +1761,8 @@ void XMesaDestroyContext( XMesaContext c )
* c - the context
* Return: new XMesaBuffer or NULL if error
*/
XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
XMesaContext c )
XMesaBuffer
XMesaCreateWindowBuffer2(XMesaVisual v, XMesaWindow w, XMesaContext c)
{
#ifndef XFree86Server
XWindowAttributes attr;
@ -1729,21 +1771,16 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
char *fxEnvVar;
#endif
int client = 0;
XMesaBuffer b = alloc_xmesa_buffer();
if (!b) {
return NULL;
}
(void) c;
#ifdef XFree86Server
client = CLIENT_ID(((XMesaDrawable)w)->id);
#endif
XMesaBuffer b;
XMesaColormap cmap;
assert(v);
(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);
@ -1759,47 +1796,28 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
}
#endif
b->xm_visual = v;
b->type = WINDOW;
b->display = v->display;
/* Find colormap */
#ifdef XFree86Server
b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
#else
if (attr.colormap) {
b->cmap = attr.colormap;
cmap = attr.colormap;
}
else {
_mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
/* this is weird, a window w/out a colormap!? */
/* OK, let's just allocate a new one and hope for the best */
b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
}
#endif
/* determine back buffer implementation */
if (v->mesa_visual.doubleBufferMode) {
if (v->ximage_flag) {
b->db_state = BACK_XIMAGE;
}
else {
b->db_state = BACK_PIXMAP;
}
b = alloc_xmesa_buffer(v, WINDOW, cmap);
if (!b) {
return NULL;
}
else {
b->db_state = 0;
}
_mesa_initialize_framebuffer(&b->mesa_buffer,
&v->mesa_visual,
v->mesa_visual.depthBits > 0,
v->mesa_visual.stencilBits > 0,
v->mesa_visual.accumRedBits > 0,
v->mesa_visual.alphaBits > 0 );
/* XXX hack */
b->mesa_buffer.UseSoftwareAuxBuffers = GL_TRUE;
if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
(XMesaDrawable)w, b->cmap )) {
(XMesaDrawable)w, cmap )) {
free_xmesa_buffer(client, b);
return NULL;
}
@ -1886,7 +1904,8 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
}
XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
XMesaBuffer
XMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
{
return XMesaCreateWindowBuffer2( v, w, NULL );
}
@ -1901,49 +1920,23 @@ XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
* \c GLX_DIRECT_COLOR visual for the pixmap
* \returns new XMesaBuffer or NULL if error
*/
XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
XMesaPixmap p, XMesaColormap cmap )
XMesaBuffer
XMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
{
int client = 0;
XMesaBuffer b = alloc_xmesa_buffer();
XMesaBuffer b;
assert(v);
b = alloc_xmesa_buffer(v, PIXMAP, cmap);
if (!b) {
return NULL;
}
#ifdef XFree86Server
client = CLIENT_ID(((XMesaDrawable)p)->id);
#endif
assert(v);
b->xm_visual = v;
b->type = PIXMAP;
b->display = v->display;
b->cmap = cmap;
/* determine back buffer implementation */
if (v->mesa_visual.doubleBufferMode) {
if (v->ximage_flag) {
b->db_state = BACK_XIMAGE;
}
else {
b->db_state = BACK_PIXMAP;
}
}
else {
b->db_state = 0;
}
_mesa_initialize_framebuffer(&b->mesa_buffer,
&v->mesa_visual,
v->mesa_visual.depthBits > 0,
v->mesa_visual.stencilBits > 0,
v->mesa_visual.accumRedBits +
v->mesa_visual.accumGreenBits +
v->mesa_visual.accumBlueBits > 0,
v->mesa_visual.alphaBits > 0 );
if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
(XMesaDrawable)p, cmap)) {
free_xmesa_buffer(client, b);
@ -1955,8 +1948,9 @@ XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
unsigned int width, unsigned int height )
XMesaBuffer
XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
unsigned int width, unsigned int height)
{
#ifdef XFree86Server
return 0;
@ -1964,42 +1958,17 @@ XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
int client = 0;
XMesaWindow root;
XMesaDrawable drawable; /* X Pixmap Drawable */
XMesaBuffer b = alloc_xmesa_buffer();
XMesaBuffer b;
b = alloc_xmesa_buffer(v, PBUFFER, cmap);
if (!b) {
return NULL;
}
b->xm_visual = v;
b->type = PBUFFER;
b->display = v->display;
b->cmap = cmap;
/* allocate pixmap for front buffer */
root = RootWindow( v->display, v->visinfo->screen );
drawable = XCreatePixmap( v->display, root, width, height, v->visinfo->depth );
/* determine back buffer implementation */
if (v->mesa_visual.doubleBufferMode) {
if (v->ximage_flag) {
b->db_state = BACK_XIMAGE;
}
else {
b->db_state = BACK_PIXMAP;
}
}
else {
b->db_state = 0;
}
_mesa_initialize_framebuffer(&b->mesa_buffer,
&v->mesa_visual,
v->mesa_visual.depthBits > 0,
v->mesa_visual.stencilBits > 0,
v->mesa_visual.accumRedBits +
v->mesa_visual.accumGreenBits +
v->mesa_visual.accumBlueBits > 0,
v->mesa_visual.alphaBits > 0 );
if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
drawable, cmap)) {
free_xmesa_buffer(client, b);