v2: - Add support for rounding modes for each floating point bit size. Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> --- src/compiler/shader_enums.h | 20 +++++++++++++++ src/compiler/shader_info.h | 3 +++ src/compiler/spirv/spirv_to_nir.c | 41 +++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+)
diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 1dff01484b5..4dbfe715e21 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -768,6 +768,26 @@ 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_FP16 = 0x0040, + SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FP32 = 0x0080, + SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FP64 = 0x0100, + SHADER_ROUNDING_MODE_RTE_FP16 = 0x0200, + SHADER_ROUNDING_MODE_RTE_FP32 = 0x0400, + SHADER_ROUNDING_MODE_RTE_FP64 = 0x0800, + SHADER_ROUNDING_MODE_RTZ_FP16 = 0x1000, + SHADER_ROUNDING_MODE_RTZ_FP32 = 0x2000, + SHADER_ROUNDING_MODE_RTZ_FP64 = 0x4000, +}; + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 45fb00a9cfe..d37dc52be61 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -144,6 +144,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 dea36b839a6..3f23e799431 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3933,6 +3933,47 @@ 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: + switch (mode->literals[0]) { + case 16: b->shader->info.shader_float_controls_execution_mode |= SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FP16; break; + case 32: b->shader->info.shader_float_controls_execution_mode |= SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FP32; break; + case 64: b->shader->info.shader_float_controls_execution_mode |= SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FP64; break; + default: vtn_fail("Floating point type not supported"); + } + break; + case SpvExecutionModeRoundingModeRTE: + switch (mode->literals[0]) { + case 16: b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTE_FP16; break; + case 32: b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTE_FP32; break; + case 64: b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTE_FP64; break; + default: vtn_fail("Floating point type not supported"); + } + break; + case SpvExecutionModeRoundingModeRTZ: + switch (mode->literals[0]) { + case 16: b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTZ_FP16; break; + case 32: b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTZ_FP32; break; + case 64: b->shader->info.shader_float_controls_execution_mode |= SHADER_ROUNDING_MODE_RTZ_FP64; break; + default: vtn_fail("Floating point type not supported"); + } + 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