mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
radeonsi: fix behavior of GLSL findLSB(0)
12.0 and older need the same fix but elsewhere. Cc: 13.0 <mesa-stable@lists.freedesktop.org> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
e24dc43164
commit
4bf45a6079
1 changed files with 13 additions and 4 deletions
|
|
@ -491,23 +491,32 @@ static void emit_lsb(const struct lp_build_tgsi_action *action,
|
|||
struct lp_build_emit_data *emit_data)
|
||||
{
|
||||
struct gallivm_state *gallivm = bld_base->base.gallivm;
|
||||
LLVMBuilderRef builder = gallivm->builder;
|
||||
LLVMValueRef args[2] = {
|
||||
emit_data->args[0],
|
||||
|
||||
/* The value of 1 means that ffs(x=0) = undef, so LLVM won't
|
||||
* add special code to check for x=0. The reason is that
|
||||
* the LLVM behavior for x=0 is different from what we
|
||||
* need here.
|
||||
*
|
||||
* The hardware already implements the correct behavior.
|
||||
* need here. However, LLVM also assumes that ffs(x) is
|
||||
* in [0, 31], but GLSL expects that ffs(0) = -1, so
|
||||
* a conditional assignment to handle 0 is still required.
|
||||
*/
|
||||
LLVMConstInt(LLVMInt1TypeInContext(gallivm->context), 1, 0)
|
||||
};
|
||||
|
||||
emit_data->output[emit_data->chan] =
|
||||
LLVMValueRef lsb =
|
||||
lp_build_intrinsic(gallivm->builder, "llvm.cttz.i32",
|
||||
emit_data->dst_type, args, ARRAY_SIZE(args),
|
||||
LLVMReadNoneAttribute);
|
||||
|
||||
/* TODO: We need an intrinsic to skip this conditional. */
|
||||
/* Check for zero: */
|
||||
emit_data->output[emit_data->chan] =
|
||||
LLVMBuildSelect(builder,
|
||||
LLVMBuildICmp(builder, LLVMIntEQ, args[0],
|
||||
bld_base->uint_bld.zero, ""),
|
||||
lp_build_const_int32(gallivm, -1), lsb, "");
|
||||
}
|
||||
|
||||
/* Find the last bit set. */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue