From 7809a85f1423855917e1aeb3ed42fe47a80c7575 Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Sun, 2 Apr 2023 18:30:20 +0200 Subject: [PATCH] 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: 27dcb466293f ("gallium: add take_ownership param into set_vertex_buffers to eliminate atomics") Signed-off-by: Patrick Lerda Part-of: (cherry picked from commit 28cb33fadaf003b6e5a7ea0814e30d8ae7cc814a) --- .pick_status.json | 2 +- src/gallium/drivers/r600/r600_state_common.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index a7006bdf1e3..deaf403a7d0 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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" }, diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index ef2e6a6e8da..32c66ca4d0b 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -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 {