From: Patrick Rudolph Date: Thu, 10 Dec 2015 18:50:38 +0000 (+0100) Subject: gallium/util: return correct number of bound vertex buffers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;ds=sidebyside;h=79bff488bc23b8615cc37069b6c5914c56be835f;p=mesa.git gallium/util: return correct number of bound vertex buffers In case a state tracker unbinds every slot by a seperate pipe->set_vertex_buffers() call, starting from slot zero, the number of bound buffers would not reach zero at all. The current algorithm does not account for pre-existing holes in the buffer list. Unbinding all buffers at once or starting at the top-most slot results in correct behaviour. Calculating the correct number of bound buffers fixes a NULL pointer dereference in nvc0_validate_vertex_buffers_shared(). Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93004 Signed-off-by: Patrick Rudolph Reviewed-by: Marek Olšák Reviewed-by: Ilia Mirkin Cc: "11.0 11.1" --- diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c index 09619c1c9e9..09020b061a3 100644 --- a/src/gallium/auxiliary/util/u_helpers.c +++ b/src/gallium/auxiliary/util/u_helpers.c @@ -81,7 +81,13 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, const struct pipe_vertex_buffer *src, unsigned start_slot, unsigned count) { - uint32_t enabled_buffers = (1ull << *dst_count) - 1; + unsigned i; + uint32_t enabled_buffers = 0; + + for (i = 0; i < *dst_count; i++) { + if (dst[i].buffer || dst[i].user_buffer) + enabled_buffers |= (1ull << i); + } util_set_vertex_buffers_mask(dst, &enabled_buffers, src, start_slot, count);