mirror of
https://gitee.com/openharmony/third_party_mesa3d
synced 2025-02-25 12:51:00 +00:00
radeonsi: add a workaround for bitfield_extract when count is 0
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. Note: This does not fix the black triangles on Vega for bug 104602. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104602 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107276
This commit is contained in:
parent
e4538b93f5
commit
0e6cdfd561
@ -495,18 +495,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);
|
||||
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. */
|
||||
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, "");
|
||||
/* 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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user