diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/glut/dos/glutint.h | 1 | ||||
-rw-r--r-- | src/glut/dos/init.c | 5 | ||||
-rw-r--r-- | src/glut/dos/window.c | 8 | ||||
-rw-r--r-- | src/mesa/Makefile.DJ | 6 | ||||
-rw-r--r-- | src/mesa/drivers/dos/dmesa.c | 33 | ||||
-rw-r--r-- | src/mesa/drivers/dos/video.c | 34 |
6 files changed, 57 insertions, 30 deletions
diff --git a/src/glut/dos/glutint.h b/src/glut/dos/glutint.h index 013b307e941..23ab169d399 100644 --- a/src/glut/dos/glutint.h +++ b/src/glut/dos/glutint.h @@ -103,6 +103,7 @@ extern GLUTidleCB g_idle_func; extern GLUTmenuStatusCB g_menu_status_func; extern GLuint g_bpp; /* HW: bits per pixel */ +extern GLuint g_alpha; /* HW: alpha bits */ extern GLuint g_depth; /* HW: depth bits */ extern GLuint g_stencil; /* HW: stencil bits */ extern GLuint g_accum; /* HW: accum bits */ diff --git a/src/glut/dos/init.c b/src/glut/dos/init.c index 22bab9f8afc..d30f270c646 100644 --- a/src/glut/dos/init.c +++ b/src/glut/dos/init.c @@ -35,6 +35,7 @@ #define DEFAULT_HEIGHT 300 #define DEFAULT_BPP 16 +#define ALPHA_SIZE 8 #define DEPTH_SIZE 16 #define STENCIL_SIZE 8 #define ACCUM_SIZE 16 @@ -42,6 +43,7 @@ GLuint g_bpp = DEFAULT_BPP; +GLuint g_alpha = ALPHA_SIZE; GLuint g_depth = DEPTH_SIZE; GLuint g_stencil = STENCIL_SIZE; GLuint g_accum = ACCUM_SIZE; @@ -67,6 +69,9 @@ void APIENTRY glutInit (int *argc, char **argv) if ((env = getenv("DMESA_GLUT_BPP")) != NULL) { g_bpp = atoi(env); } + if ((env = getenv("DMESA_GLUT_ALPHA")) != NULL) { + g_alpha = atoi(env); + } if ((env = getenv("DMESA_GLUT_DEPTH")) != NULL) { g_depth = atoi(env); } diff --git a/src/glut/dos/window.c b/src/glut/dos/window.c index 06e8ea9ead1..af00897f3e5 100644 --- a/src/glut/dos/window.c +++ b/src/glut/dos/window.c @@ -71,10 +71,10 @@ int APIENTRY glutCreateWindow (const char *title) if ((visual=DMesaCreateVisual(g_init_x + m8width, g_init_y + g_init_h, g_bpp, g_refresh, g_display_mode & GLUT_DOUBLE, !(g_display_mode & GLUT_INDEX), - g_display_mode & GLUT_ALPHA, - g_display_mode & GLUT_DEPTH ? g_depth :0, - g_display_mode & GLUT_STENCIL ? g_stencil:0, - g_display_mode & GLUT_ACCUM ? g_accum :0))==NULL) { + (g_display_mode & GLUT_ALPHA ) ? g_alpha : 0, + (g_display_mode & GLUT_DEPTH ) ? g_depth : 0, + (g_display_mode & GLUT_STENCIL) ? g_stencil : 0, + (g_display_mode & GLUT_ACCUM ) ? g_accum : 0))==NULL) { return 0; } diff --git a/src/mesa/Makefile.DJ b/src/mesa/Makefile.DJ index 893a91bc1cb..a1b11d949be 100644 --- a/src/mesa/Makefile.DJ +++ b/src/mesa/Makefile.DJ @@ -78,13 +78,13 @@ CFLAGS += -I$(TOP)/include -I. -Imain -Iglapi ifeq ($(FX),1) CFLAGS += -D__DOS__ -DH3 CFLAGS += -I$(GLIDE)/include -DFX -LIBNAME = "MesaGL/FX DJGPP" +LIBNAME = "Mesa/FX DJGPP" else ifeq ($(MATROX),1) CFLAGS += -DMATROX -LIBNAME = "MesaGL/MGA DJGPP" +LIBNAME = "Mesa/MGA DJGPP" else -LIBNAME = "MesaGL DJGPP" +LIBNAME = "Mesa DJGPP" endif endif diff --git a/src/mesa/drivers/dos/dmesa.c b/src/mesa/drivers/dos/dmesa.c index 73b47569d9b..5d2cfb8b2bb 100644 --- a/src/mesa/drivers/dos/dmesa.c +++ b/src/mesa/drivers/dos/dmesa.c @@ -73,6 +73,7 @@ struct dmesa_visual { GLvisual gl_visual; GLboolean db_flag; /* double buffered? */ GLboolean rgb_flag; /* RGB mode? */ + GLboolean sw_alpha; /* use Mesa's alpha buffer? */ GLuint depth; /* bits per pixel (1, 8, 24, etc) */ #ifdef MATROX int stride_in_pixels; @@ -1335,7 +1336,7 @@ DMesaVisual DMesaCreateVisual (GLint width, GLint refresh, GLboolean dbFlag, GLboolean rgbFlag, - GLboolean alphaFlag, + GLint alphaSize, GLint depthSize, GLint stencilSize, GLint accumSize) @@ -1343,6 +1344,7 @@ DMesaVisual DMesaCreateVisual (GLint width, #ifndef FX DMesaVisual v; GLint redBits, greenBits, blueBits, alphaBits, indexBits; + GLboolean sw_alpha; #ifndef MATROX if (!dbFlag) { @@ -1370,6 +1372,7 @@ DMesaVisual DMesaCreateVisual (GLint width, blueBits = 8; break; case 15: + alphaBits = 1; redBits = 5; greenBits = 5; blueBits = 5; @@ -1391,6 +1394,23 @@ DMesaVisual DMesaCreateVisual (GLint width, } } + /* Okay, + * `alphaBits' is what we can provide + * `alphaSize' is what app requests + * + * Note that alpha buffering is required only if destination alpha is used + * in alpha blending; alpha blending modes that do not use destination alpha + * can be used w/o alpha buffer. + * + * We will use whatever ALPHA app requests. Later, in `CreateBuffer' we'll + * instruct Mesa to use its own ALPHA buffer, by passing a non-FALSE value + * for ALPHA to `_mesa_initialize_framebuffer'. + * + * Basically, 32bit modes provide ALPHA storage, but can we rely on this? + */ + alphaBits = alphaSize; + sw_alpha = (alphaBits > 0); + #ifndef MATROX if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) { return NULL; @@ -1401,10 +1421,6 @@ DMesaVisual DMesaCreateVisual (GLint width, } #endif - if (alphaFlag && (alphaBits==0)) { - alphaBits = 8; - } - if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) { /* Create core visual */ _mesa_initialize_visual((GLvisual *)v, @@ -1421,12 +1437,13 @@ DMesaVisual DMesaCreateVisual (GLint width, accumSize, /* accumRed */ accumSize, /* accumGreen */ accumSize, /* accumBlue */ - alphaFlag?accumSize:0, /* accumAlpha */ + alphaBits?accumSize:0, /* accumAlpha */ 1); /* numSamples */ v->depth = colDepth; v->db_flag = dbFlag; v->rgb_flag = rgbFlag; + v->sw_alpha = sw_alpha; v->zbuffer = (depthSize > 0) ? 1 : 0; #ifdef MATROX @@ -1451,7 +1468,7 @@ DMesaVisual DMesaCreateVisual (GLint width, if (depthSize > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = depthSize; } if (stencilSize > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = stencilSize; } if (accumSize > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = accumSize; } - if (alphaFlag) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = 1; } + if (alphaSize) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = alphaSize; } fx_attrib[i++] = FXMESA_COLORDEPTH; fx_attrib[i++] = colDepth; fx_attrib[i] = FXMESA_NONE; @@ -1493,7 +1510,7 @@ DMesaBuffer DMesaCreateBuffer (DMesaVisual visual, visual->zbuffer == 1, ((GLvisual *)visual)->stencilBits > 0, ((GLvisual *)visual)->accumRedBits > 0, - ((GLvisual *)visual)->alphaBits > 0); + visual->sw_alpha); b->xpos = xpos; b->ypos = ypos; b->width = width; diff --git a/src/mesa/drivers/dos/video.c b/src/mesa/drivers/dos/video.c index 35c643b4c9a..5432141bb0d 100644 --- a/src/mesa/drivers/dos/video.c +++ b/src/mesa/drivers/dos/video.c @@ -23,10 +23,10 @@ */ /* - * DOS/DJGPP device driver v1.3 for Mesa + * DOS/DJGPP device driver v1.4 for Mesa * * Copyright (C) 2002 - Borca Daniel - * Email : [email protected] + * Email : [email protected] * Web : http://www.geocities.com/dborca * * Thanks to CrazyPyro (Neil Funk) for FakeColor @@ -163,7 +163,11 @@ static int vl_mixfix32 (fixed r, fixed g, fixed b) #define vl_mixrgba24 vl_mixrgb24 static int vl_mixrgba32 (const unsigned char rgba[]) { - return (rgba[3]<<24)|(rgba[0]<<16)|(rgba[1]<<8)|(rgba[2]); + /* Hack alert: + * currently, DMesa uses Mesa's alpha buffer; + * so we don't really care about alpha value here... + */ + return /*(rgba[3]<<24)|*/(rgba[0]<<16)|(rgba[1]<<8)|(rgba[2]); } @@ -175,11 +179,11 @@ static int vl_mixrgba32 (const unsigned char rgba[]) * * Note: - */ -static int vl_mixrgb8fake (const unsigned char rgba[]) +static int vl_mixrgb8fake (const unsigned char rgb[]) { - return array_b[rgba[2]]*G_CNT*R_CNT - + array_g[rgba[1]]*R_CNT - + array_r[rgba[0]]; + return array_b[rgb[2]]*G_CNT*R_CNT + + array_g[rgb[1]]*R_CNT + + array_r[rgb[0]]; } #define vl_mixrgb8 vl_mixrgb8fake static int vl_mixrgb15 (const unsigned char rgb[]) @@ -205,21 +209,21 @@ static int vl_mixrgb32 (const unsigned char rgb[]) * * Note: uses current read buffer */ -static void v_getrgba8fake6 (unsigned int offset, unsigned char rgba[]) +static void v_getrgba8fake6 (unsigned int offset, unsigned char rgba[4]) { word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]]; rgba[0] = _rgb_scale_6[(c >> 16) & 0x3F]; rgba[1] = _rgb_scale_6[(c >> 8) & 0x3F]; rgba[2] = _rgb_scale_6[c & 0x3F]; - rgba[3] = c >> 24; + /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */ } -static void v_getrgba8fake8 (unsigned int offset, unsigned char rgba[]) +static void v_getrgba8fake8 (unsigned int offset, unsigned char rgba[4]) { word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]]; rgba[0] = c >> 16; rgba[1] = c >> 8; rgba[2] = c; - rgba[3] = c >> 24; + /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */ } #define v_getrgba8 v_getrgba8fake6 static void v_getrgba15 (unsigned int offset, unsigned char rgba[4]) @@ -235,7 +239,7 @@ static void v_getrgba15 (unsigned int offset, unsigned char rgba[4]) rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F]; rgba[2] = _rgb_scale_5[c & 0x1F]; #endif - rgba[3] = 255; + /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */ } static void v_getrgba16 (unsigned int offset, unsigned char rgba[4]) { @@ -249,7 +253,7 @@ static void v_getrgba16 (unsigned int offset, unsigned char rgba[4]) rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F]; rgba[2] = _rgb_scale_5[c & 0x1F]; #endif - rgba[3] = 255; + /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */ } static void v_getrgba24 (unsigned int offset, unsigned char rgba[4]) { @@ -257,7 +261,7 @@ static void v_getrgba24 (unsigned int offset, unsigned char rgba[4]) rgba[0] = c >> 16; rgba[1] = c >> 8; rgba[2] = c; - rgba[3] = 255; + /*rgba[3] = 255;*/ /* dummy alpha; we have separate SW alpha, so ignore */ } static void v_getrgba32 (unsigned int offset, unsigned char rgba[4]) { @@ -265,7 +269,7 @@ static void v_getrgba32 (unsigned int offset, unsigned char rgba[4]) rgba[0] = c >> 16; rgba[1] = c >> 8; rgba[2] = c; - rgba[3] = c >> 24; + /*rgba[3] = c >> 24;*/ /* dummy alpha; we have separate SW alpha, so ignore */ } |