diff --git a/src/savage_dri.c b/src/savage_dri.c index 6f79d94..b77ae16 100644 --- a/src/savage_dri.c +++ b/src/savage_dri.c @@ -55,6 +55,23 @@ #include "savage_dri.h" #include "savage_sarea.h" +static struct { + int bpp; + int redSize; + int greenSize; + int blueSize; + int alphaSize; + int redMask; + int greenMask; + int blueMask; + int alphaMask; + int depthSize; +} SAVAGEVisTable[] = { + { 16, 5, 6, 5, 0, 0x0000F800, 0x000007E0, 0x0000001F, 0, 16 }, + { 32, 8, 8, 8, 0, 0x00FF0000, 0x0000FF00, 0x000000FF, 0, 24 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } +}; + static char SAVAGEKernelDriverName[] = "savage"; static char SAVAGEClientDriverName[] = "savage"; @@ -95,7 +112,7 @@ static Bool SAVAGEInitVisualConfigs( Scr __GLXvisualConfig *pConfigs = 0; SAVAGEConfigPrivPtr pSAVAGEConfigs = 0; SAVAGEConfigPrivPtr *pSAVAGEConfigPtrs = 0; - int i, db, depth, stencil, accum; + int i, db, stencil, accum, visNum; switch ( pScrn->bitsPerPixel ) { case 8: @@ -103,6 +120,7 @@ static Bool SAVAGEInitVisualConfigs( Scr break; case 16: + case 32: numConfigs = 8; pConfigs = (__GLXvisualConfig*)calloc( sizeof(__GLXvisualConfig), @@ -130,117 +148,32 @@ static Bool SAVAGEInitVisualConfigs( Scr pSAVAGEConfigPtrs[i] = &pSAVAGEConfigs[i]; } - i = 0; - depth = 1; - for ( accum = 0 ; accum <= 1 ; accum++ ) { - for ( stencil = 0 ; stencil <= 1 ; stencil++ ) { - for ( db = 1 ; db >= 0 ; db-- ) { - pConfigs[i].vid = -1; - pConfigs[i].class = -1; - pConfigs[i].rgba = TRUE; - pConfigs[i].redSize = 5; - pConfigs[i].greenSize = 6; - pConfigs[i].blueSize = 5; - pConfigs[i].alphaSize = 0; - pConfigs[i].redMask = 0x0000F800; - pConfigs[i].greenMask = 0x000007E0; - pConfigs[i].blueMask = 0x0000001F; - pConfigs[i].alphaMask = 0; - if ( accum ) { - pConfigs[i].accumRedSize = 16; - pConfigs[i].accumGreenSize = 16; - pConfigs[i].accumBlueSize = 16; - pConfigs[i].accumAlphaSize = 0; - } else { - pConfigs[i].accumRedSize = 0; - pConfigs[i].accumGreenSize = 0; - pConfigs[i].accumBlueSize = 0; - pConfigs[i].accumAlphaSize = 0; - } - if ( db ) { - pConfigs[i].doubleBuffer = TRUE; - } else { - pConfigs[i].doubleBuffer = FALSE; - } - pConfigs[i].stereo = FALSE; - pConfigs[i].bufferSize = 16; - if ( depth ) { - pConfigs[i].depthSize = 16; - } else { - pConfigs[i].depthSize = 0; - } - if ( stencil ) { - pConfigs[i].stencilSize = 8; - } else { - pConfigs[i].stencilSize = 0; - } - pConfigs[i].auxBuffers = 0; - pConfigs[i].level = 0; - if ( accum || stencil ) { - pConfigs[i].visualRating = GLX_SLOW_CONFIG; - } else { - pConfigs[i].visualRating = GLX_NONE; - } - pConfigs[i].transparentPixel = GLX_NONE; - pConfigs[i].transparentRed = 0; - pConfigs[i].transparentGreen = 0; - pConfigs[i].transparentBlue = 0; - pConfigs[i].transparentAlpha = 0; - pConfigs[i].transparentIndex = 0; - i++; - } - } - } - if ( i != numConfigs ) { - xf86DrvMsg( pScrn->scrnIndex, X_ERROR, - "[drm] Incorrect initialization of visuals\n" ); - return FALSE; - } - break; - - case 32: - numConfigs = 8; - - pConfigs = (__GLXvisualConfig*)calloc( sizeof(__GLXvisualConfig), - numConfigs ); - if ( !pConfigs ) { - return FALSE; + for (visNum = 0; SAVAGEVisTable[visNum].bpp != 0; visNum++) { + if ( SAVAGEVisTable[visNum].bpp == pScrn->bitsPerPixel ) + break; } - - pSAVAGEConfigs = (SAVAGEConfigPrivPtr)calloc( sizeof(SAVAGEConfigPrivRec), - numConfigs ); - if ( !pSAVAGEConfigs ) { - free( pConfigs ); - return FALSE; - } - - pSAVAGEConfigPtrs = (SAVAGEConfigPrivPtr*)calloc( sizeof(SAVAGEConfigPrivPtr), - numConfigs ); - if ( !pSAVAGEConfigPtrs ) { + if ( SAVAGEVisTable[visNum].bpp == 0 ) { free( pConfigs ); free( pSAVAGEConfigs ); - return FALSE; - } - - for ( i = 0 ; i < numConfigs ; i++ ) { - pSAVAGEConfigPtrs[i] = &pSAVAGEConfigs[i]; + return FALSE; } i = 0; for ( accum = 0 ; accum <= 1 ; accum++ ) { for ( stencil = 0 ; stencil <= 1 ; stencil++ ) { for ( db = 1 ; db >= 0 ; db-- ) { - pConfigs[i].vid = -1; - pConfigs[i].class = -1; - pConfigs[i].rgba = TRUE; - pConfigs[i].redSize = 8; - pConfigs[i].greenSize = 8; - pConfigs[i].blueSize = 8; - pConfigs[i].alphaSize = 0; - pConfigs[i].redMask = 0x00FF0000; - pConfigs[i].greenMask = 0x0000FF00; - pConfigs[i].blueMask = 0x000000FF; - pConfigs[i].alphaMask = 0; + pConfigs[i].vid = -1; + pConfigs[i].class = -1; + pConfigs[i].rgba = TRUE; + pConfigs[i].redSize = SAVAGEVisTable[visNum].redSize; + pConfigs[i].greenSize = SAVAGEVisTable[visNum].greenSize; + pConfigs[i].blueSize = SAVAGEVisTable[visNum].blueSize; + pConfigs[i].alphaSize = SAVAGEVisTable[visNum].alphaSize; + pConfigs[i].redMask = SAVAGEVisTable[visNum].redMask; + pConfigs[i].greenMask = SAVAGEVisTable[visNum].greenMask; + pConfigs[i].blueMask = SAVAGEVisTable[visNum].blueMask; + pConfigs[i].alphaMask = SAVAGEVisTable[visNum].alphaMask; + if ( accum ) { pConfigs[i].accumRedSize = 16; pConfigs[i].accumGreenSize = 16; @@ -256,24 +189,27 @@ static Bool SAVAGEInitVisualConfigs( Scr pConfigs[i].doubleBuffer = TRUE; } else { pConfigs[i].doubleBuffer = FALSE; - } + } pConfigs[i].stereo = FALSE; - pConfigs[i].bufferSize = 32; + pConfigs[i].bufferSize = pScrn->bitsPerPixel; + pConfigs[i].depthSize = SAVAGEVisTable[visNum].depthSize; if ( stencil ) { - pConfigs[i].depthSize = 24; - pConfigs[i].stencilSize = 8; - } - else { - pConfigs[i].depthSize = 24; - pConfigs[i].stencilSize = 0; + pConfigs[i].stencilSize = 8; + } else { + pConfigs[i].stencilSize = 0; } + pConfigs[i].auxBuffers = 0; pConfigs[i].level = 0; - if ( accum ) { + + pConfigs[i].visualRating = GLX_NONE; + if ( pScrn->bitsPerPixel == 16 ) { + if ( accum || stencil ) { + pConfigs[i].visualRating = GLX_SLOW_CONFIG; + } + } else if ( accum ) { pConfigs[i].visualRating = GLX_SLOW_VISUAL_EXT; - } else { - pConfigs[i].visualRating = GLX_NONE; - } + } pConfigs[i].transparentPixel = GLX_NONE; pConfigs[i].transparentRed = 0; pConfigs[i].transparentGreen = 0;