summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/savage/savagestate.c
diff options
context:
space:
mode:
authorFelix Kuehling <fxkuehl@gmx.de>2004-03-21 11:28:07 +0000
committerFelix Kuehling <fxkuehl@gmx.de>2004-03-21 11:28:07 +0000
commit416b7a87889b99de392db182796b913e75d89cd3 (patch)
treeafb0513ff1e0840ddac81ab0a2dade66cc770ffa /src/mesa/drivers/dri/savage/savagestate.c
parent9d688919018ee8cfd74e1aee119e6765c37c7e38 (diff)
unsigned int -> uint32_t, unsigned char -> uint8_t where the size matters.
A bit more cosmetics. Improved state emit on Savage 3D/IX/MX.
Diffstat (limited to 'src/mesa/drivers/dri/savage/savagestate.c')
-rw-r--r--src/mesa/drivers/dri/savage/savagestate.c67
1 files changed, 48 insertions, 19 deletions
diff --git a/src/mesa/drivers/dri/savage/savagestate.c b/src/mesa/drivers/dri/savage/savagestate.c
index 9b9488c290..5e79e4abf1 100644
--- a/src/mesa/drivers/dri/savage/savagestate.c
+++ b/src/mesa/drivers/dri/savage/savagestate.c
@@ -1433,12 +1433,12 @@ static GLboolean savageGlobalRegChanged (savageContextPtr imesa,
static void savageEmitContiguousRegs (savageContextPtr imesa,
GLuint first, GLuint last) {
GLuint i;
- GLuint *pBCIBase;
+ uint32_t *pBCIBase;
pBCIBase = savageDMAAlloc (imesa, last - first + 2);
- WRITE_CMD (pBCIBase, SET_REGISTER(first, last - first + 1), GLuint);
+ WRITE_CMD (pBCIBase, SET_REGISTER(first, last - first + 1), uint32_t);
for (i = first - SAVAGE_FIRST_REG; i <= last - SAVAGE_FIRST_REG; ++i) {
- WRITE_CMD (pBCIBase, imesa->regs.ui[i], GLuint);
+ WRITE_CMD (pBCIBase, imesa->regs.ui[i], uint32_t);
imesa->oldRegs.ui[i] = imesa->regs.ui[i];
}
savageDMACommit (imesa, pBCIBase);
@@ -1463,9 +1463,19 @@ static void savageEmitChangedRegs (savageContextPtr imesa,
savageEmitContiguousRegs (imesa, firstChanged+SAVAGE_FIRST_REG,
last);
}
+static void savageEmitChangedRegChunk (savageContextPtr imesa,
+ GLuint first, GLuint last) {
+ GLuint i;
+ for (i = first - SAVAGE_FIRST_REG; i <= last - SAVAGE_FIRST_REG; ++i) {
+ if (imesa->oldRegs.ui[i] != imesa->regs.ui[i]) {
+ savageEmitContiguousRegs (imesa, first, last);
+ break;
+ }
+ }
+}
static void savageUpdateRegister_s4(savageContextPtr imesa)
{
- GLuint *pBCIBase;
+ uint32_t *pBCIBase;
/*
* Scissors updates drawctrl0 and drawctrl 1
@@ -1488,10 +1498,11 @@ static void savageUpdateRegister_s4(savageContextPtr imesa)
}
}
- /* the savage4 uses the contiguous range of BCI registers 0x1e-0x39 */
- if (imesa->lostContext || savageGlobalRegChanged (imesa, 0x1e, 0x39)) {
+ /* the savage4 uses the contiguous range of BCI registers 0x1e-0x39
+ * 0x1e-0x27 are local, no need to check them for global changes */
+ if (imesa->lostContext || savageGlobalRegChanged (imesa, 0x28, 0x39)) {
pBCIBase = savageDMAAlloc (imesa, 1);
- WRITE_CMD (pBCIBase, WAIT_3D_IDLE, GLuint);
+ WRITE_CMD (pBCIBase, WAIT_3D_IDLE, uint32_t);
savageDMACommit (imesa, pBCIBase);
}
if (imesa->lostContext)
@@ -1504,7 +1515,7 @@ static void savageUpdateRegister_s4(savageContextPtr imesa)
}
static void savageUpdateRegister_s3d(savageContextPtr imesa)
{
- GLuint *pBCIBase;
+ uint32_t *pBCIBase;
if (imesa->scissorChanged)
{
@@ -1541,19 +1552,18 @@ static void savageUpdateRegister_s3d(savageContextPtr imesa)
* 0x18-0x1c and 0x20-0x38. The first range is local. */
if (imesa->lostContext || savageGlobalRegChanged (imesa, 0x20, 0x38)) {
pBCIBase = savageDMAAlloc (imesa, 1);
- WRITE_CMD (pBCIBase, WAIT_3D_IDLE, GLuint);
+ WRITE_CMD (pBCIBase, WAIT_3D_IDLE, uint32_t);
savageDMACommit (imesa, pBCIBase);
}
/* FIXME: watermark registers aren't programmed correctly ATM */
- /* Emitting only changed registers introduces strange texturing errors
- * on my SavageIX. Emit them all to be on the safe side.
- * FIXME: might be smarter to emit all texture regs if one changed and
- * all other regs independently, if one of them changed. */
- if (1 || imesa->lostContext) {
+ if (imesa->lostContext) {
savageEmitContiguousRegs (imesa, 0x18, 0x1c);
savageEmitContiguousRegs (imesa, 0x20, 0x36);
} else {
- savageEmitChangedRegs (imesa, 0x18, 0x1c);
+ /* On the Savage IX texture registers (at least some of them)
+ * have to be emitted as one chunk. */
+ savageEmitChangedRegs (imesa, 0x18, 0x19);
+ savageEmitChangedRegChunk (imesa, 0x1a, 0x1c);
savageEmitChangedRegs (imesa, 0x20, 0x36);
}
@@ -1702,12 +1712,31 @@ static void savageDDInitState_s3d( savageContextPtr imesa )
imesa->LcsCullMode = BCM_None;
imesa->regs.s3d.texDescr.ni.palSize = TPS_256;
- /* on savage3d all registers are global for now */
+ /* clear the local registers in the global reg mask */
+ imesa->globalRegMask.s3d.texPalAddr.ui = 0;
+ imesa->globalRegMask.s3d.texXprClr.ui = 0;
+ imesa->globalRegMask.s3d.texAddr.ui = 0;
+ imesa->globalRegMask.s3d.texDescr.ui = 0;
+ imesa->globalRegMask.s3d.texCtrl.ui = 0;
+
+ imesa->globalRegMask.s3d.fogCtrl.ui = 0;
+
+ /* drawCtrl is local with some exceptions */
+ imesa->globalRegMask.s3d.drawCtrl.ui = 0;
+ imesa->globalRegMask.s3d.drawCtrl.ni.cullMode = 0x3;
+ imesa->globalRegMask.s3d.drawCtrl.ni.alphaTestCmpFunc = 0x7;
+ imesa->globalRegMask.s3d.drawCtrl.ni.alphaTestEn = 0x1;
+ imesa->globalRegMask.s3d.drawCtrl.ni.alphaRefVal = 0xff;
+
+ /* zBufCtrl is local with some exceptions */
+ imesa->globalRegMask.s3d.zBufCtrl.ui = 0;
+ imesa->globalRegMask.s3d.zBufCtrl.ni.zCmpFunc = 0x7;
+ imesa->globalRegMask.s3d.zBufCtrl.ni.zBufEn = 0x1;
}
void savageDDInitState( savageContextPtr imesa ) {
- memset (imesa->regs.ui, 0, SAVAGE_NR_REGS*sizeof(GLuint));
- memset (imesa->oldRegs.ui, 0, SAVAGE_NR_REGS*sizeof(GLuint));
- memset (imesa->globalRegMask.ui, 0xff, SAVAGE_NR_REGS*sizeof(GLuint));
+ memset (imesa->regs.ui, 0, SAVAGE_NR_REGS*sizeof(uint32_t));
+ memset (imesa->oldRegs.ui, 0, SAVAGE_NR_REGS*sizeof(uint32_t));
+ memset (imesa->globalRegMask.ui, 0xff, SAVAGE_NR_REGS*sizeof(uint32_t));
if (imesa->savageScreen->chipset >= S3_SAVAGE4)
savageDDInitState_s4 (imesa);
else