From a7696a4d98bcf4cdfae1c56a21c4deb3a9ce004f Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Mon, 6 Feb 2023 09:41:36 -0800 Subject: [PATCH] lavapipe: Fix bad array index scale factor in lvp_inline_uniforms pass A few lines earlier uni_offsets is accessed with ubo scaled by PIPE_MAX_CONSTANT_BUFFERS: if (uni_offsets[ubo * PIPE_MAX_CONSTANT_BUFFERS + i] == offset) Found by inspection. Looking at the before and after NIR code for dEQP-VK.graphicsfuzz.cov-int-initialize-from-multiple-large-arrays, using the correct indexing appears to enable the pass to inline an additional uniform. My guess is that when a uniform is used more than once, the first loop wouldn't find the offset recored in the table because it was recorded at the wrong location. Fixes: d23a9380dd6 ("lavapipe: implement extreme uniform inlining") Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/frontends/lavapipe/lvp_inline_uniforms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gallium/frontends/lavapipe/lvp_inline_uniforms.c b/src/gallium/frontends/lavapipe/lvp_inline_uniforms.c index 76c0b517530..1afb29be8a9 100644 --- a/src/gallium/frontends/lavapipe/lvp_inline_uniforms.c +++ b/src/gallium/frontends/lavapipe/lvp_inline_uniforms.c @@ -101,7 +101,7 @@ src_only_uses_uniforms(const nir_src *src, int component, /* Record the uniform offset. */ if (uni_offsets) - uni_offsets[ubo * MAX_INLINABLE_UNIFORMS + num_offsets[ubo]++] = offset; + uni_offsets[ubo * PIPE_MAX_CONSTANT_BUFFERS + num_offsets[ubo]++] = offset; return true; } return false;