[Mesa-dev] [Mesa-stable] [PATCH] radeonsi: add a workaround for bitfield_extract when count is 0

Juan A. Suarez Romero jasuarez at igalia.com
Tue Sep 25 08:33:01 UTC 2018


On Sat, 2018-09-22 at 12:38 +1000, Timothy Arceri wrote:
> This ports the fix from 3d41757788ac. Both LLVM 7 & 8 continue
> to have this problem.
> 
> It fixes rendering issues in some menu and loading screens of
> Civ VI which can be seen in the trace from bug 104602.
> 

Thank you. Added this patch to 18.2 queue.

	J.A.


> Note: This does not fix the black triangles on Vega for bug
> 104602.
> 
> Cc: mesa-stable at lists.freedesktop.org
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104602
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107276
> ---
>  .../drivers/radeonsi/si_shader_tgsi_alu.c     | 41 ++++++++++++++-----
>  1 file changed, 30 insertions(+), 11 deletions(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> index f54d025aec0..814362bc963 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
> @@ -494,18 +494,37 @@ static void emit_bfe(const struct lp_build_tgsi_action *action,
>  		     struct lp_build_emit_data *emit_data)
>  {
>  	struct si_shader_context *ctx = si_shader_context(bld_base);
> -	LLVMValueRef bfe_sm5;
> -	LLVMValueRef cond;
> -
> -	bfe_sm5 = ac_build_bfe(&ctx->ac, emit_data->args[0],
> -			       emit_data->args[1], emit_data->args[2],
> -			       emit_data->info->opcode == TGSI_OPCODE_IBFE);
>  
> -	/* Correct for GLSL semantics. */
> -	cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntUGE, emit_data->args[2],
> -			     LLVMConstInt(ctx->i32, 32, 0), "");
> -	emit_data->output[emit_data->chan] =
> -		LLVMBuildSelect(ctx->ac.builder, cond, emit_data->args[0], bfe_sm5, "");
> +	if (HAVE_LLVM < 0x0700) {
> +		LLVMValueRef bfe_sm5 =
> +			ac_build_bfe(&ctx->ac, emit_data->args[0],
> +				     emit_data->args[1], emit_data->args[2],
> +				     emit_data->info->opcode == TGSI_OPCODE_IBFE);
> +
> +		/* Correct for GLSL semantics. */
> +		LLVMValueRef cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntUGE, emit_data->args[2],
> +						  LLVMConstInt(ctx->i32, 32, 0), "");
> +		emit_data->output[emit_data->chan] =
> +			LLVMBuildSelect(ctx->ac.builder, cond, emit_data->args[0], bfe_sm5, "");
> +	} else {
> +		/* FIXME: LLVM 7 returns incorrect result when count is 0.
> +		 * https://bugs.freedesktop.org/show_bug.cgi?id=107276
> +		 */
> +		LLVMValueRef zero = ctx->i32_0;
> +		LLVMValueRef bfe_sm5 =
> +			ac_build_bfe(&ctx->ac, emit_data->args[0],
> +				     emit_data->args[1], emit_data->args[2],
> +				     emit_data->info->opcode == TGSI_OPCODE_IBFE);
> +
> +		/* Correct for GLSL semantics. */
> +		LLVMValueRef cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntUGE, emit_data->args[2],
> +						  LLVMConstInt(ctx->i32, 32, 0), "");
> +		LLVMValueRef cond2 = LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ, emit_data->args[2],
> +						   zero, "");
> +		bfe_sm5 = LLVMBuildSelect(ctx->ac.builder, cond, emit_data->args[0], bfe_sm5, "");
> +		emit_data->output[emit_data->chan] =
> +			LLVMBuildSelect(ctx->ac.builder, cond2, zero, bfe_sm5, "");
> +	}
>  }
>  
>  /* this is ffs in C */



More information about the mesa-dev mailing list