r600g: don't add PA_SC_LINE_STIPPLE to rasterizer_state
[mesa.git] / src / gallium / drivers / softpipe / sp_quad_fs.c
index 907e94b59b98ab924af61527346fdc5be9d47801..8ec1aa2fc630ded23f5ef4b845306d2d9d47dd64 100644 (file)
@@ -74,7 +74,8 @@ shade_quad(struct quad_stage *qs, struct quad_header *quad)
    struct tgsi_exec_machine *machine = softpipe->fs_machine;
 
    /* run shader */
-   return softpipe->fs->run( softpipe->fs, machine, quad );
+   machine->flatshade_color = softpipe->rasterizer->flatshade ? TRUE : FALSE;
+   return softpipe->fs_variant->run( softpipe->fs_variant, machine, quad );
 }
 
 
@@ -89,7 +90,7 @@ coverage_quad(struct quad_stage *qs, struct quad_header *quad)
    for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) {
       float (*quadColor)[4] = quad->output.color[cbuf];
       unsigned j;
-      for (j = 0; j < QUAD_SIZE; j++) {
+      for (j = 0; j < TGSI_QUAD_SIZE; j++) {
          assert(quad->input.coverage[j] >= 0.0);
          assert(quad->input.coverage[j] <= 1.0);
          quadColor[3][j] *= quad->input.coverage[j];
@@ -109,25 +110,35 @@ shade_quads(struct quad_stage *qs,
 {
    struct softpipe_context *softpipe = qs->softpipe;
    struct tgsi_exec_machine *machine = softpipe->fs_machine;
-   unsigned i, pass = 0;
+   unsigned i, nr_quads = 0;
+
+   tgsi_exec_set_constant_buffers(machine, PIPE_MAX_CONSTANT_BUFFERS,
+                         softpipe->mapped_constants[PIPE_SHADER_FRAGMENT],
+                         softpipe->const_buffer_size[PIPE_SHADER_FRAGMENT]);
 
-   for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) {
-      machine->Consts[i] = softpipe->mapped_constants[PIPE_SHADER_FRAGMENT][i];
-   }
    machine->InterpCoefs = quads[0]->coef;
 
    for (i = 0; i < nr; i++) {
-      if (!shade_quad(qs, quads[i]))
+      /* Only omit this quad from the output list if all the fragments
+       * are killed _AND_ it's not the first quad in the list.
+       * The first quad is special in the (optimized) depth-testing code:
+       * the quads' Z coordinates are step-wise interpolated with respect
+       * to the first quad in the list.
+       * For multi-pass algorithms we need to produce exactly the same
+       * Z values in each pass.  If interpolation starts with different quads
+       * we can get different Z values for the same (x,y).
+       */
+      if (!shade_quad(qs, quads[i]) && i > 0)
          continue; /* quad totally culled/killed */
 
       if (/*do_coverage*/ 0)
          coverage_quad( qs, quads[i] );
 
-      quads[pass++] = quads[i];
+      quads[nr_quads++] = quads[i];
    }
    
-   if (pass)
-      qs->next->run(qs->next, quads, pass);
+   if (nr_quads)
+      qs->next->run(qs->next, quads, nr_quads);
 }
    
 
@@ -139,10 +150,10 @@ shade_begin(struct quad_stage *qs)
 {
    struct softpipe_context *softpipe = qs->softpipe;
 
-   softpipe->fs->prepare( softpipe->fs
-                         softpipe->fs_machine,
-                         (struct tgsi_sampler **)
-                             softpipe->tgsi.frag_samplers_list );
+   softpipe->fs_variant->prepare( softpipe->fs_variant
+                                  softpipe->fs_machine,
+                                  (struct tgsi_sampler **)
+                                  softpipe->tgsi.frag_samplers_list );
 
    qs->next->begin(qs->next);
 }