draw: explicitly list nr_inputs, outputs in varient key
authorKeith Whitwell <keith@tungstengraphics.com>
Tue, 27 May 2008 13:42:15 +0000 (14:42 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Tue, 27 May 2008 13:45:52 +0000 (14:45 +0100)
src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
src/gallium/auxiliary/draw/draw_vs.h
src/gallium/auxiliary/draw/draw_vs_aos.c
src/gallium/auxiliary/draw/draw_vs_aos_io.c
src/gallium/auxiliary/draw/draw_vs_varient.c

index c6249b4b41044503e25929ff86fda568fa116876..581026dcb05bdef444b37b1412167b643dc61c93 100644 (file)
@@ -72,7 +72,6 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
    struct fetch_shade_emit *fse = (struct fetch_shade_emit *)middle;
    struct draw_context *draw = fse->draw;
    unsigned num_vs_inputs = draw->vs.vertex_shader->info.num_inputs;
-   unsigned num_vs_outputs = draw->vs.vertex_shader->info.num_outputs;
    const struct vertex_info *vinfo;
    unsigned i;
    boolean need_psize = 0;
@@ -91,8 +90,11 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
 
 
    fse->key.output_stride = vinfo->size * 4;
-   fse->key.nr_elements = MAX2(num_vs_outputs,     /* outputs - translate to hw format */
-                               num_vs_inputs);     /* inputs - fetch from api format */
+   fse->key.nr_outputs = vinfo->num_attribs;
+   fse->key.nr_inputs = num_vs_inputs;
+
+   fse->key.nr_elements = MAX2(fse->key.nr_outputs,     /* outputs - translate to hw format */
+                               fse->key.nr_inputs);     /* inputs - fetch from api format */
 
    fse->key.viewport = !draw->identity_viewport;
    fse->key.clip = !draw->bypass_clipping;
@@ -142,7 +144,7 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
             need_psize = 1;
             output_format = PIPE_FORMAT_R32_FLOAT;
             emit_sz = 1 * sizeof(float);
-            vs_output = num_vs_outputs + 1;
+            vs_output = vinfo->num_attribs + 1;
             break;
          case EMIT_4UB:
             output_format = PIPE_FORMAT_B8G8R8A8_UNORM;
@@ -177,7 +179,9 @@ static void fse_prepare( struct draw_pt_middle_end *middle,
       fse->key.element[i].input_buffer = 0; //nr_buffers + 1;
       fse->key.element[i].input_offset = 0; 
 
-      fse->key.nr_elements += 1;
+      fse->key.nr_inputs += 1;
+      fse->key.nr_elements = MAX2(fse->key.nr_inputs,
+                                  fse->key.nr_outputs);
       
    }
 #endif
index ff3e19b2a880266310283e572dca92ae45a141ba..17902ab86a6d29bc13349c4cb60806519a87c357 100644 (file)
@@ -58,10 +58,12 @@ struct draw_vs_element {
 
 struct draw_vs_varient_key {
    unsigned output_stride;
-   unsigned nr_elements:16;
+   unsigned nr_elements:8;      /* max2(nr_inputs, nr_outputs) */
+   unsigned nr_inputs:8;
+   unsigned nr_outputs:8;
    unsigned viewport:1;
    unsigned clip:1;
-   unsigned pad:14;
+   unsigned pad:5;
    struct draw_vs_element element[PIPE_MAX_ATTRIBS];
 };
 
index c63553216cbfda01489052102685fc1a64c94165..e2e96470f725a806c9e0794c6672ae4e3793cf1e 100644 (file)
@@ -2095,7 +2095,7 @@ static void vaos_set_buffer( struct draw_vs_varient *varient,
    struct draw_vs_varient_aos_sse *vaos = (struct draw_vs_varient_aos_sse *)varient;
    unsigned i;
 
-   for (i = 0; i < vaos->base.vs->info.num_inputs; i++) {
+   for (i = 0; i < vaos->base.key.nr_inputs; i++) {
       if (vaos->base.key.element[i].in.buffer == buf) {
          vaos->machine->attrib[i].input_ptr = ((char *)ptr +
                                                vaos->base.key.element[i].in.offset);
index f39ebb7a176259c500a5c069ffc512379b950145..ef265d61cfd67b13bc25dfbd9191079f85110193 100644 (file)
@@ -180,7 +180,7 @@ boolean aos_fetch_inputs( struct aos_compilation *cp, boolean linear )
 {
    unsigned i;
    
-   for (i = 0; i < cp->vaos->base.vs->info.num_inputs; i++) {
+   for (i = 0; i < cp->vaos->base.key.nr_inputs; i++) {
       if (!load_input( cp, i, linear ))
          return FALSE;
       cp->insn_counter++;
@@ -282,7 +282,7 @@ boolean aos_emit_outputs( struct aos_compilation *cp )
 {
    unsigned i;
    
-   for (i = 0; i < cp->vaos->base.vs->info.num_outputs; i++) {
+   for (i = 0; i < cp->vaos->base.key.nr_outputs; i++) {
       unsigned format = cp->vaos->base.key.element[i].out.format;
       unsigned offset = cp->vaos->base.key.element[i].out.offset;
 
index d4deabfff3561afa6d6aa1b61d91a2b5ffc471ce..dab46e8eed3173c4e18752b5f5f181bee95c2fc4 100644 (file)
@@ -276,11 +276,11 @@ struct draw_vs_varient *draw_vs_varient_generic( struct draw_vertex_shader *vs,
 
 
 
-   /* OK, have to build a new one: 
+   /* Build free-standing fetch and emit functions:
     */
-   fetch.nr_elements = vs->info.num_inputs;
+   fetch.nr_elements = key->nr_inputs;
    fetch.output_stride = 0;
-   for (i = 0; i < vs->info.num_inputs; i++) {
+   for (i = 0; i < key->nr_inputs; i++) {
       fetch.element[i].input_format = key->element[i].in.format;
       fetch.element[i].input_buffer = key->element[i].in.buffer;
       fetch.element[i].input_offset = key->element[i].in.offset;
@@ -290,9 +290,9 @@ struct draw_vs_varient *draw_vs_varient_generic( struct draw_vertex_shader *vs,
    }
 
 
-   emit.nr_elements = vs->info.num_outputs;
+   emit.nr_elements = key->nr_outputs;
    emit.output_stride = key->output_stride;
-   for (i = 0; i < vs->info.num_outputs; i++) {
+   for (i = 0; i < key->nr_outputs; i++) {
       emit.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
       emit.element[i].input_buffer = 0;
       emit.element[i].input_offset = i * 4 * sizeof(float);