Fix up alpha buffer handling for Windows.
- add two new Pixel Format Descriptors that do not have alpha bits to mirror the two that do. - add logic to wglChoosePixelFormat to match PFD's with respect to alpha. - Create/clear software alpha buffer as required. Now a wgl or GLUT program can control the creation of a software alpha buffer via the PFD or GLUT parms, respectively.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: wmesa.h,v 1.1 1999/08/19 00:55:40 jtg Exp $ */
|
/* $Id: wmesa.h,v 1.2 2002/04/23 18:23:32 kschultz Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -24,8 +24,17 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: wmesa.h,v $
|
* $Log: wmesa.h,v $
|
||||||
* Revision 1.1 1999/08/19 00:55:40 jtg
|
* Revision 1.2 2002/04/23 18:23:32 kschultz
|
||||||
* Initial revision
|
* Fix up alpha buffer handling for Windows.
|
||||||
|
* - add two new Pixel Format Descriptors that do not have alpha bits to
|
||||||
|
* mirror the two that do.
|
||||||
|
* - add logic to wglChoosePixelFormat to match PFD's with respect to alpha.
|
||||||
|
* - Create/clear software alpha buffer as required.
|
||||||
|
* Now a wgl or GLUT program can control the creation of a software alpha
|
||||||
|
* buffer via the PFD or GLUT parms, respectively.
|
||||||
|
*
|
||||||
|
* Revision 1.1.1.1 1999/08/19 00:55:40 jtg
|
||||||
|
* Imported sources
|
||||||
*
|
*
|
||||||
* Revision 3.2 1999/01/03 02:54:45 brianp
|
* Revision 3.2 1999/01/03 02:54:45 brianp
|
||||||
* updated per Ted Jump
|
* updated per Ted Jump
|
||||||
@@ -101,13 +110,17 @@ typedef struct wmesa_context *WMesaContext;
|
|||||||
* GL_FALSE = color index mode
|
* GL_FALSE = color index mode
|
||||||
* db_flag - GL_TRUE = double-buffered,
|
* db_flag - GL_TRUE = double-buffered,
|
||||||
* GL_FALSE = single buffered
|
* GL_FALSE = single buffered
|
||||||
|
* alpha_flag - GL_TRUE = create software alpha buffer,
|
||||||
|
* GL_FALSE = no software alpha buffer
|
||||||
*
|
*
|
||||||
* Note: Indexed mode requires double buffering under Windows.
|
* Note: Indexed mode requires double buffering under Windows.
|
||||||
*
|
*
|
||||||
* Return: a WMesa_context or NULL if error.
|
* Return: a WMesa_context or NULL if error.
|
||||||
*/
|
*/
|
||||||
extern WMesaContext WMesaCreateContext(HWND hWnd,HPALETTE* pPal,
|
extern WMesaContext WMesaCreateContext(HWND hWnd,HPALETTE* pPal,
|
||||||
GLboolean rgb_flag,GLboolean db_flag);
|
GLboolean rgb_flag,
|
||||||
|
GLboolean db_flag,
|
||||||
|
GLboolean alpha_flag);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: wgl.c,v 1.9 2001/09/18 16:39:38 kschultz Exp $ */
|
/* $Id: wgl.c,v 1.10 2002/04/23 18:23:33 kschultz Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@@ -100,6 +100,7 @@ int qt_ext = sizeof(ext) / sizeof(ext[0]);
|
|||||||
|
|
||||||
struct __pixelformat__ pix[] =
|
struct __pixelformat__ pix[] =
|
||||||
{
|
{
|
||||||
|
/* Double Buffer, alpha */
|
||||||
{ { sizeof(PIXELFORMATDESCRIPTOR), 1,
|
{ { sizeof(PIXELFORMATDESCRIPTOR), 1,
|
||||||
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
|
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
|
||||||
PFD_TYPE_RGBA,
|
PFD_TYPE_RGBA,
|
||||||
@@ -107,6 +108,7 @@ struct __pixelformat__ pix[] =
|
|||||||
0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
|
0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
|
||||||
GL_TRUE
|
GL_TRUE
|
||||||
},
|
},
|
||||||
|
/* Single Buffer, alpha */
|
||||||
{ { sizeof(PIXELFORMATDESCRIPTOR), 1,
|
{ { sizeof(PIXELFORMATDESCRIPTOR), 1,
|
||||||
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_GENERIC_FORMAT,
|
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_GENERIC_FORMAT,
|
||||||
PFD_TYPE_RGBA,
|
PFD_TYPE_RGBA,
|
||||||
@@ -114,6 +116,22 @@ struct __pixelformat__ pix[] =
|
|||||||
0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
|
0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
|
||||||
GL_FALSE
|
GL_FALSE
|
||||||
},
|
},
|
||||||
|
/* Double Buffer, no alpha */
|
||||||
|
{ { sizeof(PIXELFORMATDESCRIPTOR), 1,
|
||||||
|
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
|
||||||
|
PFD_TYPE_RGBA,
|
||||||
|
24, 8, 0, 8, 8, 8, 16, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
|
||||||
|
GL_TRUE
|
||||||
|
},
|
||||||
|
/* Single Buffer, no alpha */
|
||||||
|
{ { sizeof(PIXELFORMATDESCRIPTOR), 1,
|
||||||
|
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_GENERIC_FORMAT,
|
||||||
|
PFD_TYPE_RGBA,
|
||||||
|
24, 8, 0, 8, 8, 8, 16, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
|
||||||
|
GL_FALSE
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
int qt_pix = sizeof(pix) / sizeof(pix[0]);
|
int qt_pix = sizeof(pix) / sizeof(pix[0]);
|
||||||
@@ -158,7 +176,8 @@ WGLAPI HGLRC GLAPIENTRY wglCreateContext(HDC hdc)
|
|||||||
if ( wgl_ctx[i].ctx == NULL )
|
if ( wgl_ctx[i].ctx == NULL )
|
||||||
{
|
{
|
||||||
wgl_ctx[i].ctx = WMesaCreateContext( hWnd, NULL, GL_TRUE,
|
wgl_ctx[i].ctx = WMesaCreateContext( hWnd, NULL, GL_TRUE,
|
||||||
pix[curPFD-1].doubleBuffered );
|
pix[curPFD-1].doubleBuffered,
|
||||||
|
pix[curPFD-1].pfd.cAlphaBits ? GL_TRUE : GL_FALSE);
|
||||||
if (wgl_ctx[i].ctx == NULL)
|
if (wgl_ctx[i].ctx == NULL)
|
||||||
break;
|
break;
|
||||||
wgl_ctx[i].hdc = hdc;
|
wgl_ctx[i].hdc = hdc;
|
||||||
@@ -559,6 +578,8 @@ WGLAPI int GLAPIENTRY wglChoosePixelFormat(HDC hdc,
|
|||||||
continue;
|
continue;
|
||||||
if(ppfd->iPixelType != pix[i].pfd.iPixelType)
|
if(ppfd->iPixelType != pix[i].pfd.iPixelType)
|
||||||
delta++;
|
delta++;
|
||||||
|
if(ppfd->cAlphaBits != pix[i].pfd.cAlphaBits)
|
||||||
|
delta++;
|
||||||
if(delta < bestdelta)
|
if(delta < bestdelta)
|
||||||
{
|
{
|
||||||
best = i + 1;
|
best = i + 1;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: wmesa.c,v 1.26 2002/03/16 00:53:15 brianp Exp $ */
|
/* $Id: wmesa.c,v 1.27 2002/04/23 18:23:33 kschultz Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Windows (Win32) device driver for Mesa 3.4
|
* Windows (Win32) device driver for Mesa 3.4
|
||||||
@@ -396,6 +396,13 @@ static clear(GLcontext* ctx, GLbitfield mask,
|
|||||||
/* sanity check - can't have right(stereo) buffers */
|
/* sanity check - can't have right(stereo) buffers */
|
||||||
assert((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_RIGHT_BIT)) == 0);
|
assert((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_RIGHT_BIT)) == 0);
|
||||||
|
|
||||||
|
/* clear alpha */
|
||||||
|
if ((mask & (DD_FRONT_LEFT_BIT | DD_BACK_RIGHT_BIT)) &&
|
||||||
|
ctx->DrawBuffer->UseSoftwareAlphaBuffers &&
|
||||||
|
ctx->Color.ColorMask[ACOMP]) {
|
||||||
|
_mesa_clear_alpha_buffers( ctx );
|
||||||
|
}
|
||||||
|
|
||||||
if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
|
if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
|
||||||
if (mask & DD_BACK_LEFT_BIT) {
|
if (mask & DD_BACK_LEFT_BIT) {
|
||||||
#if defined(USE_GDI_TO_CLEAR)
|
#if defined(USE_GDI_TO_CLEAR)
|
||||||
@@ -1240,7 +1247,8 @@ static void GetPalette(HPALETTE Pal,RGBQUAD *aRGB)
|
|||||||
|
|
||||||
WMesaContext WMesaCreateContext( HWND hWnd, HPALETTE* Pal,
|
WMesaContext WMesaCreateContext( HWND hWnd, HPALETTE* Pal,
|
||||||
GLboolean rgb_flag,
|
GLboolean rgb_flag,
|
||||||
GLboolean db_flag )
|
GLboolean db_flag,
|
||||||
|
GLboolean alpha_flag )
|
||||||
{
|
{
|
||||||
RECT CR;
|
RECT CR;
|
||||||
WMesaContext c;
|
WMesaContext c;
|
||||||
@@ -1318,7 +1326,8 @@ WMesaContext WMesaCreateContext( HWND hWnd, HPALETTE* Pal,
|
|||||||
c->gl_visual = _mesa_create_visual(rgb_flag,
|
c->gl_visual = _mesa_create_visual(rgb_flag,
|
||||||
db_flag, /* db_flag */
|
db_flag, /* db_flag */
|
||||||
GL_FALSE, /* stereo */
|
GL_FALSE, /* stereo */
|
||||||
8,8,8,8, /* r, g, b, a bits */
|
8,8,8, /* r, g, b bits */
|
||||||
|
alpha_flag ? 8 : 0, /* alpha bits */
|
||||||
0, /* index bits */
|
0, /* index bits */
|
||||||
16, /* depth_bits */
|
16, /* depth_bits */
|
||||||
8, /* stencil_bits */
|
8, /* stencil_bits */
|
||||||
@@ -1355,7 +1364,7 @@ WMesaContext WMesaCreateContext( HWND hWnd, HPALETTE* Pal,
|
|||||||
c->gl_visual->depthBits > 0,
|
c->gl_visual->depthBits > 0,
|
||||||
c->gl_visual->stencilBits > 0,
|
c->gl_visual->stencilBits > 0,
|
||||||
c->gl_visual->accumRedBits > 0,
|
c->gl_visual->accumRedBits > 0,
|
||||||
GL_FALSE /* s/w alpha */ );
|
alpha_flag /* s/w alpha */ );
|
||||||
if (!c->gl_buffer) {
|
if (!c->gl_buffer) {
|
||||||
_mesa_destroy_visual( c->gl_visual );
|
_mesa_destroy_visual( c->gl_visual );
|
||||||
_mesa_free_context_data( c->gl_ctx );
|
_mesa_free_context_data( c->gl_ctx );
|
||||||
|
Reference in New Issue
Block a user