auxiliary: fix vertex elements cso
authorRoland Scheidegger <sroland@vmware.com>
Tue, 9 Mar 2010 13:19:29 +0000 (14:19 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 9 Mar 2010 13:19:29 +0000 (14:19 +0100)
potentially could have got a match even though the cso was different
(in case of different count and first few elements the same).

src/gallium/auxiliary/cso_cache/cso_cache.h
src/gallium/auxiliary/cso_cache/cso_context.c

index d884d5410f3dd8141270001f1166bf7a6bb6e4fb..fb09b83c623ef61be9ca4f540540667126dc8d80 100644 (file)
@@ -146,8 +146,13 @@ struct cso_sampler {
    struct pipe_context *context;
 };
 
+struct cso_velems_state {
+   unsigned count;
+   struct pipe_vertex_element velems[PIPE_MAX_ATTRIBS];
+};
+
 struct cso_velements {
-   struct pipe_vertex_element state[PIPE_MAX_ATTRIBS];
+   struct cso_velems_state state;
    void *data;
    cso_state_callback delete_state;
    struct pipe_context *context;
index 95e3c18e534bf0b3fc1dd0a1dcce995ca4a0b388..510366a8d47d42da40ca360ece3e47b0d9e0ad14 100644 (file)
@@ -1152,18 +1152,25 @@ enum pipe_error cso_set_vertex_elements(struct cso_context *ctx,
    unsigned key_size, hash_key;
    struct cso_hash_iter iter;
    void *handle;
-
-   key_size = sizeof(struct pipe_vertex_element) * count;
-   hash_key = cso_construct_key((void*)states, key_size);
-   iter = cso_find_state_template(ctx->cache, hash_key, CSO_VELEMENTS, (void*)states, key_size);
+   struct cso_velems_state velems_state;
+
+   /* need to include the count into the stored state data too.
+      Otherwise first few count pipe_vertex_elements could be identical even if count
+      is different, and there's no guarantee the hash would be different in that
+      case neither */
+   key_size = sizeof(struct pipe_vertex_element) * count + sizeof(unsigned);
+   velems_state.count = count;
+   memcpy(velems_state.velems, states, sizeof(struct pipe_vertex_element) * count);
+   hash_key = cso_construct_key((void*)&velems_state, key_size);
+   iter = cso_find_state_template(ctx->cache, hash_key, CSO_VELEMENTS, (void*)&velems_state, key_size);
 
    if (cso_hash_iter_is_null(iter)) {
       struct cso_velements *cso = MALLOC(sizeof(struct cso_velements));
       if (!cso)
          return PIPE_ERROR_OUT_OF_MEMORY;
 
-      memcpy(&cso->state, states, key_size);
-      cso->data = ctx->pipe->create_vertex_elements_state(ctx->pipe, count, &cso->state[0]);
+      memcpy(&cso->state, &velems_state, key_size);
+      cso->data = ctx->pipe->create_vertex_elements_state(ctx->pipe, count, &cso->state.velems[0]);
       cso->delete_state = (cso_state_callback)ctx->pipe->delete_vertex_elements_state;
       cso->context = ctx->pipe;