Module: Mesa Branch: main Commit: 815ed12e3b4a19eb7a62c638ea5744991cb4ef24 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=815ed12e3b4a19eb7a62c638ea5744991cb4ef24
Author: Mike Blumenkrantz <[email protected]> Date: Mon Oct 16 09:34:56 2023 -0400 tc: use strong refs for fb attachment tracking this is necessary for unsynchronized texture upload tracking Acked-by: Marek Olšák <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25624> --- src/gallium/auxiliary/util/u_threaded_context.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index 268a02cf4bc..792d8a0d809 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -1483,8 +1483,10 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, p->state.nr_cbufs = nr_cbufs; /* when unbinding, mark attachments as used for the current batch */ - for (unsigned i = 0; i < tc->nr_cbufs; i++) + for (unsigned i = 0; i < tc->nr_cbufs; i++) { tc_set_resource_batch_usage_persistent(tc, tc->fb_resources[i], false); + pipe_resource_reference(&tc->fb_resources[i], NULL); + } tc_set_resource_batch_usage_persistent(tc, tc->fb_resources[PIPE_MAX_COLOR_BUFS], false); tc_set_resource_batch_usage_persistent(tc, tc->fb_resolve, false); @@ -1492,12 +1494,11 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, p->state.cbufs[i] = NULL; pipe_surface_reference(&p->state.cbufs[i], fb->cbufs[i]); /* full tracking requires storing the fb attachment resources */ - tc->fb_resources[i] = fb->cbufs[i] ? fb->cbufs[i]->texture : NULL; + if (fb->cbufs[i]) + pipe_resource_reference(&tc->fb_resources[i], fb->cbufs[i]->texture); tc_set_resource_batch_usage_persistent(tc, tc->fb_resources[i], true); } tc->nr_cbufs = nr_cbufs; - memset(&tc->fb_resources[nr_cbufs], 0, - sizeof(void*) * (PIPE_MAX_COLOR_BUFS - nr_cbufs)); if (tc->options.parse_renderpass_info) { /* ensure this is treated as the first fb set if no fb activity has occurred */ if (!tc->renderpass_info_recording->has_draw && @@ -1530,8 +1531,9 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, /* future fb state changes will increment the index */ tc->seen_fb_state = true; } - tc->fb_resources[PIPE_MAX_COLOR_BUFS] = fb->zsbuf ? fb->zsbuf->texture : NULL; - tc->fb_resolve = fb->resolve; + pipe_resource_reference(&tc->fb_resources[PIPE_MAX_COLOR_BUFS], + fb->zsbuf ? fb->zsbuf->texture : NULL); + pipe_resource_reference(&tc->fb_resolve, fb->resolve); tc_set_resource_batch_usage_persistent(tc, tc->fb_resources[PIPE_MAX_COLOR_BUFS], true); tc_set_resource_batch_usage_persistent(tc, tc->fb_resolve, true); tc->in_renderpass = false; @@ -4944,6 +4946,10 @@ tc_destroy(struct pipe_context *_pipe) util_queue_fence_destroy(&tc->buffer_lists[i].driver_flushed_fence); } + for (unsigned i = 0; i < ARRAY_SIZE(tc->fb_resources); i++) + pipe_resource_reference(&tc->fb_resources[i], NULL); + pipe_resource_reference(&tc->fb_resolve, NULL); + FREE(tc); }
