[Mesa-dev] [PATCH] radeonsi: compute the absolute value before RSQ
Samuel Pitoiset
samuel.pitoiset at gmail.com
Thu Jan 5 19:40:18 UTC 2017
On 01/05/2017 06:37 PM, Marek Olšák wrote:
> Shouldn't we also use abs for SQRT? For example, this adds abs for
> both RSQ and SQRT:
>
> https://cgit.freedesktop.org/~mareko/mesa/commit/?id=5e0fb661a8e6ac5f7b2245dd31595155128e0664
Yes, it makes more sense to do it for both even if we don't have any
open bug reports about SQRT. That could eventually happen in the future.
>
> Marek
>
> On Thu, Jan 5, 2017 at 5:47 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> As explained by Nicolai, it seems like D3D always compute the
>> absolute value while GLSL says that the result of inversesqrt()
>> is undefined if x <= 0. Using the absolute value looks like safer
>> especially when the game has been ported from D3D to GL.
>>
>> This gets rid of the NaN values in the "Spec Ops: The Line" game
>> as well as the black squares.
>>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97338
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>
>> Nouveau also computes the absolute value before emitting RSQ.
>>
>> src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
>> index 1966752cc0..ec6d6b0534 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
>> +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c
>> @@ -754,9 +754,12 @@ static void emit_rsq(const struct lp_build_tgsi_action *action,
>> struct lp_build_tgsi_context *bld_base,
>> struct lp_build_emit_data *emit_data)
>> {
>> - LLVMValueRef sqrt =
>> - lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_SQRT,
>> - emit_data->args[0]);
>> + LLVMValueRef abs, sqrt;
>> +
>> + abs = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS,
>> + emit_data->args[0]);
>> +
>> + sqrt = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_SQRT, abs);
>>
>> emit_data->output[emit_data->chan] =
>> lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_DIV,
>> --
>> 2.11.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list