gallium: pass cso_velems_state into cso_context instead of pipe_vertex_element
[mesa.git] / src / gallium / auxiliary / cso_cache / cso_context.c
index d7c017a91f2a30cf7f929cb89e79fe236a74af85..ff40f19e68514205b2457e8498da24ab5b78d1f3 100644 (file)
@@ -1061,34 +1061,31 @@ void cso_delete_compute_shader(struct cso_context *ctx, void *handle)
 
 static void
 cso_set_vertex_elements_direct(struct cso_context *ctx,
-                               unsigned count,
-                               const struct pipe_vertex_element *states)
+                               const struct cso_velems_state *velems)
 {
    unsigned key_size, hash_key;
    struct cso_hash_iter iter;
    void *handle;
-   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);
+   key_size = sizeof(struct pipe_vertex_element) * velems->count +
+              sizeof(unsigned);
+   hash_key = cso_construct_key((void*)velems, key_size);
    iter = cso_find_state_template(ctx->cache, hash_key, CSO_VELEMENTS,
-                                  (void*)&velems_state, key_size);
+                                  (void*)velems, key_size);
 
    if (cso_hash_iter_is_null(iter)) {
       struct cso_velements *cso = MALLOC(sizeof(struct cso_velements));
       if (!cso)
          return;
 
-      memcpy(&cso->state, &velems_state, key_size);
-      cso->data = ctx->pipe->create_vertex_elements_state(ctx->pipe, count,
+      memcpy(&cso->state, velems, key_size);
+      cso->data = ctx->pipe->create_vertex_elements_state(ctx->pipe,
+                                                          velems->count,
                                                       &cso->state.velems[0]);
       cso->delete_state =
          (cso_state_callback) ctx->pipe->delete_vertex_elements_state;
@@ -1114,17 +1111,16 @@ cso_set_vertex_elements_direct(struct cso_context *ctx,
 
 enum pipe_error
 cso_set_vertex_elements(struct cso_context *ctx,
-                        unsigned count,
-                        const struct pipe_vertex_element *states)
+                        const struct cso_velems_state *velems)
 {
    struct u_vbuf *vbuf = ctx->vbuf_current;
 
    if (vbuf) {
-      u_vbuf_set_vertex_elements(vbuf, count, states);
+      u_vbuf_set_vertex_elements(vbuf, velems);
       return PIPE_OK;
    }
 
-   cso_set_vertex_elements_direct(ctx, count, states);
+   cso_set_vertex_elements_direct(ctx, velems);
    return PIPE_OK;
 }
 
@@ -1241,8 +1237,7 @@ cso_restore_vertex_buffer0(struct cso_context *ctx)
  */
 void
 cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
-                                    unsigned velem_count,
-                                    const struct pipe_vertex_element *velems,
+                                    const struct cso_velems_state *velems,
                                     unsigned vb_count,
                                     unsigned unbind_trailing_vb_count,
                                     const struct pipe_vertex_buffer *vbuffers,
@@ -1267,7 +1262,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
 
       if (vb_count)
          u_vbuf_set_vertex_buffers(vbuf, 0, vb_count, vbuffers);
-      u_vbuf_set_vertex_elements(vbuf, velem_count, velems);
+      u_vbuf_set_vertex_elements(vbuf, velems);
       return;
    }
 
@@ -1287,7 +1282,7 @@ cso_set_vertex_buffers_and_elements(struct cso_context *ctx,
 
    if (vb_count)
       cso_set_vertex_buffers_direct(ctx, 0, vb_count, vbuffers);
-   cso_set_vertex_elements_direct(ctx, velem_count, velems);
+   cso_set_vertex_elements_direct(ctx, velems);
 }
 
 void