From 4478f143278b31887b7d363e76c5c8ca8d13468d Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Sun, 14 Jul 2019 12:55:48 +0200 Subject: [PATCH] radv/gfx10: fix crash when emitting NGG GS prologue ac_nir_context is initialized after the driver emits the NGG GS prologue so it's likely to crash. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_nir_to_llvm.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index e4ab5847729..00c7df8574b 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -3382,15 +3382,22 @@ static void gfx10_ngg_gs_emit_prologue(struct radv_shader_context *ctx) LLVMBuilderRef builder = ctx->ac.builder; LLVMValueRef scratchptr = ctx->gs_ngg_scratch; LLVMValueRef tid = get_thread_id_in_tg(ctx); - LLVMValueRef tmp; + LLVMBasicBlockRef merge_block; + LLVMValueRef cond; - tmp = LLVMBuildICmp(builder, LLVMIntULT, tid, LLVMConstInt(ctx->ac.i32, 4, false), ""); - ac_build_ifcc(&ctx->ac, tmp, 5090); - { - LLVMValueRef ptr = ac_build_gep0(&ctx->ac, scratchptr, tid); - LLVMBuildStore(builder, ctx->ac.i32_0, ptr); - } - ac_build_endif(&ctx->ac, 5090); + LLVMValueRef fn = LLVMGetBasicBlockParent(LLVMGetInsertBlock(ctx->ac.builder)); + LLVMBasicBlockRef then_block = LLVMAppendBasicBlockInContext(ctx->ac.context, fn, ""); + merge_block = LLVMAppendBasicBlockInContext(ctx->ac.context, fn, ""); + + cond = LLVMBuildICmp(builder, LLVMIntULT, tid, LLVMConstInt(ctx->ac.i32, 4, false), ""); + LLVMBuildCondBr(ctx->ac.builder, cond, then_block, merge_block); + LLVMPositionBuilderAtEnd(ctx->ac.builder, then_block); + + LLVMValueRef ptr = ac_build_gep0(&ctx->ac, scratchptr, tid); + LLVMBuildStore(builder, ctx->ac.i32_0, ptr); + + LLVMBuildBr(ctx->ac.builder, merge_block); + LLVMPositionBuilderAtEnd(ctx->ac.builder, merge_block); ac_build_s_barrier(&ctx->ac); } -- 2.30.2