From c8fe9df9c462ed0cda0d62c7133f21fc2aa6ea84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 28 Nov 2020 05:22:06 -0500 Subject: [PATCH] gallium/u_threaded: don't copy the indexbuf pointer if we overwrite it Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/auxiliary/util/u_threaded_context.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index af0b936c79b..c4349a9d355 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -2345,12 +2345,18 @@ tc_call_draw_multi(struct pipe_context *pipe, union tc_payload *payload) pipe_resource_reference(&info->info.index.resource, NULL); } +#define DRAW_INFO_SIZE_WITHOUT_INDEXBUF_AND_MIN_MAX_INDEX \ + offsetof(struct pipe_draw_info, index) + static void tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info, const struct pipe_draw_indirect_info *indirect, const struct pipe_draw_start_count *draws, unsigned num_draws) { + STATIC_ASSERT(DRAW_INFO_SIZE_WITHOUT_INDEXBUF_AND_MIN_MAX_INDEX + + sizeof(intptr_t) == offsetof(struct pipe_draw_info, min_index)); + struct threaded_context *tc = threaded_context(_pipe); unsigned index_size = info->index_size; bool has_user_indices = info->has_user_indices; @@ -2397,7 +2403,7 @@ tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info, struct tc_draw_single *p = tc_add_struct_typed_call(tc, TC_CALL_draw_single, tc_draw_single); - memcpy(&p->info, info, DRAW_INFO_SIZE_WITHOUT_MIN_MAX_INDEX); + memcpy(&p->info, info, DRAW_INFO_SIZE_WITHOUT_INDEXBUF_AND_MIN_MAX_INDEX); p->info.index.resource = buffer; /* u_threaded_context stores start/count in min/max_index for single draws. */ p->info.min_index = offset >> util_logbase2(index_size); @@ -2444,7 +2450,7 @@ tc_draw_vbo(struct pipe_context *_pipe, const struct pipe_draw_info *info, struct tc_draw_multi *p = tc_add_slot_based_call(tc, TC_CALL_draw_multi, tc_draw_multi, num_draws); - memcpy(&p->info, info, DRAW_INFO_SIZE_WITHOUT_MIN_MAX_INDEX); + memcpy(&p->info, info, DRAW_INFO_SIZE_WITHOUT_INDEXBUF_AND_MIN_MAX_INDEX); p->info.index.resource = buffer; p->num_draws = num_draws;