For the time being, interpolate Z in shade_quad() rather in the shader.
authorBrian <brian.paul@tungstengraphics.com>
Thu, 23 Aug 2007 19:24:06 +0000 (13:24 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 23 Aug 2007 19:24:06 +0000 (13:24 -0600)
This was causing trouble for the i915 driver.

src/mesa/pipe/softpipe/sp_quad_fs.c
src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c

index ceba94aa94db2aeb00a9901ceb5c4c54479b9f0f..8a419c9ac784e342d5e1279cda5800163883a29e 100755 (executable)
@@ -55,6 +55,34 @@ quad_shade_stage(struct quad_stage *qs)
    return (struct quad_shade_stage *) qs;
 }
 
+
+
+
+/**
+ * Compute quad's attribute values by linear interpolation.
+ *
+ * Push into the fp:
+ * 
+ *   INPUT[attr] = MAD COEF_A0[attr], COEF_DADX[attr], INPUT_WPOS.xxxx
+ *   INPUT[attr] = MAD INPUT[attr],   COEF_DADY[attr], INPUT_WPOS.yyyy
+ */
+static INLINE void
+linterp_z(const struct tgsi_interp_coef *coef,
+          struct tgsi_exec_vector *pos)
+{
+   uint ch = 2;
+   uint j;
+   for (j = 0; j < QUAD_SIZE; j++) {
+      const float x = pos->xyzw[0].f[j];
+      const float y = pos->xyzw[1].f[j];
+      pos->xyzw[ch].f[j] = (coef->a0[ch] +
+                            coef->dadx[ch] * x + 
+                            coef->dady[ch] * y);
+   }
+}
+
+
+
 /* This should be done by the fragment shader execution unit (code
  * generated from the decl instructions).  Do it here for now.
  */
@@ -101,6 +129,9 @@ shade_quad(
    machine.Inputs[0].xyzw[1].f[2] = fy + 1.0f;
    machine.Inputs[0].xyzw[1].f[3] = fy + 1.0f;
 
+   /* interp Z */
+   linterp_z(&quad->coef[0], &machine.Inputs[0]);
+
    /* run shader */
    tgsi_exec_machine_run( &machine );
 
@@ -110,6 +141,7 @@ shade_quad(
       &machine.Outputs[1].xyzw[0].f[0],
       sizeof( quad->outputs.color ) );
 
+#if 0
    if( softpipe->need_z ) {
       /* XXX temporary */
       memcpy(
@@ -117,6 +149,17 @@ shade_quad(
          &machine.Outputs[0].xyzw[2],
          sizeof( quad->outputs.depth ) );
    }
+#else
+   {
+      uint i;
+      for (i = 0; i < 4; i++) {
+         quad->outputs.depth[i] = machine.Inputs[0].xyzw[2].f[i];
+#if 0
+         printf("output z %f\n",  quad->outputs.depth[i]);
+#endif
+      }
+   }
+#endif
 
    /* shader may cull fragments */
    if( quad->mask ) {
index 1de80eb734d048d16d9f3be6b0773736c6397425..eeaed844d5e280a7bba10bed25ac6de6e02223cb 100644 (file)
@@ -52,6 +52,9 @@ map_register_file_index(
    GLuint mapped_index;\r
    GLuint i;\r
 \r
+   assert(processor == TGSI_PROCESSOR_FRAGMENT\r
+          || processor == TGSI_PROCESSOR_VERTEX);\r
+\r
    switch( file ) {\r
    case TGSI_FILE_INPUT:\r
       /*\r
@@ -616,6 +619,7 @@ tgsi_mesa_compile_fp_program(
    /*\r
     * Copy fragment z if the shader does not write it.\r
     */\r
+#if 0\r
    if( !(program->Base.OutputsWritten & (1 << FRAG_RESULT_DEPR)) ) {\r
       fullinst = tgsi_default_full_instruction();\r
 \r
@@ -639,6 +643,7 @@ tgsi_mesa_compile_fp_program(
          maxTokens - ti );\r
       preamble_size++;\r
    }\r
+#endif\r
 \r
    for( i = 0; i < program->Base.NumInstructions; i++ ) {\r
       if( compile_instruction(\r