summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/util/u_helpers.c
diff options
context:
space:
mode:
authorPatrick Rudolph <[email protected]>2015-12-10 19:50:38 +0100
committerIlia Mirkin <[email protected]>2015-12-10 13:55:53 -0500
commit79bff488bc23b8615cc37069b6c5914c56be835f (patch)
treed51927f976c526267c76d49b30511084379fe8ef /src/gallium/auxiliary/util/u_helpers.c
parentba67739b662eaf68f7a1117005e20079b2653044 (diff)
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 <[email protected]> Reviewed-by: Marek Olšák <[email protected]> Reviewed-by: Ilia Mirkin <[email protected]> Cc: "11.0 11.1" <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/util/u_helpers.c')
-rw-r--r--src/gallium/auxiliary/util/u_helpers.c8
1 files changed, 7 insertions, 1 deletions
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);