From b2f79a3823bd5fca3f3080351f87b41e2396c8f6 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sat, 10 Aug 2013 00:48:28 +0800 Subject: ilo: 3DSTATE_INDEX_BUFFER may be wrongly skipped In finalize_index_buffer(), when the current index buffer was destroyed due to u_upload_data(), it may happen that the new index buffer is at the same address as the old one. Comparing the pointers to the two buffers could fail to work, and 3DSTATE_INDEX_BUFFER would be incorrectly skipped. Holding a reference to the current index buffer before calling u_upload_data() should fix the problem. --- src/gallium/drivers/ilo/ilo_state.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/gallium') diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c index 86470a784f8..ce6930c4aec 100644 --- a/src/gallium/drivers/ilo/ilo_state.c +++ b/src/gallium/drivers/ilo/ilo_state.c @@ -128,13 +128,15 @@ finalize_constant_buffers(struct ilo_context *ilo) static void finalize_index_buffer(struct ilo_context *ilo) { - const struct pipe_resource *current_hw_res = ilo->ib.hw_resource; const bool need_upload = (ilo->draw->indexed && (ilo->ib.user_buffer || ilo->ib.offset % ilo->ib.index_size)); + struct pipe_resource *current_hw_res = NULL; if (!(ilo->dirty & ILO_DIRTY_IB) && !need_upload) return; + pipe_resource_reference(¤t_hw_res, ilo->ib.hw_resource); + if (need_upload) { const unsigned offset = ilo->ib.index_size * ilo->draw->start; const unsigned size = ilo->ib.index_size * ilo->draw->count; @@ -175,6 +177,8 @@ finalize_index_buffer(struct ilo_context *ilo) ilo->dirty &= ~ILO_DIRTY_IB; else ilo->ib.hw_index_size = ilo->ib.index_size; + + pipe_resource_reference(¤t_hw_res, NULL); } /** -- cgit v1.2.3