summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/r300/r300_ioctl.c
diff options
context:
space:
mode:
authorAapo Tahkola <aet@rasterburn.org>2005-02-08 01:49:03 +0000
committerAapo Tahkola <aet@rasterburn.org>2005-02-08 01:49:03 +0000
commit27f75a863e0d7e2bcfbfab1ebddb1d83e4ca4199 (patch)
treee346cf2066f0282fc101d91bac55a6d76157b10a /src/mesa/drivers/dri/r300/r300_ioctl.c
parent049290c584f19d5f551b234292e76154e2857179 (diff)
To cut the long and boring story short, polygon offsets should now work. vb mode colorbuffer clears are still mysticly broken by offsets... Maybe we need to merge zbs and unk42B4 together?
Diffstat (limited to 'src/mesa/drivers/dri/r300/r300_ioctl.c')
-rw-r--r--src/mesa/drivers/dri/r300/r300_ioctl.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c
index ee5fb07fae..e7e1d37b68 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.c
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.c
@@ -68,7 +68,7 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags, int buffer)
GLuint cboffset, cbpitch;
drm_r300_cmd_header_t* cmd2;
LOCAL_VARS;
-
+
if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "%s: %s buffer (%i,%i %ix%i)\n",
__FUNCTION__, buffer ? "back" : "front",
@@ -220,7 +220,7 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags, int buffer)
r300->hw.zs.cmd[R300_ZS_CNTL_0] = 0; // disable
r300->hw.zs.cmd[R300_ZS_CNTL_1] = 0;
}
-
+
/* Make sure we have enough space */
r300EnsureCmdBufSpace(r300, r300->hw.max_state_size + 9+8, __FUNCTION__);
@@ -253,7 +253,7 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags, int buffer)
reg_start(0x4f18,0);
e32(0x00000003);
-
+
}
@@ -268,6 +268,8 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
int flags = 0;
int bits = 0;
int swapped;
+ uint32_t unk42B4;
+ uint32_t zbs[4];
if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "%s: all=%d cx=%d cy=%d cw=%d ch=%d\n",
@@ -279,6 +281,23 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
if (dPriv->numClipRects == 0)
return;
}
+
+ /* When unk42B4==0 z-bias is still on for vb mode with points ... */
+ R300_STATECHANGE(r300, zbs);
+ zbs[0]=r300->hw.zbs.cmd[R300_ZBS_T_FACTOR];
+ zbs[1]=r300->hw.zbs.cmd[R300_ZBS_T_CONSTANT];
+ zbs[2]=r300->hw.zbs.cmd[R300_ZBS_W_FACTOR];
+ zbs[3]=r300->hw.zbs.cmd[R300_ZBS_W_CONSTANT];
+
+ r300->hw.zbs.cmd[R300_ZBS_T_FACTOR] =
+ r300->hw.zbs.cmd[R300_ZBS_T_CONSTANT] =
+ r300->hw.zbs.cmd[R300_ZBS_W_FACTOR] =
+ r300->hw.zbs.cmd[R300_ZBS_W_CONSTANT] = r300PackFloat32(0.0);
+
+ /* Make sure z-bias isnt on */
+ R300_STATECHANGE(r300, unk42B4);
+ unk42B4=r300->hw.unk42B4.cmd[1];
+ r300->hw.unk42B4.cmd[1]=3;
if (mask & DD_FRONT_LEFT_BIT) {
flags |= DD_FRONT_LEFT_BIT;
@@ -321,6 +340,17 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
* but do keep it like this for now.
*/
r300ResetHwState(r300);
+
+ R300_STATECHANGE(r300, unk42B4);
+ r300->hw.unk42B4.cmd[1]=unk42B4;
+
+ /* Put real z-bias back */
+ R300_STATECHANGE(r300, zbs);
+ r300->hw.zbs.cmd[R300_ZBS_T_FACTOR] = zbs[0];
+ r300->hw.zbs.cmd[R300_ZBS_T_CONSTANT] = zbs[1];
+ r300->hw.zbs.cmd[R300_ZBS_W_FACTOR] = zbs[2];
+ r300->hw.zbs.cmd[R300_ZBS_W_CONSTANT] = zbs[3];
+
/* r300ClearBuffer has trampled all over the hardware state.. */
r300->hw.all_dirty=GL_TRUE;
}