draw: make sure key size is calculated consistently.
authorRoland Scheidegger <sroland@vmware.com>
Tue, 19 Feb 2013 18:47:08 +0000 (19:47 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 22 Feb 2013 03:34:07 +0000 (04:34 +0100)
Some parts calculated key size by using shader information, others by using
the pipe_vertex_element information. Since it is perfectly valid to have more
vertex_elements set than the vertex shader is using those may not be the same,
so we weren't copying over all vertex_element state - this caused the tgsi dump
to assert (iterates over all vertex elements). More importantly in this
situation it would also break vertex texturing completely (since the sampler
state derived from the key is at a different position than expected).
Fix thix by deriving key->nr_vertex_elements from the shader information
instead of the pipe_vertex_element state (unlike dx10, we can't have "holes"
in pipe_vertex_element state, so this should be safe).
(Note that actual llvm shader generation does not use the pipe_vertex_element
state from the key itself in any case (althogh I guess it could) but uses
the one from draw.pt (which should be the same though contains all elements)
instead.)

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/draw/draw_llvm.c

index f3bbbbb0ace15e280cacfdf18ff7b57305c45a95..2467e5acff191969ebdf12d5b7325ef170405831 100644 (file)
@@ -420,8 +420,8 @@ draw_llvm_destroy(struct draw_llvm *llvm)
  */
 struct draw_llvm_variant *
 draw_llvm_create_variant(struct draw_llvm *llvm,
-                        unsigned num_inputs,
-                        const struct draw_llvm_variant_key *key)
+                         unsigned num_inputs,
+                         const struct draw_llvm_variant_key *key)
 {
    struct draw_llvm_variant *variant;
    struct llvm_vertex_shader *shader =
@@ -429,8 +429,8 @@ draw_llvm_create_variant(struct draw_llvm *llvm,
    LLVMTypeRef vertex_header;
 
    variant = MALLOC(sizeof *variant +
-                   shader->variant_key_size -
-                   sizeof variant->key);
+                    shader->variant_key_size -
+                    sizeof variant->key);
    if (variant == NULL)
       return NULL;
 
@@ -1415,8 +1415,12 @@ draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
 
    /* Presumably all variants of the shader should have the same
     * number of vertex elements - ie the number of shader inputs.
+    * NOTE: we NEED to store the needed number of needed inputs
+    * here, not the number of provided elements to match keysize
+    * (and the offset of sampler state in the key).
     */
-   key->nr_vertex_elements = llvm->draw->pt.nr_vertex_elements;
+   key->nr_vertex_elements = llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_INPUT] + 1;
+   assert(key->nr_vertex_elements <= llvm->draw->pt.nr_vertex_elements);
 
    /* will have to rig this up properly later */
    key->clip_xy = llvm->draw->clip_xy;