r600: fix refcnt imbalance related to r600_set_vertex_buffers()

For instance, this issue is triggered with: "piglit/bin/useprogram-flushverts-2 -auto -fbo" or
"piglit/bin/primitive-restart-draw-mode line_loop -auto"
while setting GALLIUM_REFCNT_LOG=refcnt.log.

Fixes: 27dcb46629 ("gallium: add take_ownership param into set_vertex_buffers to eliminate atomics")

Signed-off-by: Patrick Lerda <patrick9876@free.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22395>
(cherry picked from commit 28cb33fada)
This commit is contained in:
Patrick Lerda 2023-04-02 18:30:20 +02:00 committed by Eric Engestrom
parent bf6c8ee864
commit 7809a85f14
2 changed files with 13 additions and 5 deletions

View file

@ -481,7 +481,7 @@
"description": "r600: fix refcnt imbalance related to r600_set_vertex_buffers()",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "27dcb466293f2ab3f80a141fd0b8c14617a8e37f"
},

View file

@ -586,10 +586,10 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx,
/* Set vertex buffers. */
if (input) {
for (i = 0; i < count; i++) {
if ((input[i].buffer.resource != vb[i].buffer.resource) ||
(vb[i].stride != input[i].stride) ||
(vb[i].buffer_offset != input[i].buffer_offset) ||
(vb[i].is_user_buffer != input[i].is_user_buffer)) {
if (likely((input[i].buffer.resource != vb[i].buffer.resource) ||
(vb[i].stride != input[i].stride) ||
(vb[i].buffer_offset != input[i].buffer_offset) ||
(vb[i].is_user_buffer != input[i].is_user_buffer))) {
if (input[i].buffer.resource) {
vb[i].stride = input[i].stride;
vb[i].buffer_offset = input[i].buffer_offset;
@ -606,6 +606,14 @@ static void r600_set_vertex_buffers(struct pipe_context *ctx,
pipe_resource_reference(&vb[i].buffer.resource, NULL);
disable_mask |= 1 << i;
}
} else if (input[i].buffer.resource) {
if (take_ownership) {
pipe_resource_reference(&vb[i].buffer.resource, NULL);
vb[i].buffer.resource = input[i].buffer.resource;
} else {
pipe_resource_reference(&vb[i].buffer.resource,
input[i].buffer.resource);
}
}
}
} else {