i915: fix i915_set_vertex_buffers() related refcnt imbalance and remove redundancies

Indeed, this resource was assigned twice and was not properly freed.

For instance, this issue is triggered with:
"piglit/bin/glsl-fs-pointcoord -auto -fbo"
while setting GALLIUM_REFCNT_LOG=refcnt.log.

Fixes: 0278d1fa32 ("gallium: add unbind_num_trailing_slots to set_vertex_buffers")
Signed-off-by: Patrick Lerda <patrick9876@free.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27572>
(cherry picked from commit 22c399320b)
This commit is contained in:
Patrick Lerda 2024-02-09 01:10:48 +01:00 committed by Eric Engestrom
parent 217ed7f108
commit 885b1cfd36
5 changed files with 17 additions and 18 deletions

View file

@ -414,7 +414,7 @@
"description": "i915: fix i915_set_vertex_buffers() related refcnt imbalance and remove redundancies",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "0278d1fa323cf1f289a2c5f4cd803c4203d4a48a",
"notes": null

View file

@ -78,14 +78,14 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
/*
* Map vertex buffers
*/
for (i = 0; i < i915->nr_vertex_buffers; i++) {
const void *buf = i915->vertex_buffers[i].is_user_buffer
? i915->vertex_buffers[i].buffer.user
for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
const void *buf = draw->pt.vertex_buffer[i].is_user_buffer
? draw->pt.vertex_buffer[i].buffer.user
: NULL;
if (!buf) {
if (!i915->vertex_buffers[i].buffer.resource)
if (!draw->pt.vertex_buffer[i].buffer.resource)
continue;
buf = i915_buffer(i915->vertex_buffers[i].buffer.resource)->data;
buf = i915_buffer(draw->pt.vertex_buffer[i].buffer.resource)->data;
}
draw_set_mapped_vertex_buffer(draw, i, buf, ~0);
}
@ -112,13 +112,13 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
/*
* Do the drawing
*/
draw_vbo(i915->draw, info, drawid_offset, NULL, draws, num_draws, 0);
draw_vbo(draw, info, drawid_offset, NULL, draws, num_draws, 0);
/*
* unmap vertex/index buffers
*/
for (i = 0; i < i915->nr_vertex_buffers; i++) {
draw_set_mapped_vertex_buffer(i915->draw, i, NULL, 0);
for (i = 0; i < draw->pt.nr_vertex_buffers; i++) {
draw_set_mapped_vertex_buffer(draw, i, NULL, 0);
}
if (mapped_indices)
draw_set_indexes(draw, NULL, 0, 0);
@ -127,7 +127,7 @@ i915_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info,
* Instead of flushing on every state change, we flush once here
* when we fire the vbo.
*/
draw_flush(i915->draw);
draw_flush(draw);
}
/*

View file

@ -32,6 +32,7 @@
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "draw/draw_private.h"
#include "draw/draw_vertex.h"
#include "tgsi/tgsi_scan.h"
@ -272,8 +273,6 @@ struct i915_context {
void *vs;
struct i915_velems_state *velems;
unsigned nr_vertex_buffers;
struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
struct pipe_blend_color blend_color;
struct pipe_stencil_ref stencil_ref;

View file

@ -1012,11 +1012,11 @@ i915_set_vertex_buffers(struct pipe_context *pipe, unsigned count,
struct i915_context *i915 = i915_context(pipe);
struct draw_context *draw = i915->draw;
util_set_vertex_buffers_count(i915->vertex_buffers, &i915->nr_vertex_buffers,
buffers, count, true);
assert(count <= PIPE_MAX_ATTRIBS);
/* pass-through to draw module */
draw_set_vertex_buffers(draw, count, buffers);
util_set_vertex_buffers_count(draw->pt.vertex_buffer,
&draw->pt.nr_vertex_buffers, buffers, count,
true);
}
static void *

View file

@ -60,8 +60,8 @@ i915_util_blitter_save_states(struct i915_context *i915)
util_blitter_save_viewport(i915->blitter, &i915->viewport);
util_blitter_save_scissor(i915->blitter, &i915->scissor);
util_blitter_save_vertex_elements(i915->blitter, i915->velems);
util_blitter_save_vertex_buffers(i915->blitter, i915->vertex_buffers,
i915->nr_vertex_buffers);
util_blitter_save_vertex_buffers(i915->blitter, i915->draw->pt.vertex_buffer,
i915->draw->pt.nr_vertex_buffers);
util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer);