mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 17:40:11 +01:00
freedreno: Clamp UBO uploads to the constlen decided by the shader.
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>
This commit is contained in:
parent
c1ca138475
commit
572c76fd88
1 changed files with 11 additions and 0 deletions
|
|
@ -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 size = state->range[i].end - state->range[i].start;
|
||||||
uint32_t offset = cb->buffer_offset + 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((state->range[i].offset % 16) == 0);
|
||||||
debug_assert((size % 16) == 0);
|
debug_assert((size % 16) == 0);
|
||||||
debug_assert((offset % 16) == 0);
|
debug_assert((offset % 16) == 0);
|
||||||
|
|
||||||
ctx->emit_const(ring, v->type, state->range[i].offset / 4,
|
ctx->emit_const(ring, v->type, state->range[i].offset / 4,
|
||||||
offset, size / 4, cb->user_buffer, cb->buffer);
|
offset, size / 4, cb->user_buffer, cb->buffer);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue