Alpha test fix
authorPeter Zubaj <pzubaj@gaya.sk>
Mon, 18 Apr 2005 19:06:14 +0000 (19:06 +0000)
committerPeter Zubaj <pzubaj@gaya.sk>
Mon, 18 Apr 2005 19:06:14 +0000 (19:06 +0000)
src/mesa/drivers/dri/r300/r300_state.c

index 7cdc1733bd836e4a2c8aba54f4e4a141a027fa8e..7cc0990444c1e09d558a6805b018b727866aa322 100644 (file)
@@ -435,6 +435,28 @@ static void r300UpdateCulling(GLcontext* ctx)
        r300->hw.cul.cmd[R300_CUL_CULL] = val;
 }
 
+static void update_early_z(GLcontext* ctx)
+{
+       /* updates register 0x4f14 
+          if depth test is not enabled it should be 0x00000000
+          if depth is enabled and alpha not it should be 0x00000001
+          if depth and alpha is enabled it should be 0x00000000
+       */
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+       R300_STATECHANGE(r300, unk4F10);
+       if (ctx->Color.AlphaEnabled)
+               /* disable early Z */
+               r300->hw.unk4F10.cmd[2] = 0x00000000;
+       else {
+               if (ctx->Depth.Test)
+                       /* enable early Z */
+                       r300->hw.unk4F10.cmd[2] = 0x00000001;
+               else
+                       /* disable early Z */
+                       r300->hw.unk4F10.cmd[2] = 0x00000000;
+       }
+}
 
 /**
  * Handle glEnable()/glDisable().
@@ -468,6 +490,7 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
                        r300->hw.at.cmd[R300_AT_ALPHA_TEST] &=
                            ~R300_ALPHA_TEST_ENABLE;
                }
+               update_early_z(ctx);
                break;
 
        case GL_BLEND:
@@ -488,6 +511,7 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
 
                r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE;
                r300->hw.zs.cmd[R300_ZS_CNTL_0] |= newval;
+               update_early_z(ctx);
                break;
 
        case GL_STENCIL_TEST:
@@ -2314,12 +2338,12 @@ void r300ResetHwState(r300ContextPtr r300)
        r300->hw.unk4EA0.cmd[2] = 0xffffffff;
 
        r300->hw.unk4F10.cmd[1] = 0x00000002; // depthbuffer format?
-       r300->hw.unk4F10.cmd[2] = 0x00000000;
+       //r300->hw.unk4F10.cmd[2] = 0x00000000;
        r300->hw.unk4F10.cmd[3] = 0x00000003;
        r300->hw.unk4F10.cmd[4] = 0x00000000;
 
        /* experiment a bit */
-       r300->hw.unk4F10.cmd[2] = 0x00000001; // depthbuffer format?
+       //r300->hw.unk4F10.cmd[2] = 0x00000001; // depthbuffer format?
 
        r300->hw.zb.cmd[R300_ZB_OFFSET] =
                r300->radeon.radeonScreen->depthOffset +