mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 11:00:11 +01:00
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 <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37566>
This commit is contained in:
parent
1a8088d62b
commit
f140b96edc
1 changed files with 22 additions and 22 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue