diff options
Diffstat (limited to 'src/gallium/auxiliary/util/u_vbuf.c')
-rw-r--r-- | src/gallium/auxiliary/util/u_vbuf.c | 83 |
1 files changed, 43 insertions, 40 deletions
diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c index 92a7df1eda8..f3ba89f6717 100644 --- a/src/gallium/auxiliary/util/u_vbuf.c +++ b/src/gallium/auxiliary/util/u_vbuf.c @@ -55,6 +55,8 @@ struct u_vbuf_elements { boolean incompatible_layout; /* Per-element flags. */ boolean incompatible_layout_elem[PIPE_MAX_ATTRIBS]; + + void *driver_cso; }; enum { @@ -78,8 +80,6 @@ struct u_vbuf_priv { /* The index buffer. */ struct pipe_index_buffer index_buffer; - /* Vertex element state bound by the state tracker. */ - void *saved_ve; /* and its associated helper structure for this module. */ struct u_vbuf_elements *ve; @@ -91,9 +91,6 @@ struct u_vbuf_priv { /* The vertex buffer slot index where translated vertices have been * stored in. */ unsigned fallback_vbs[VB_NUM]; - /* When binding the fallback vertex element state, we don't want to - * change saved_ve and ve. This is set to TRUE in such cases. */ - boolean ve_binding_lock; /* Whether there is any user buffer. */ boolean any_user_vbs; @@ -107,6 +104,11 @@ struct u_vbuf_priv { void (*driver_set_vertex_buffers)(struct pipe_context *, unsigned num_buffers, const struct pipe_vertex_buffer *); + void *(*driver_create_vertex_elements_state)(struct pipe_context *, + unsigned num_elements, + const struct pipe_vertex_element *); + void (*driver_bind_vertex_elements_state)(struct pipe_context *, void *); + void (*driver_delete_vertex_elements_state)(struct pipe_context *, void *); }; static void u_vbuf_init_format_caps(struct u_vbuf_priv *mgr) @@ -168,7 +170,7 @@ u_vbuf_create(struct pipe_context *pipe, /* XXX I had to fork this off of cso_context. */ static void * -u_vbuf_pipe_set_vertex_elements(struct u_vbuf_priv *mgr, +u_vbuf_cache_set_vertex_elements(struct u_vbuf_priv *mgr, unsigned count, const struct pipe_vertex_element *states) { @@ -190,10 +192,10 @@ u_vbuf_pipe_set_vertex_elements(struct u_vbuf_priv *mgr, struct cso_velements *cso = MALLOC_STRUCT(cso_velements); memcpy(&cso->state, &velems_state, key_size); cso->data = - mgr->pipe->create_vertex_elements_state(mgr->pipe, count, - &cso->state.velems[0]); + mgr->driver_create_vertex_elements_state(mgr->pipe, count, + &cso->state.velems[0]); cso->delete_state = - (cso_state_callback)mgr->pipe->delete_vertex_elements_state; + (cso_state_callback)mgr->driver_delete_vertex_elements_state; cso->context = mgr->pipe; iter = cso_insert_state(mgr->cso_cache, hash_key, CSO_VELEMENTS, cso); @@ -202,7 +204,7 @@ u_vbuf_pipe_set_vertex_elements(struct u_vbuf_priv *mgr, handle = ((struct cso_velements *)cso_hash_iter_data(iter))->data; } - mgr->pipe->bind_vertex_elements_state(mgr->pipe, handle); + mgr->driver_bind_vertex_elements_state(mgr->pipe, handle); return handle; } @@ -531,11 +533,8 @@ u_vbuf_translate_begin(struct u_vbuf_priv *mgr, } } - /* Preserve saved_ve. */ - mgr->ve_binding_lock = TRUE; - mgr->fallback_ve = u_vbuf_pipe_set_vertex_elements(mgr, mgr->ve->count, - mgr->fallback_velems); - mgr->ve_binding_lock = FALSE; + mgr->fallback_ve = u_vbuf_cache_set_vertex_elements(mgr, mgr->ve->count, + mgr->fallback_velems); return TRUE; } @@ -544,8 +543,7 @@ static void u_vbuf_translate_end(struct u_vbuf_priv *mgr) unsigned i; /* Restore vertex elements. */ - /* Note that saved_ve will be overwritten in bind_vertex_elements_state. */ - mgr->pipe->bind_vertex_elements_state(mgr->pipe, mgr->saved_ve); + mgr->driver_bind_vertex_elements_state(mgr->pipe, mgr->ve->driver_cso); mgr->fallback_ve = NULL; /* Unreference the now-unused VBOs. */ @@ -562,22 +560,18 @@ static void u_vbuf_translate_end(struct u_vbuf_priv *mgr) #define FORMAT_REPLACE(what, withwhat) \ case PIPE_FORMAT_##what: format = PIPE_FORMAT_##withwhat; break -struct u_vbuf_elements * -u_vbuf_create_vertex_elements(struct u_vbuf *mgrb, +static void * +u_vbuf_create_vertex_elements(struct pipe_context *pipe, unsigned count, - const struct pipe_vertex_element *attribs, - struct pipe_vertex_element *native_attribs) + const struct pipe_vertex_element *attribs) { - struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb; + struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)pipe->draw; unsigned i; + struct pipe_vertex_element native_attribs[PIPE_MAX_ATTRIBS]; struct u_vbuf_elements *ve = CALLOC_STRUCT(u_vbuf_elements); ve->count = count; - if (!count) { - return ve; - } - memcpy(ve->ve, attribs, sizeof(struct pipe_vertex_element) * count); memcpy(native_attribs, attribs, sizeof(struct pipe_vertex_element) * count); @@ -665,28 +659,29 @@ u_vbuf_create_vertex_elements(struct u_vbuf *mgrb, } } + ve->driver_cso = + mgr->driver_create_vertex_elements_state(pipe, count, native_attribs); return ve; } -void u_vbuf_bind_vertex_elements(struct u_vbuf *mgrb, - void *cso, - struct u_vbuf_elements *ve) +static void u_vbuf_bind_vertex_elements(struct pipe_context *pipe, + void *cso) { - struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb; - - if (!cso) { - return; - } + struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)pipe->draw; + struct u_vbuf_elements *ve = cso; - if (!mgr->ve_binding_lock) { - mgr->saved_ve = cso; - mgr->ve = ve; - } + mgr->ve = ve; + mgr->b.vertex_elements = ve; + mgr->driver_bind_vertex_elements_state(pipe, ve ? ve->driver_cso : NULL); } -void u_vbuf_destroy_vertex_elements(struct u_vbuf *mgr, - struct u_vbuf_elements *ve) +static void u_vbuf_delete_vertex_elements(struct pipe_context *pipe, + void *cso) { + struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)pipe->draw; + struct u_vbuf_elements *ve = cso; + + mgr->driver_delete_vertex_elements_state(pipe, ve->driver_cso); FREE(ve); } @@ -1198,6 +1193,14 @@ static void u_vbuf_install(struct u_vbuf_priv *mgr) pipe->draw = mgr; mgr->driver_set_index_buffer = pipe->set_index_buffer; mgr->driver_set_vertex_buffers = pipe->set_vertex_buffers; + mgr->driver_create_vertex_elements_state = + pipe->create_vertex_elements_state; + mgr->driver_bind_vertex_elements_state = pipe->bind_vertex_elements_state; + mgr->driver_delete_vertex_elements_state = + pipe->delete_vertex_elements_state; pipe->set_index_buffer = u_vbuf_set_index_buffer; pipe->set_vertex_buffers = u_vbuf_set_vertex_buffers; + pipe->create_vertex_elements_state = u_vbuf_create_vertex_elements; + pipe->bind_vertex_elements_state = u_vbuf_bind_vertex_elements; + pipe->delete_vertex_elements_state = u_vbuf_delete_vertex_elements; } |