draw: share machine
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_fetch_shade_emit.c
index 43d7095f76695377370c348436342c4a56ee02fb..5265a131605a35a26a87490c7cc2f24575e87731 100644 (file)
@@ -60,6 +60,9 @@ struct fetch_shade_emit {
 
    struct draw_vs_varient_key key;
    struct draw_vs_varient *active;
+
+
+   const struct vertex_info *vinfo;
 };
 
 
@@ -74,7 +77,6 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
    unsigned num_vs_inputs = draw->vs.vertex_shader->info.num_inputs;
    const struct vertex_info *vinfo;
    unsigned i;
-   boolean need_psize = 0;
    
 
    if (!draw->render->set_primitive( draw->render, 
@@ -85,7 +87,7 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
 
    /* Must do this after set_primitive() above:
     */
-   vinfo = draw->render->get_vertex_info(draw->render);
+   fse->vinfo = vinfo = draw->render->get_vertex_info(draw->render);
    
 
 
@@ -120,34 +122,24 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
 
       for (i = 0; i < vinfo->num_attribs; i++) {
          unsigned emit_sz = 0;
-         unsigned output_format = PIPE_FORMAT_NONE;
-         unsigned vs_output = vinfo->src_index[i];
 
          switch (vinfo->emit[i]) {
          case EMIT_4F:
-            output_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
             emit_sz = 4 * sizeof(float);
             break;
          case EMIT_3F:
-            output_format = PIPE_FORMAT_R32G32B32_FLOAT;
             emit_sz = 3 * sizeof(float);
             break;
          case EMIT_2F:
-            output_format = PIPE_FORMAT_R32G32_FLOAT;
             emit_sz = 2 * sizeof(float);
             break;
          case EMIT_1F:
-            output_format = PIPE_FORMAT_R32_FLOAT;
             emit_sz = 1 * sizeof(float);
             break;
          case EMIT_1F_PSIZE:
-            need_psize = 1;
-            output_format = PIPE_FORMAT_R32_FLOAT;
             emit_sz = 1 * sizeof(float);
-            vs_output = vinfo->num_attribs + 1;
             break;
          case EMIT_4UB:
-            output_format = PIPE_FORMAT_B8G8R8A8_UNORM;
             emit_sz = 4 * sizeof(ubyte);
             break;
          default:
@@ -159,33 +151,15 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
           * numbers, not to positions in the hw vertex description --
           * that's handled by the output_offset field.
           */
-         fse->key.element[vs_output].out.format = output_format;
-         fse->key.element[vs_output].out.vs_output = vs_output;
-         fse->key.element[vs_output].out.offset = dst_offset;
+         fse->key.element[i].out.format = vinfo->emit[i];
+         fse->key.element[i].out.vs_output = vinfo->src_index[i];
+         fse->key.element[i].out.offset = dst_offset;
       
          dst_offset += emit_sz;
          assert(fse->key.output_stride >= dst_offset);
       }
    }
 
-   /* To make psize work, really need to tell the vertex shader to
-    * copy that value from input->output.  For 'translate' this was
-    * implicit for all elements.
-    */
-#if 0
-   if (need_psize) {
-      unsigned input = num_vs_inputs + 1;
-      const struct pipe_vertex_element *src = &draw->pt.vertex_element[i];
-      fse->key.element[i].input_format = PIPE_FORMAT_R32_FLOAT;
-      fse->key.element[i].input_buffer = 0; //nr_buffers + 1;
-      fse->key.element[i].input_offset = 0; 
-
-      fse->key.nr_inputs += 1;
-      fse->key.nr_elements = MAX2(fse->key.nr_inputs,
-                                  fse->key.nr_outputs);
-      
-   }
-#endif
 
    /* Would normally look up a vertex shader and peruse its list of
     * varients somehow.  We omitted that step and put all the
@@ -215,12 +189,6 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
                               draw->pt.vertex_buffer[buf].pitch );
    }
 
-   fse->active->set_constants( fse->active,
-                               (const float (*)[4])draw->pt.user.constants );
-
-   fse->active->set_viewport( fse->active,
-                              &draw->viewport );
-
    //return TRUE;
 }
 
@@ -267,6 +235,18 @@ static void fse_run_linear( struct draw_pt_middle_end *middle,
                               0,
                               count );
    
+   if (0) {
+      unsigned i;
+      for (i = 0; i < count; i++) {
+         debug_printf("\n\n%s vertex %d: (stride %d, offset %d)\n", __FUNCTION__, i,
+                      fse->key.output_stride,
+                      fse->key.output_stride * i);
+
+         draw_dump_emitted_vertex( fse->vinfo, 
+                                   (const uint8_t *)hw_verts + fse->key.output_stride * i );
+      }
+   }
+
 
    draw->render->release_vertices( draw->render, 
                                   hw_verts, 
@@ -311,6 +291,17 @@ fse_run(struct draw_pt_middle_end *middle,
                        draw_elts, 
                        draw_count );
 
+   if (0) {
+      unsigned i;
+      for (i = 0; i < fetch_count; i++) {
+         debug_printf("\n\n%s vertex %d:\n", __FUNCTION__, i);
+         draw_dump_emitted_vertex( fse->vinfo, 
+                                   (const uint8_t *)hw_verts + 
+                                   fse->key.output_stride * i );
+      }
+   }
+
+
    draw->render->release_vertices( draw->render, 
                                    hw_verts, 
                                    fse->key.output_stride,