u_vbuf: override create/bind/destroy_vertex_elements_state
This commit is contained in:
@@ -55,6 +55,8 @@ struct u_vbuf_elements {
|
|||||||
boolean incompatible_layout;
|
boolean incompatible_layout;
|
||||||
/* Per-element flags. */
|
/* Per-element flags. */
|
||||||
boolean incompatible_layout_elem[PIPE_MAX_ATTRIBS];
|
boolean incompatible_layout_elem[PIPE_MAX_ATTRIBS];
|
||||||
|
|
||||||
|
void *driver_cso;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@@ -78,8 +80,6 @@ struct u_vbuf_priv {
|
|||||||
/* The index buffer. */
|
/* The index buffer. */
|
||||||
struct pipe_index_buffer 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. */
|
/* and its associated helper structure for this module. */
|
||||||
struct u_vbuf_elements *ve;
|
struct u_vbuf_elements *ve;
|
||||||
|
|
||||||
@@ -91,9 +91,6 @@ struct u_vbuf_priv {
|
|||||||
/* The vertex buffer slot index where translated vertices have been
|
/* The vertex buffer slot index where translated vertices have been
|
||||||
* stored in. */
|
* stored in. */
|
||||||
unsigned fallback_vbs[VB_NUM];
|
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. */
|
/* Whether there is any user buffer. */
|
||||||
boolean any_user_vbs;
|
boolean any_user_vbs;
|
||||||
@@ -107,6 +104,11 @@ struct u_vbuf_priv {
|
|||||||
void (*driver_set_vertex_buffers)(struct pipe_context *,
|
void (*driver_set_vertex_buffers)(struct pipe_context *,
|
||||||
unsigned num_buffers,
|
unsigned num_buffers,
|
||||||
const struct pipe_vertex_buffer *);
|
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)
|
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. */
|
/* XXX I had to fork this off of cso_context. */
|
||||||
static void *
|
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,
|
unsigned count,
|
||||||
const struct pipe_vertex_element *states)
|
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);
|
struct cso_velements *cso = MALLOC_STRUCT(cso_velements);
|
||||||
memcpy(&cso->state, &velems_state, key_size);
|
memcpy(&cso->state, &velems_state, key_size);
|
||||||
cso->data =
|
cso->data =
|
||||||
mgr->pipe->create_vertex_elements_state(mgr->pipe, count,
|
mgr->driver_create_vertex_elements_state(mgr->pipe, count,
|
||||||
&cso->state.velems[0]);
|
&cso->state.velems[0]);
|
||||||
cso->delete_state =
|
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;
|
cso->context = mgr->pipe;
|
||||||
|
|
||||||
iter = cso_insert_state(mgr->cso_cache, hash_key, CSO_VELEMENTS, cso);
|
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;
|
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;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -531,11 +533,8 @@ u_vbuf_translate_begin(struct u_vbuf_priv *mgr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Preserve saved_ve. */
|
mgr->fallback_ve = u_vbuf_cache_set_vertex_elements(mgr, mgr->ve->count,
|
||||||
mgr->ve_binding_lock = TRUE;
|
|
||||||
mgr->fallback_ve = u_vbuf_pipe_set_vertex_elements(mgr, mgr->ve->count,
|
|
||||||
mgr->fallback_velems);
|
mgr->fallback_velems);
|
||||||
mgr->ve_binding_lock = FALSE;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -544,8 +543,7 @@ static void u_vbuf_translate_end(struct u_vbuf_priv *mgr)
|
|||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* Restore vertex elements. */
|
/* Restore vertex elements. */
|
||||||
/* Note that saved_ve will be overwritten in bind_vertex_elements_state. */
|
mgr->driver_bind_vertex_elements_state(mgr->pipe, mgr->ve->driver_cso);
|
||||||
mgr->pipe->bind_vertex_elements_state(mgr->pipe, mgr->saved_ve);
|
|
||||||
mgr->fallback_ve = NULL;
|
mgr->fallback_ve = NULL;
|
||||||
|
|
||||||
/* Unreference the now-unused VBOs. */
|
/* 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) \
|
#define FORMAT_REPLACE(what, withwhat) \
|
||||||
case PIPE_FORMAT_##what: format = PIPE_FORMAT_##withwhat; break
|
case PIPE_FORMAT_##what: format = PIPE_FORMAT_##withwhat; break
|
||||||
|
|
||||||
struct u_vbuf_elements *
|
static void *
|
||||||
u_vbuf_create_vertex_elements(struct u_vbuf *mgrb,
|
u_vbuf_create_vertex_elements(struct pipe_context *pipe,
|
||||||
unsigned count,
|
unsigned count,
|
||||||
const struct pipe_vertex_element *attribs,
|
const struct pipe_vertex_element *attribs)
|
||||||
struct pipe_vertex_element *native_attribs)
|
|
||||||
{
|
{
|
||||||
struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
|
struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)pipe->draw;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
struct pipe_vertex_element native_attribs[PIPE_MAX_ATTRIBS];
|
||||||
struct u_vbuf_elements *ve = CALLOC_STRUCT(u_vbuf_elements);
|
struct u_vbuf_elements *ve = CALLOC_STRUCT(u_vbuf_elements);
|
||||||
|
|
||||||
ve->count = count;
|
ve->count = count;
|
||||||
|
|
||||||
if (!count) {
|
|
||||||
return ve;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(ve->ve, attribs, sizeof(struct pipe_vertex_element) * count);
|
memcpy(ve->ve, attribs, sizeof(struct pipe_vertex_element) * count);
|
||||||
memcpy(native_attribs, 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;
|
return ve;
|
||||||
}
|
}
|
||||||
|
|
||||||
void u_vbuf_bind_vertex_elements(struct u_vbuf *mgrb,
|
static void u_vbuf_bind_vertex_elements(struct pipe_context *pipe,
|
||||||
void *cso,
|
void *cso)
|
||||||
struct u_vbuf_elements *ve)
|
|
||||||
{
|
{
|
||||||
struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
|
struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)pipe->draw;
|
||||||
|
struct u_vbuf_elements *ve = cso;
|
||||||
|
|
||||||
if (!cso) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
static void u_vbuf_delete_vertex_elements(struct pipe_context *pipe,
|
||||||
struct u_vbuf_elements *ve)
|
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);
|
FREE(ve);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1198,6 +1193,14 @@ static void u_vbuf_install(struct u_vbuf_priv *mgr)
|
|||||||
pipe->draw = mgr;
|
pipe->draw = mgr;
|
||||||
mgr->driver_set_index_buffer = pipe->set_index_buffer;
|
mgr->driver_set_index_buffer = pipe->set_index_buffer;
|
||||||
mgr->driver_set_vertex_buffers = pipe->set_vertex_buffers;
|
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_index_buffer = u_vbuf_set_index_buffer;
|
||||||
pipe->set_vertex_buffers = u_vbuf_set_vertex_buffers;
|
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;
|
||||||
}
|
}
|
||||||
|
@@ -71,6 +71,11 @@ struct u_vbuf {
|
|||||||
struct u_upload_mgr *uploader;
|
struct u_upload_mgr *uploader;
|
||||||
|
|
||||||
struct u_vbuf_caps caps;
|
struct u_vbuf_caps caps;
|
||||||
|
|
||||||
|
/* Vertex elements state as created by u_vbuf.
|
||||||
|
* This is used when saving the state into u_blitter, there's no other
|
||||||
|
* usage. */
|
||||||
|
void *vertex_elements;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct u_vbuf_resource {
|
struct u_vbuf_resource {
|
||||||
@@ -78,9 +83,6 @@ struct u_vbuf_resource {
|
|||||||
uint8_t *user_ptr;
|
uint8_t *user_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Opaque type containing information about vertex elements for the manager. */
|
|
||||||
struct u_vbuf_elements;
|
|
||||||
|
|
||||||
enum u_fetch_alignment {
|
enum u_fetch_alignment {
|
||||||
U_VERTEX_FETCH_BYTE_ALIGNED,
|
U_VERTEX_FETCH_BYTE_ALIGNED,
|
||||||
U_VERTEX_FETCH_DWORD_ALIGNED
|
U_VERTEX_FETCH_DWORD_ALIGNED
|
||||||
@@ -96,19 +98,6 @@ u_vbuf_create(struct pipe_context *pipe,
|
|||||||
|
|
||||||
void u_vbuf_destroy(struct u_vbuf *mgr);
|
void u_vbuf_destroy(struct u_vbuf *mgr);
|
||||||
|
|
||||||
struct u_vbuf_elements *
|
|
||||||
u_vbuf_create_vertex_elements(struct u_vbuf *mgr,
|
|
||||||
unsigned count,
|
|
||||||
const struct pipe_vertex_element *attrs,
|
|
||||||
struct pipe_vertex_element *native_attrs);
|
|
||||||
|
|
||||||
void u_vbuf_bind_vertex_elements(struct u_vbuf *mgr,
|
|
||||||
void *cso,
|
|
||||||
struct u_vbuf_elements *ve);
|
|
||||||
|
|
||||||
void u_vbuf_destroy_vertex_elements(struct u_vbuf *mgr,
|
|
||||||
struct u_vbuf_elements *ve);
|
|
||||||
|
|
||||||
void u_vbuf_draw_begin(struct u_vbuf *mgr,
|
void u_vbuf_draw_begin(struct u_vbuf *mgr,
|
||||||
struct pipe_draw_info *info);
|
struct pipe_draw_info *info);
|
||||||
|
|
||||||
|
@@ -62,13 +62,14 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o
|
|||||||
util_blitter_save_fragment_shader(r300->blitter, r300->fs.state);
|
util_blitter_save_fragment_shader(r300->blitter, r300->fs.state);
|
||||||
util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state);
|
util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state);
|
||||||
util_blitter_save_viewport(r300->blitter, &r300->viewport);
|
util_blitter_save_viewport(r300->blitter, &r300->viewport);
|
||||||
util_blitter_save_vertex_elements(r300->blitter, r300->velems);
|
|
||||||
if (r300->vbuf_mgr) {
|
if (r300->vbuf_mgr) {
|
||||||
util_blitter_save_vertex_buffers(r300->blitter, r300->vbuf_mgr->nr_vertex_buffers,
|
util_blitter_save_vertex_buffers(r300->blitter, r300->vbuf_mgr->nr_vertex_buffers,
|
||||||
r300->vbuf_mgr->vertex_buffer);
|
r300->vbuf_mgr->vertex_buffer);
|
||||||
|
util_blitter_save_vertex_elements(r300->blitter, r300->vbuf_mgr->vertex_elements);
|
||||||
} else {
|
} else {
|
||||||
util_blitter_save_vertex_buffers(r300->blitter, r300->nr_vertex_buffers,
|
util_blitter_save_vertex_buffers(r300->blitter, r300->nr_vertex_buffers,
|
||||||
r300->vertex_buffer);
|
r300->vertex_buffer);
|
||||||
|
util_blitter_save_vertex_elements(r300->blitter, r300->velems);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op & R300_SAVE_FRAMEBUFFER) {
|
if (op & R300_SAVE_FRAMEBUFFER) {
|
||||||
|
@@ -406,8 +406,6 @@ struct r300_vertex_element_state {
|
|||||||
struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
|
struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
|
||||||
unsigned format_size[PIPE_MAX_ATTRIBS];
|
unsigned format_size[PIPE_MAX_ATTRIBS];
|
||||||
|
|
||||||
struct u_vbuf_elements *vmgr_elements;
|
|
||||||
|
|
||||||
/* The size of the vertex, in dwords. */
|
/* The size of the vertex, in dwords. */
|
||||||
unsigned vertex_size_dwords;
|
unsigned vertex_size_dwords;
|
||||||
|
|
||||||
|
@@ -1676,7 +1676,6 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
|||||||
unsigned count,
|
unsigned count,
|
||||||
const struct pipe_vertex_element* attribs)
|
const struct pipe_vertex_element* attribs)
|
||||||
{
|
{
|
||||||
struct r300_context *r300 = r300_context(pipe);
|
|
||||||
struct r300_vertex_element_state *velems;
|
struct r300_vertex_element_state *velems;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
struct pipe_vertex_element dummy_attrib = {0};
|
struct pipe_vertex_element dummy_attrib = {0};
|
||||||
@@ -1697,11 +1696,9 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
velems->count = count;
|
velems->count = count;
|
||||||
|
memcpy(velems->velem, attribs, sizeof(struct pipe_vertex_element) * count);
|
||||||
|
|
||||||
if (r300_screen(pipe->screen)->caps.has_tcl) {
|
if (r300_screen(pipe->screen)->caps.has_tcl) {
|
||||||
velems->vmgr_elements =
|
|
||||||
u_vbuf_create_vertex_elements(r300->vbuf_mgr, count, attribs,
|
|
||||||
velems->velem);
|
|
||||||
/* Setup PSC.
|
/* Setup PSC.
|
||||||
* The unused components will be replaced by (..., 0, 1). */
|
* The unused components will be replaced by (..., 0, 1). */
|
||||||
r300_vertex_psc(velems);
|
r300_vertex_psc(velems);
|
||||||
@@ -1711,8 +1708,6 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
|
|||||||
align(util_format_get_blocksize(velems->velem[i].src_format), 4);
|
align(util_format_get_blocksize(velems->velem[i].src_format), 4);
|
||||||
velems->vertex_size_dwords += velems->format_size[i] / 4;
|
velems->vertex_size_dwords += velems->format_size[i] / 4;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
memcpy(velems->velem, attribs, count * sizeof(struct pipe_vertex_element));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return velems;
|
return velems;
|
||||||
@@ -1730,9 +1725,7 @@ static void r300_bind_vertex_elements_state(struct pipe_context *pipe,
|
|||||||
|
|
||||||
r300->velems = velems;
|
r300->velems = velems;
|
||||||
|
|
||||||
if (r300->screen->caps.has_tcl) {
|
if (r300->draw) {
|
||||||
u_vbuf_bind_vertex_elements(r300->vbuf_mgr, state, velems->vmgr_elements);
|
|
||||||
} else {
|
|
||||||
draw_set_vertex_elements(r300->draw, velems->count, velems->velem);
|
draw_set_vertex_elements(r300->draw, velems->count, velems->velem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1744,12 +1737,6 @@ static void r300_bind_vertex_elements_state(struct pipe_context *pipe,
|
|||||||
|
|
||||||
static void r300_delete_vertex_elements_state(struct pipe_context *pipe, void *state)
|
static void r300_delete_vertex_elements_state(struct pipe_context *pipe, void *state)
|
||||||
{
|
{
|
||||||
struct r300_context *r300 = r300_context(pipe);
|
|
||||||
struct r300_vertex_element_state *velems = state;
|
|
||||||
|
|
||||||
if (r300->screen->caps.has_tcl) {
|
|
||||||
u_vbuf_destroy_vertex_elements(r300->vbuf_mgr, velems->vmgr_elements);
|
|
||||||
}
|
|
||||||
FREE(state);
|
FREE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,7 +55,7 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
|
|||||||
util_blitter_save_rasterizer(rctx->blitter, rctx->states[R600_PIPE_STATE_RASTERIZER]);
|
util_blitter_save_rasterizer(rctx->blitter, rctx->states[R600_PIPE_STATE_RASTERIZER]);
|
||||||
util_blitter_save_fragment_shader(rctx->blitter, rctx->ps_shader);
|
util_blitter_save_fragment_shader(rctx->blitter, rctx->ps_shader);
|
||||||
util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader);
|
util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader);
|
||||||
util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_elements);
|
util_blitter_save_vertex_elements(rctx->blitter, rctx->vbuf_mgr->vertex_elements);
|
||||||
if (rctx->states[R600_PIPE_STATE_VIEWPORT]) {
|
if (rctx->states[R600_PIPE_STATE_VIEWPORT]) {
|
||||||
util_blitter_save_viewport(rctx->blitter, &rctx->viewport);
|
util_blitter_save_viewport(rctx->blitter, &rctx->viewport);
|
||||||
}
|
}
|
||||||
|
@@ -167,7 +167,6 @@ struct r600_vertex_element
|
|||||||
{
|
{
|
||||||
unsigned count;
|
unsigned count;
|
||||||
struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS];
|
struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS];
|
||||||
struct u_vbuf_elements *vmgr_elements;
|
|
||||||
struct r600_resource *fetch_shader;
|
struct r600_resource *fetch_shader;
|
||||||
unsigned fs_size;
|
unsigned fs_size;
|
||||||
struct r600_pipe_state rstate;
|
struct r600_pipe_state rstate;
|
||||||
|
@@ -358,8 +358,6 @@ void r600_bind_vertex_elements(struct pipe_context *ctx, void *state)
|
|||||||
rctx->vertex_elements = v;
|
rctx->vertex_elements = v;
|
||||||
if (v) {
|
if (v) {
|
||||||
r600_inval_shader_cache(rctx);
|
r600_inval_shader_cache(rctx);
|
||||||
u_vbuf_bind_vertex_elements(rctx->vbuf_mgr, state,
|
|
||||||
v->vmgr_elements);
|
|
||||||
|
|
||||||
rctx->states[v->rstate.id] = &v->rstate;
|
rctx->states[v->rstate.id] = &v->rstate;
|
||||||
r600_context_pipe_state_set(rctx, &v->rstate);
|
r600_context_pipe_state_set(rctx, &v->rstate);
|
||||||
@@ -378,7 +376,6 @@ void r600_delete_vertex_element(struct pipe_context *ctx, void *state)
|
|||||||
rctx->vertex_elements = NULL;
|
rctx->vertex_elements = NULL;
|
||||||
|
|
||||||
pipe_resource_reference((struct pipe_resource**)&v->fetch_shader, NULL);
|
pipe_resource_reference((struct pipe_resource**)&v->fetch_shader, NULL);
|
||||||
u_vbuf_destroy_vertex_elements(rctx->vbuf_mgr, v->vmgr_elements);
|
|
||||||
FREE(state);
|
FREE(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,9 +413,7 @@ void *r600_create_vertex_elements(struct pipe_context *ctx,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
v->count = count;
|
v->count = count;
|
||||||
v->vmgr_elements =
|
memcpy(v->elements, elements, sizeof(struct pipe_vertex_element) * count);
|
||||||
u_vbuf_create_vertex_elements(rctx->vbuf_mgr, count,
|
|
||||||
elements, v->elements);
|
|
||||||
|
|
||||||
if (r600_vertex_elements_build_fetch_shader(rctx, v)) {
|
if (r600_vertex_elements_build_fetch_shader(rctx, v)) {
|
||||||
FREE(v);
|
FREE(v);
|
||||||
|
Reference in New Issue
Block a user