mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 11:48:06 +02:00
ac/nir: fix out-of-bound access when loading constants from global
Global load/store instructions can't know if the offset is
out-of-bound because they don't use descriptors (no range).
Fix this by clamping the offset for arrays that are indexed
with a non-constant offset that's greater or equal to the array
size.
This fixes VM faults and GPU hangs with Dead Rising 4.
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2148
Fixes: 71a6794200 ("ac/nir: Enable nir_opt_large_constants")
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
2c5eb1df68
commit
a0f1a5fa05
1 changed files with 14 additions and 4 deletions
|
|
@ -3758,11 +3758,21 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
|
|||
break;
|
||||
}
|
||||
case nir_intrinsic_load_constant: {
|
||||
unsigned base = nir_intrinsic_base(instr);
|
||||
unsigned range = nir_intrinsic_range(instr);
|
||||
|
||||
LLVMValueRef offset = get_src(ctx, instr->src[0]);
|
||||
LLVMValueRef base = LLVMConstInt(ctx->ac.i32,
|
||||
nir_intrinsic_base(instr),
|
||||
false);
|
||||
offset = LLVMBuildAdd(ctx->ac.builder, offset, base, "");
|
||||
offset = LLVMBuildAdd(ctx->ac.builder, offset,
|
||||
LLVMConstInt(ctx->ac.i32, base, false), "");
|
||||
|
||||
/* Clamp the offset to avoid out-of-bound access because global
|
||||
* instructions can't handle them.
|
||||
*/
|
||||
LLVMValueRef size = LLVMConstInt(ctx->ac.i32, base + range, false);
|
||||
LLVMValueRef cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntULT,
|
||||
offset, size, "");
|
||||
offset = LLVMBuildSelect(ctx->ac.builder, cond, offset, size, "");
|
||||
|
||||
LLVMValueRef ptr = ac_build_gep0(&ctx->ac, ctx->constant_data,
|
||||
offset);
|
||||
LLVMTypeRef comp_type =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue