r300: Fix WRITEMASK handling when writing to result.depth
authorNicolai Haehnle <nhaehnle@gmail.com>
Mon, 19 Mar 2007 18:45:45 +0000 (19:45 +0100)
committerNicolai Haehnle <nhaehnle@gmail.com>
Mon, 19 Mar 2007 18:48:58 +0000 (19:48 +0100)
This is a necessary change to emit the right instructions when writing
to result.depth.

However, even with this test, Z-write doesn't work properly, and I don't
fully understand why. In addition to this, we'll at least have to disable
early-Z, but even that doesn't seem to be enough.

src/mesa/drivers/dri/r300/r300_fragprog.c

index b0681e28083465e4fca546545d0ff50706a53d0f..fb559e880ae0d570f706154c3ce718ea058c7d3d 100644 (file)
@@ -1304,9 +1304,14 @@ static void emit_arith(struct r300_fragment_program *rp,
        argc = r300_fpop[op].argc;
 
        if (REG_GET_TYPE(dest) == REG_TYPE_OUTPUT &&
-           REG_GET_INDEX(dest) == FRAG_RESULT_DEPR)
-               mask &= ~WRITEMASK_XYZ;
-       
+           REG_GET_INDEX(dest) == FRAG_RESULT_DEPR) {
+               if (mask & WRITEMASK_Z) {
+                       mask = WRITEMASK_W;
+               } else {
+                       return;
+               }
+       }
+
        emit_vop = GL_FALSE;
        emit_sop = GL_FALSE;
        if ((mask & WRITEMASK_XYZ) || vop == R300_FPI0_OUTC_DP3)