freedreno: Clamp UBO uploads to the constlen decided by the shader.
authorRob Clark <robdclark@chromium.org>
Sun, 23 Jun 2019 19:52:05 +0000 (12:52 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 24 Jun 2019 21:23:07 +0000 (14:23 -0700)
If the NIR-level analysis decided to move UBO loads to the constant
file, but the backend decided not to load those constants, we could
upload past the end of constlen.  This is particularly relevant for
pre-a6xx, where we emit a different constlen between bin and render
variants.

(Fix by Rob, commit message by anholt)

Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/drivers/freedreno/ir3/ir3_gallium.c

index 35693f97c3b5e1160a89bb6972abd0d3ecfe3687..3315afb9144b01ca313659b4a7bbf05f42833ba9 100644 (file)
@@ -247,9 +247,20 @@ emit_user_consts(struct fd_context *ctx, const struct ir3_shader_variant *v,
 
                        uint32_t size = state->range[i].end - state->range[i].start;
                        uint32_t offset = cb->buffer_offset + state->range[i].start;
+
+                       /* and even if the start of the const buffer is before
+                        * first_immediate, the end may not be:
+                        */
+                       size = MIN2(size, (16 * v->constlen) - state->range[i].offset);
+
+                       if (size == 0)
+                               continue;
+
+                       /* things should be aligned to vec4: */
                        debug_assert((state->range[i].offset % 16) == 0);
                        debug_assert((size % 16) == 0);
                        debug_assert((offset % 16) == 0);
+
                        ctx->emit_const(ring, v->type, state->range[i].offset / 4,
                                                        offset, size / 4, cb->user_buffer, cb->buffer);
                }