diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 6b833fa506e..8885b95fad0 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -586,10 +586,10 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx, /* Set vertex buffers. */ if (input) { for (i = 0; i < count; i++) { - if ((input[i].buffer.resource != vb[i].buffer.resource) || - (vb[i].stride != input[i].stride) || - (vb[i].buffer_offset != input[i].buffer_offset) || - (vb[i].is_user_buffer != input[i].is_user_buffer)) { + if (likely((input[i].buffer.resource != vb[i].buffer.resource) || + (vb[i].stride != input[i].stride) || + (vb[i].buffer_offset != input[i].buffer_offset) || + (vb[i].is_user_buffer != input[i].is_user_buffer))) { if (input[i].buffer.resource) { vb[i].stride = input[i].stride; vb[i].buffer_offset = input[i].buffer_offset; @@ -606,6 +606,14 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx, pipe_resource_reference(&vb[i].buffer.resource, NULL); disable_mask |= 1 << i; } + } else if (input[i].buffer.resource) { + if (take_ownership) { + pipe_resource_reference(&vb[i].buffer.resource, NULL); + vb[i].buffer.resource = input[i].buffer.resource; + } else { + pipe_resource_reference(&vb[i].buffer.resource, + input[i].buffer.resource); + } } } } else {