Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> --- src/compiler/shader_enums.h | 14 ++++++++++++++ src/compiler/shader_info.h | 3 +++ src/compiler/spirv/spirv_to_nir.c | 26 ++++++++++++++++++++++++++ 3 files changed, 43 insertions(+)
diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index f023b48cbb3..15caf753efb 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -750,6 +750,20 @@ enum compare_func COMPARE_FUNC_ALWAYS, }; +enum shader_float_controls +{ + SHADER_DEFAULT_FLOAT_CONTROL_MODE = 0x0000, + SHADER_DENORM_PRESERVE_FP16 = 0x0001, + SHADER_DENORM_PRESERVE_FP32 = 0x0002, + SHADER_DENORM_PRESERVE_FP64 = 0x0004, + SHADER_DENORM_FLUSH_TO_ZERO_FP16 = 0x0008, + SHADER_DENORM_FLUSH_TO_ZERO_FP32 = 0x0010, + SHADER_DENORM_FLUSH_TO_ZERO_FP64 = 0x0020, + SHADER_SIGNED_ZERO_INF_NAN_PRESERVE = 0x0040, + SHADER_ROUNDING_MODE_RTE = 0x0080, + SHADER_ROUNDING_MODE_RTZ = 0x0100, +}; + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 21c3d371a63..0383058522e 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -133,6 +133,9 @@ typedef struct shader_info { /** Was this shader linked with any transform feedback varyings? */ bool has_transform_feedback_varyings; + /* SPV_KHR_shader_float_controls: execution mode for floating point ops */ + unsigned shader_float_controls_execution_mode; + union { struct { /* Which inputs are doubles */ diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 100fcd8e298..3f71644ce34 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3758,6 +3758,32 @@ vtn_handle_execution_mode(struct vtn_builder *b, struct vtn_value *entry_point, vtn_assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); break; + case SpvExecutionModeDenormPreserve: + switch (mode->literals[0]) { + case 16: b->shader->info.shader_float_controls_execution_mode |= SHADER_DENORM_PRESERVE_FP16; break; + case 32: b->shader->info.shader_float_controls_execution_mode |= SHADER_DENORM_PRESERVE_FP32; break; + case 64: b->shader->info.shader_float_controls_execution_mode |= SHADER_DENORM_PRESERVE_FP64; break; + default: vtn_fail("Floating point type not supported"); + } + break; + case SpvExecutionModeDenormFlushToZero: + switch (mode->literals[0]) { + case 16: b->shader->info.shader_float_controls_execution_mode |= SHADER_DENORM_FLUSH_TO_ZERO_FP16; break; + case 32: b->shader->info.shader_float_controls_execution_mode |= SHADER_DENORM_FLUSH_TO_ZERO_FP32; break; + case 64: b->shader->info.shader_float_controls_execution_mode |= SHADER_DENORM_FLUSH_TO_ZERO_FP64; break; + default: vtn_fail("Floating point type not supported"); + } + break; + case SpvExecutionModeSignedZeroInfNanPreserve: + b->shader->info.shader_float_controls_execution_mode |= SHADER_SIGNED_ZERO_INF_NAN_PRESERVE; + break; + case SpvExecutionModeRoundingModeRTE: + b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTE; + break; + case SpvExecutionModeRoundingModeRTZ: + b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTZ; + break; + default: vtn_fail("Unhandled execution mode"); } -- 2.19.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev