summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/savage_dri.c166
1 files changed, 51 insertions, 115 deletions
diff --git a/src/savage_dri.c b/src/savage_dri.c
index 52a4b7c..414e724 100644
--- a/src/savage_dri.c
+++ b/src/savage_dri.c
@@ -53,6 +53,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;
+} SAVAGEVisuals[] = {
+ { 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";
@@ -93,7 +110,7 @@ static Bool SAVAGEInitVisualConfigs( ScreenPtr pScreen )
__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:
@@ -101,6 +118,7 @@ static Bool SAVAGEInitVisualConfigs( ScreenPtr pScreen )
break;
case 16:
+ case 32:
numConfigs = 8;
pConfigs = (__GLXvisualConfig*)calloc( sizeof(__GLXvisualConfig),
@@ -128,117 +146,32 @@ static Bool SAVAGEInitVisualConfigs( ScreenPtr pScreen )
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; SAVAGEVisuals[visNum].bpp != 0; visNum++) {
+ if ( SAVAGEVisuals[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 ( SAVAGEVisuals[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 = SAVAGEVisuals[visNum].redSize;
+ pConfigs[i].greenSize = SAVAGEVisuals[visNum].greenSize;
+ pConfigs[i].blueSize = SAVAGEVisuals[visNum].blueSize;
+ pConfigs[i].alphaSize = SAVAGEVisuals[visNum].alphaSize;
+ pConfigs[i].redMask = SAVAGEVisuals[visNum].redMask;
+ pConfigs[i].greenMask = SAVAGEVisuals[visNum].greenMask;
+ pConfigs[i].blueMask = SAVAGEVisuals[visNum].blueMask;
+ pConfigs[i].alphaMask = SAVAGEVisuals[visNum].alphaMask;
+
if ( accum ) {
pConfigs[i].accumRedSize = 16;
pConfigs[i].accumGreenSize = 16;
@@ -254,24 +187,27 @@ static Bool SAVAGEInitVisualConfigs( ScreenPtr pScreen )
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 = SAVAGEVisuals[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;