diff options
author | Marek Olšák <[email protected]> | 2014-07-11 23:17:07 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2014-07-18 01:58:59 +0200 |
commit | d808de31bd3bac26cdea4d1d9464ad7f010d77d1 (patch) | |
tree | 269b64a43ca13d62e250c79ff1ce8cedf496be27 | |
parent | 6210d6fdc2ffd2a46c73e64f1a1c443fe015a59e (diff) |
radeonsi: only update vertex buffers when they need updating
Reviewed-by: Michel Dänzer <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_descriptors.c | 16 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_draw.c | 6 |
3 files changed, 22 insertions, 2 deletions
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index bd7695c8cd0..4751b8b8f4f 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -933,6 +933,8 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource struct r600_resource *rbuffer = r600_resource(buf); unsigned i, shader, alignment = rbuffer->buf->alignment; uint64_t old_va = r600_resource_va(ctx->screen, buf); + unsigned num_elems = sctx->vertex_elements ? + sctx->vertex_elements->count : 0; /* Reallocate the buffer in the same pipe_resource. */ r600_init_resource(&sctx->screen->b, rbuffer, rbuffer->b.b.width0, @@ -945,7 +947,19 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource */ /* Vertex buffers. */ - /* Nothing to do. Vertex buffer bindings are updated before every draw call. */ + for (i = 0; i < num_elems; i++) { + int vb = sctx->vertex_elements->elements[i].vertex_buffer_index; + + if (vb >= Elements(sctx->vertex_buffer)) + continue; + if (!sctx->vertex_buffer[vb].buffer) + continue; + + if (sctx->vertex_buffer[vb].buffer == buf) { + sctx->vertex_buffers_dirty = true; + break; + } + } /* Read/Write buffers. */ for (shader = 0; shader < SI_NUM_SHADERS; shader++) { diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index c6918721f61..fde06fcd6a2 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -2813,6 +2813,7 @@ static void si_bind_vertex_elements(struct pipe_context *ctx, void *state) struct si_vertex_element *v = (struct si_vertex_element*)state; sctx->vertex_elements = v; + sctx->vertex_buffers_dirty = true; } static void si_delete_vertex_element(struct pipe_context *ctx, void *state) @@ -2848,6 +2849,7 @@ static void si_set_vertex_buffers(struct pipe_context *ctx, pipe_resource_reference(&dst[i].buffer, NULL); } } + sctx->vertex_buffers_dirty = true; } static void si_set_index_buffer(struct pipe_context *ctx, diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index a0078c0c355..f829d0363a4 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -892,7 +892,11 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info) return; si_update_derived_state(sctx); - si_update_vertex_buffers(sctx); + + if (sctx->vertex_buffers_dirty) { + si_update_vertex_buffers(sctx); + sctx->vertex_buffers_dirty = false; + } if (info->indexed) { /* Initialize the index buffer struct. */ |