mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-31 16:20:13 +01:00
radeonsi: Go back to using llvm.pow intrinsic for nir_op_fpow
ARB_vertex_program and ARB_fragment_program define 0^0 = 1 (while GLSL
leaves it undefined). Performing fpow lowering in NIR would break this
behavior, preventing us from using prog_to_nir.
According to llvm/lib/Target/AMDGPU/SIInstructions.td, POW_common
expands to <V_LOG_F32_e32, V_EXP_F32_e32, V_MUL_LEGACY_F32_e32>,
which presumably does a zero-wins multiply.
Lowering in NIR results in a non-legacy multiply, where:
pow(0, 0) = 2^(log2(0) * 0)
= 2^(-INF * 0)
= 2^(-NaN)
= -NaN
which isn't the desired result.
This reverts:
- commit d6b7539206
(ac/nir: remove emission of nir_op_fpow)
- commit 22430224fe
(radeonsi/nir: enable lowering of fpow)
and prevents a regression in gl-1.0-spot-light with AMD_DEBUG=nir
after enabling prog_to_nir in st/mesa later in this series.
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
parent
9c4d5926aa
commit
ba7519ca36
2 changed files with 4 additions and 1 deletions
|
|
@ -801,6 +801,10 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
|
|||
result = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.frexp.mant.f64",
|
||||
ctx->ac.f64, src, 1, AC_FUNC_ATTR_READNONE);
|
||||
break;
|
||||
case nir_op_fpow:
|
||||
result = emit_intrin_2f_param(&ctx->ac, "llvm.pow",
|
||||
ac_to_float_type(&ctx->ac, def_type), src[0], src[1]);
|
||||
break;
|
||||
case nir_op_fmax:
|
||||
result = emit_intrin_2f_param(&ctx->ac, "llvm.maxnum",
|
||||
ac_to_float_type(&ctx->ac, def_type), src[0], src[1]);
|
||||
|
|
|
|||
|
|
@ -486,7 +486,6 @@ static const struct nir_shader_compiler_options nir_options = {
|
|||
.lower_scmp = true,
|
||||
.lower_flrp32 = true,
|
||||
.lower_flrp64 = true,
|
||||
.lower_fpow = true,
|
||||
.lower_fsat = true,
|
||||
.lower_fdiv = true,
|
||||
.lower_sub = true,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue