GLframebuffer* FBMesaCreateWindowBuffer(FBDRI_Main *dpy, GLvisual *mesaVis) { return gl_create_framebuffer( mesaVis, // GLvisual *visual GL_FALSE, // GLboolean softwareDepth mesaVis->StencilBits > 0, // GLboolean softwareStencil mesaVis->AccumRedBits > 0, // GLboolean softwareAccum GL_FALSE); // GLboolean softwareAlpha }
/* * Create an Off-Screen Mesa rendering context. The only attribute needed is * an RGBA vs Color-Index mode flag. * * Input: format - either GL_RGBA or GL_COLOR_INDEX * sharelist - specifies another OSMesaContext with which to share * display lists. NULL indicates no sharing. * Return: an OSMesaContext or 0 if error */ OSMesaContext OSMesaCreateContext( GLenum format, OSMesaContext sharelist ) { OSMesaContext osmesa; GLfloat rscale, gscale, bscale, ascale; GLint rshift, gshift, bshift, ashift; GLint rind, gind, bind; GLint index_bits; GLboolean rgbmode; GLboolean swalpha; GLuint i4 = 1; GLubyte *i1 = (GLubyte *) &i4; GLint little_endian = *i1; swalpha = GL_FALSE; rind = gind = bind = 0; if (format==OSMESA_COLOR_INDEX) { rscale = gscale = bscale = ascale = 0.0; index_bits = 8; rshift = gshift = bshift = ashift = 0; rgbmode = GL_FALSE; } else if (format==OSMESA_RGBA) { rscale = gscale = bscale = ascale = 255.0; index_bits = 0; if (little_endian) { rshift = 0; gshift = 8; bshift = 16; ashift = 24; } else { rshift = 24; gshift = 16; bshift = 8; ashift = 0; } rgbmode = GL_TRUE; } else if (format==OSMESA_BGRA) { rscale = gscale = bscale = ascale = 255.0; index_bits = 0; if (little_endian) { ashift = 0; rshift = 8; gshift = 16; bshift = 24; } else { bshift = 24; gshift = 16; rshift = 8; ashift = 0; } rgbmode = GL_TRUE; } else if (format==OSMESA_ARGB) { rscale = gscale = bscale = ascale = 255.0; index_bits = 0; if (little_endian) { bshift = 0; gshift = 8; rshift = 16; ashift = 24; } else { ashift = 24; rshift = 16; gshift = 8; bshift = 0; } rgbmode = GL_TRUE; } else if (format==OSMESA_RGB) { rscale = gscale = bscale = ascale = 255.0; index_bits = 0; bshift = 0; gshift = 8; rshift = 16; ashift = 24; bind = 2; gind = 1; rind = 0; rgbmode = GL_TRUE; swalpha = GL_TRUE; } else if (format==OSMESA_BGR) { rscale = gscale = bscale = ascale = 255.0; index_bits = 0; bshift = 0; gshift = 8; rshift = 16; ashift = 24; bind = 0; gind = 1; rind = 2; rgbmode = GL_TRUE; swalpha = GL_TRUE; } else { return NULL; } osmesa = (OSMesaContext) calloc( 1, sizeof(struct osmesa_context) ); if (osmesa) { osmesa->gl_visual = gl_create_visual( rgbmode, swalpha, /* software alpha */ GL_FALSE, /* db_flag */ DEPTH_BITS, STENCIL_BITS, ACCUM_BITS, index_bits, rscale, gscale, bscale, ascale ); if (!osmesa->gl_visual) { return NULL; } osmesa->gl_ctx = gl_create_context( osmesa->gl_visual, sharelist ? sharelist->gl_ctx : NULL, (void *) osmesa ); if (!osmesa->gl_ctx) { gl_destroy_visual( osmesa->gl_visual ); free(osmesa); return NULL; } osmesa->gl_buffer = gl_create_framebuffer( osmesa->gl_visual ); if (!osmesa->gl_buffer) { gl_destroy_visual( osmesa->gl_visual ); gl_destroy_context( osmesa->gl_ctx ); free(osmesa); return NULL; } osmesa->format = format; osmesa->buffer = NULL; osmesa->width = 0; osmesa->height = 0; osmesa->pixel = 0; osmesa->clearpixel = 0; osmesa->rowlength = 0; osmesa->yup = GL_TRUE; osmesa->rshift = rshift; osmesa->gshift = gshift; osmesa->bshift = bshift; osmesa->ashift = ashift; osmesa->rind = rind; osmesa->gind = gind; osmesa->bind = bind; } return osmesa; }