+/**
+ * Shade/write an array of quads
+ * Called via quad_stage::run()
+ */
+static void
+shade_quads(struct quad_stage *qs,
+ struct quad_header *quads[],
+ unsigned nr)
+{
+ struct softpipe_context *softpipe = qs->softpipe;
+ struct tgsi_exec_machine *machine = softpipe->fs_machine;
+ 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]);
+
+ machine->InterpCoefs = quads[0]->coef;
+
+ for (i = 0; i < nr; 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[nr_quads++] = quads[i];