On 05/12/2018 19:31, Connor Abbott wrote: > On Wed, Dec 5, 2018 at 4:56 PM Samuel Iglesias Gonsálvez > <sigles...@igalia.com> wrote: >> >> According to VK_KHR_shader_float_controls: >> >> "Denormalized values obtained via unpacking an integer into a vector >> of values with smaller bit width and interpreting those values as >> floating-point numbers must: be flushed to zero, unless the entry point >> is declared with the code:DenormPreserve execution mode." >> >> Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> >> --- >> src/compiler/nir/nir_constant_expressions.py | 13 +++++++++++++ >> src/compiler/nir/nir_lower_alu_to_scalar.c | 10 ++++++++-- >> src/compiler/nir/nir_opcodes.py | 5 +++++ >> 3 files changed, 26 insertions(+), 2 deletions(-) >> >> diff --git a/src/compiler/nir/nir_constant_expressions.py >> b/src/compiler/nir/nir_constant_expressions.py >> index a9af1bd233d..bc60a08da28 100644 >> --- a/src/compiler/nir/nir_constant_expressions.py >> +++ b/src/compiler/nir/nir_constant_expressions.py >> @@ -245,6 +245,19 @@ pack_half_1x16(float x) >> return _mesa_float_to_half(x); >> } >> >> +/** >> + * Evaluate one component of unpackHalf2x16. >> + */ >> +static float >> +unpack_half_1x16_flush_to_zero(uint16_t u) >> +{ >> + if (u < 0x0400) >> + u = 0; >> + if (u & 0x8000 && !(u & 0x7c00)) >> + u = 0x8000; >> + return _mesa_half_to_float(u); >> +} >> + >> /** >> * Evaluate one component of unpackHalf2x16. >> */ >> diff --git a/src/compiler/nir/nir_lower_alu_to_scalar.c >> b/src/compiler/nir/nir_lower_alu_to_scalar.c >> index 7ef032cd164..d80cf2504c7 100644 >> --- a/src/compiler/nir/nir_lower_alu_to_scalar.c >> +++ b/src/compiler/nir/nir_lower_alu_to_scalar.c >> @@ -133,8 +133,14 @@ lower_alu_instr_scalar(nir_alu_instr *instr, >> nir_builder *b) >> nir_ssa_def *packed = nir_ssa_for_alu_src(b, instr, 0); >> >> nir_ssa_def *comps[2]; >> - comps[0] = nir_unpack_half_2x16_split_x(b, packed); >> - comps[1] = nir_unpack_half_2x16_split_y(b, packed); >> + >> + if (b->shader->info.shader_float_controls_execution_mode & >> SHADER_DENORM_FLUSH_TO_ZERO_FP16) { >> + comps[0] = nir_unpack_half_2x16_split_x_flush_to_zero(b, packed); >> + comps[1] = nir_unpack_half_2x16_split_y_flush_to_zero(b, packed); > > This feels a little wrong... I think either we should add a > nir_op_unpack_half_2x16_flush_to_zero, or we shouldn't be changing > this here. We should be consistent on whether the flushing behavior is > implied by the environment or specified by the opcode. >
Right, I am going to add it. Thanks! Sam >> + } else { >> + comps[0] = nir_unpack_half_2x16_split_x(b, packed); >> + comps[1] = nir_unpack_half_2x16_split_y(b, packed); >> + } >> nir_ssa_def *vec = nir_vec(b, comps, 2); >> >> nir_ssa_def_rewrite_uses(&instr->dest.dest.ssa, nir_src_for_ssa(vec)); >> diff --git a/src/compiler/nir/nir_opcodes.py >> b/src/compiler/nir/nir_opcodes.py >> index eb554a66b44..191025f6932 100644 >> --- a/src/compiler/nir/nir_opcodes.py >> +++ b/src/compiler/nir/nir_opcodes.py >> @@ -309,6 +309,11 @@ unop_convert("unpack_half_2x16_split_x", tfloat32, >> tuint32, >> unop_convert("unpack_half_2x16_split_y", tfloat32, tuint32, >> "unpack_half_1x16((uint16_t)(src0 >> 16))") >> >> +unop_convert("unpack_half_2x16_split_x_flush_to_zero", tfloat32, tuint32, >> + "unpack_half_1x16_flush_to_zero((uint16_t)(src0 & 0xffff))") >> +unop_convert("unpack_half_2x16_split_y_flush_to_zero", tfloat32, tuint32, >> + "unpack_half_1x16_flush_to_zero((uint16_t)(src0 >> 16))") >> + >> unop_convert("unpack_32_2x16_split_x", tuint16, tuint32, "src0") >> unop_convert("unpack_32_2x16_split_y", tuint16, tuint32, "src0 >> 16") >> >> -- >> 2.19.1 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev