From f140b96edcc5429d33d0d613ea50dd11a8f0dcd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 25 Sep 2025 07:01:17 -0400 Subject: [PATCH] radeonsi: remove recursion from si_set_constant_buffer Instead of calling self to bind NULL on user buffer upload failure, upload sooner and set input = NULL on failure. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_descriptors.c | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 80c0337da91..7b4f31a4490 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -1118,36 +1118,36 @@ static void si_set_constant_buffer(struct si_context *sctx, struct si_buffer_res { struct si_descriptors *descs = &sctx->descriptors[descriptors_idx]; assert(slot < descs->num_elements); + struct pipe_constant_buffer uploaded_constbuf; /* GFX7 cannot unbind a constant buffer (S_BUFFER_LOAD is buggy * with a NULL buffer). We need to use a dummy buffer instead. */ - if (sctx->gfx_level == GFX7 && (!input || (!input->buffer && !input->user_buffer))) + if (sctx->gfx_level == GFX7 && (!input || (!input->buffer && !input->user_buffer))) { input = &sctx->null_const_buf; + } else if (input && input->user_buffer) { + /* Upload the user buffer. */ + struct pipe_resource *release_buf = NULL; + void *tmp; - if (input && (input->buffer || input->user_buffer)) { - struct pipe_resource *buffer = NULL; - unsigned buffer_offset; + u_upload_alloc(sctx->b.const_uploader, 0, input->buffer_size, + si_optimal_tcc_alignment(sctx, input->buffer_size), + &uploaded_constbuf.buffer_offset, &uploaded_constbuf.buffer, &release_buf, + &tmp); + pipe_resource_release(&sctx->b, release_buf); - /* Upload the user buffer if needed. */ - if (input->user_buffer) { - struct pipe_resource *release_buf = NULL; - void *tmp; - - u_upload_alloc(sctx->b.const_uploader, 0, input->buffer_size, - si_optimal_tcc_alignment(sctx, input->buffer_size), - &buffer_offset, &buffer, &release_buf, &tmp); - pipe_resource_release(&sctx->b, release_buf); - if (buffer) { - util_memcpy_cpu_to_le32(tmp, input->user_buffer, input->buffer_size); - } else { - /* Just unbind on failure. */ - si_set_constant_buffer(sctx, buffers, descriptors_idx, slot, NULL); - return; - } + if (uploaded_constbuf.buffer) { + util_memcpy_cpu_to_le32(tmp, input->user_buffer, input->buffer_size); + uploaded_constbuf.buffer_size = input->buffer_size; + input = &uploaded_constbuf; } else { - buffer = input->buffer; - buffer_offset = input->buffer_offset; + /* Failure to upload. Bind NULL. */ + input = NULL; } + } + + if (input && input->buffer) { + struct pipe_resource *buffer = input->buffer; + unsigned buffer_offset = input->buffer_offset; /* Set the descriptor. */ uint32_t *desc = descs->list + slot * 4;