don't save color/z if fragment is killed
authorBrian Paul <brian.paul@tungstengraphics.com>
Sun, 22 Oct 2006 22:58:42 +0000 (22:58 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sun, 22 Oct 2006 22:58:42 +0000 (22:58 +0000)
src/mesa/swrast/s_nvfragprog.c

index bd9007efaf361ad0bbbcec904ff8e244f9f55ed8..01fa221fc6a0e4d916b8a04e5b4c35ebbd364116 100644 (file)
@@ -53,7 +53,7 @@ struct fp_machine
    GLfloat Temporaries[MAX_NV_FRAGMENT_PROGRAM_TEMPS][4];
    GLfloat Inputs[MAX_NV_FRAGMENT_PROGRAM_INPUTS][4];
    GLfloat Outputs[MAX_NV_FRAGMENT_PROGRAM_OUTPUTS][4];
-   GLuint CondCodes[4];
+   GLuint CondCodes[4];  /**< COND_* value for x/y/z/w */
 };
 
 
@@ -1521,24 +1521,26 @@ run_program(GLcontext *ctx, SWspan *span, GLuint start, GLuint end)
       if (span->array->mask[i]) {
          init_machine(ctx, &machine, program, span, i);
 
-         if (!execute_program(ctx, program, ~0, &machine, span, i)) {
-            span->array->mask[i] = GL_FALSE;  /* killed fragment */
-            span->writeAll = GL_FALSE;
+         if (execute_program(ctx, program, ~0, &machine, span, i)) {
+            /* Store result color */
+            COPY_4V(span->array->color.sz4.rgba[i],
+                    machine.Outputs[FRAG_RESULT_COLR]);
+
+            /* Store result depth/z */
+            if (program->Base.OutputsWritten & (1 << FRAG_RESULT_DEPR)) {
+               const GLfloat depth = machine.Outputs[FRAG_RESULT_DEPR][2];
+               if (depth <= 0.0)
+                  span->array->z[i] = 0;
+               else if (depth >= 1.0)
+                  span->array->z[i] = ctx->DrawBuffer->_DepthMax;
+               else
+                  span->array->z[i] = IROUND(depth * ctx->DrawBuffer->_DepthMaxF);
+            }
          }
-
-         /* Store result color */
-         COPY_4V(span->array->color.sz4.rgba[i],
-                 machine.Outputs[FRAG_RESULT_COLR]);
-
-         /* Store result depth/z */
-         if (program->Base.OutputsWritten & (1 << FRAG_RESULT_DEPR)) {
-            const GLfloat depth = machine.Outputs[FRAG_RESULT_DEPR][2];
-            if (depth <= 0.0)
-               span->array->z[i] = 0;
-            else if (depth >= 1.0)
-               span->array->z[i] = ctx->DrawBuffer->_DepthMax;
-            else
-               span->array->z[i] = IROUND(depth * ctx->DrawBuffer->_DepthMaxF);
+         else {
+            /* killed fragment */
+            span->array->mask[i] = GL_FALSE;
+            span->writeAll = GL_FALSE;
          }
       }
    }