iris: redo VB CSO a bit

This commit is contained in:
Kenneth Graunke
2018-06-18 00:23:25 -07:00
parent 432790bacd
commit 7d1e6f1fa1
+18 -17
View File
@@ -1445,11 +1445,8 @@ struct iris_vertex_buffer_state {
static void
iris_free_vertex_buffers(struct iris_vertex_buffer_state *cso)
{
if (cso) {
for (unsigned i = 0; i < cso->num_buffers; i++)
pipe_resource_reference(&cso->resources[i], NULL);
free(cso);
}
for (unsigned i = 0; i < cso->num_buffers; i++)
pipe_resource_reference(&cso->resources[i], NULL);
}
static void
@@ -1458,27 +1455,29 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
const struct pipe_vertex_buffer *buffers)
{
struct iris_context *ice = (struct iris_context *) ctx;
/* If there are no buffers, do nothing. We can leave the stale
* 3DSTATE_VERTEX_BUFFERS in place - as long as there are no vertex
* elements that point to them, it should be fine.
*/
if (!buffers)
return;
struct iris_vertex_buffer_state *cso =
calloc(1, sizeof(struct iris_vertex_buffer_state));
struct iris_vertex_buffer_state *cso = ice->state.cso_vertex_buffers;
iris_free_vertex_buffers(ice->state.cso_vertex_buffers);
if (!buffers)
count = 0;
cso->num_buffers = count;
iris_pack_command(GENX(3DSTATE_VERTEX_BUFFERS), cso->vertex_buffers, vb) {
vb.DWordLength = 4 * cso->num_buffers - 1;
vb.DWordLength = 4 * MAX2(cso->num_buffers, 1) - 1;
}
uint32_t *vb_pack_dest = &cso->vertex_buffers[1];
if (count == 0) {
iris_pack_state(GENX(VERTEX_BUFFER_STATE), vb_pack_dest, vb) {
vb.VertexBufferIndex = start_slot;
vb.NullVertexBuffer = true;
vb.AddressModifyEnable = true;
}
}
for (unsigned i = 0; i < count; i++) {
assert(!buffers[i].is_user_buffer);
@@ -1498,7 +1497,6 @@ iris_set_vertex_buffers(struct pipe_context *ctx,
vb_pack_dest += GENX(VERTEX_BUFFER_STATE_length);
}
ice->state.cso_vertex_buffers = cso;
ice->state.dirty |= IRIS_DIRTY_VERTEX_BUFFERS;
}
@@ -3248,4 +3246,7 @@ genX(init_state)(struct iris_context *ice)
ice->vtbl.populate_fs_key = iris_populate_fs_key;
ice->state.dirty = ~0ull;
ice->state.cso_vertex_buffers =
calloc(1, sizeof(struct iris_vertex_buffer_state));
}