mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
vtn: Fix Modf.
We were botching this for negative numbers - floor of a negative rounds the wrong way. Additionally, both results are supposed to retain the sign of the original. To fix this, just take the abs of both values, then put the sign back. There's probably a better way to do this, but this works for now.
This commit is contained in:
parent
4acfc9effb
commit
f92a35d831
1 changed files with 8 additions and 4 deletions
|
|
@ -418,16 +418,20 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,
|
|||
case GLSLstd450InverseSqrt: op = nir_op_frsq; break;
|
||||
|
||||
case GLSLstd450Modf: {
|
||||
val->ssa->def = nir_ffract(nb, src[0]);
|
||||
nir_ssa_def *sign = nir_fsign(nb, src[0]);
|
||||
nir_ssa_def *abs = nir_fabs(nb, src[0]);
|
||||
val->ssa->def = nir_fmul(nb, sign, nir_ffract(nb, abs));
|
||||
nir_store_deref_var(nb, vtn_nir_deref(b, w[6]),
|
||||
nir_ffloor(nb, src[0]), 0xf);
|
||||
nir_fmul(nb, sign, nir_ffloor(nb, abs)), 0xf);
|
||||
return;
|
||||
}
|
||||
|
||||
case GLSLstd450ModfStruct: {
|
||||
nir_ssa_def *sign = nir_fsign(nb, src[0]);
|
||||
nir_ssa_def *abs = nir_fabs(nb, src[0]);
|
||||
assert(glsl_type_is_struct(val->ssa->type));
|
||||
val->ssa->elems[0]->def = nir_ffract(nb, src[0]);
|
||||
val->ssa->elems[1]->def = nir_ffloor(nb, src[0]);
|
||||
val->ssa->elems[0]->def = nir_fmul(nb, sign, nir_ffract(nb, abs));
|
||||
val->ssa->elems[1]->def = nir_fmul(nb, sign, nir_ffloor(nb, abs));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue