From 58b3d24b25bdec87dd12445b85fd50c8d7eefc71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 10 Feb 2025 16:54:46 -0500 Subject: [PATCH] nine: bind exactly the number of vertex buffers as vertex elements need gallium will require this (radeonsi won't work otherwise). Acked-By: Mike Blumenkrantz Part-of: --- src/gallium/frontends/nine/nine_state.c | 17 +++++++++++++---- src/gallium/frontends/nine/nine_state.h | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index b1bd756aed3..d857caea2f1 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -897,6 +897,8 @@ update_vertex_elements(struct NineDevice9 *device) u_foreach_bit(bit, vtxbuf_mask) vtxbuf_holes_map[bit] = i++; + context->num_vertex_buffers = 0; + for (n = 0; n < vs->num_inputs; ++n) { index = vdecl_index_map[n]; if (index >= 0) { @@ -920,6 +922,8 @@ update_vertex_elements(struct NineDevice9 *device) ve.velems[n].instance_divisor = 0; ve.velems[n].dual_slot = false; } + context->num_vertex_buffers = MAX2(context->num_vertex_buffers, + ve.velems[n].vertex_buffer_index + 1); } if (context->dummy_vbo_bound_at != dummy_vbo_stream) { @@ -940,12 +944,11 @@ update_vertex_buffers(struct NineDevice9 *device) struct nine_context *context = &device->context; struct pipe_context *pipe = context->pipe; struct pipe_vertex_buffer vbuffer[PIPE_MAX_ATTRIBS]; - unsigned vtxbuf_count; + unsigned num_vertex_buffers = context->num_vertex_buffers; unsigned mask, i, vtxbuf_i; mask = context->vtxbuf_mask | ((context->dummy_vbo_bound_at >= 0) ? BITFIELD_BIT(context->dummy_vbo_bound_at) : 0); - vtxbuf_count = util_bitcount(mask); DBG("mask=%x\n", mask); for (i = 0; mask; i++) { @@ -959,8 +962,14 @@ update_vertex_buffers(struct NineDevice9 *device) } } - if (vtxbuf_count) - util_set_vertex_buffers(pipe, vtxbuf_count, false, vbuffer); + /* Gallium requires that we bind exactly the number of vertex buffers that's + * used by vertex elements. + */ + if (i < num_vertex_buffers) + memset(&vbuffer[i], 0, sizeof(vbuffer[i]) * (num_vertex_buffers - i)); + + if (num_vertex_buffers) + util_set_vertex_buffers(pipe, num_vertex_buffers, false, vbuffer); else pipe->set_vertex_buffers(pipe, 0, NULL); diff --git a/src/gallium/frontends/nine/nine_state.h b/src/gallium/frontends/nine/nine_state.h index 8802f95f53e..2d6030c2db3 100644 --- a/src/gallium/frontends/nine/nine_state.h +++ b/src/gallium/frontends/nine/nine_state.h @@ -268,6 +268,7 @@ struct nine_context { struct NineVertexDeclaration9 *vdecl; + unsigned num_vertex_buffers; struct pipe_vertex_buffer vtxbuf[PIPE_MAX_ATTRIBS]; uint32_t vtxbuf_mask; /* i bit set for context->vtxbuf[i].buffer.resource not NULL */ uint16_t vtxstride[PIPE_MAX_ATTRIBS];