-- v2: vkd3d-shader/spirv: Check for FEATURE_FLOAT64 when double precision use is flagged.
From: Conor McCarthy cmccarthy@codeweavers.com
--- include/vkd3d_shader.h | 1 + libs/vkd3d/state.c | 2 ++ 2 files changed, 3 insertions(+)
diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index 449b3684a..a8cc3a336 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -200,6 +200,7 @@ enum vkd3d_shader_compile_option_fragment_coordinate_origin enum vkd3d_shader_compile_option_feature_flags { VKD3D_SHADER_COMPILE_OPTION_FEATURE_INT64 = 0x00000001, + VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLOAT64 = 0x00000002,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLAGS), }; diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 82782e7d5..12a8cd549 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -2154,6 +2154,8 @@ static unsigned int feature_flags_compile_option(const struct d3d12_device *devi
if (device->feature_options1.Int64ShaderOps) flags |= VKD3D_SHADER_COMPILE_OPTION_FEATURE_INT64; + if (device->feature_options.DoublePrecisionFloatShaderOps) + flags |= VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLOAT64;
return flags; }
From: Conor McCarthy cmccarthy@codeweavers.com
--- libs/vkd3d-shader/spirv.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index e837fc2ef..2c1a04b49 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -2349,6 +2349,7 @@ struct spirv_compiler size_t spec_constants_size; enum vkd3d_shader_compile_option_formatting_flags formatting; enum vkd3d_shader_compile_option_feature_flags features; + enum vkd3d_shader_api_version api_version; bool write_tess_geom_point_size;
struct vkd3d_string_buffer_cache string_buffers; @@ -2493,6 +2494,7 @@ static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_ve break;
case VKD3D_SHADER_COMPILE_OPTION_API_VERSION: + compiler->api_version = option->value; break;
case VKD3D_SHADER_COMPILE_OPTION_TYPED_UAV: @@ -2527,6 +2529,10 @@ static struct spirv_compiler *spirv_compiler_create(const struct vkd3d_shader_ve } }
+ /* Explicit enabling of float64 was not required for API versions <= 1.10. */ + if (compiler->api_version <= VKD3D_SHADER_API_VERSION_1_10) + compiler->features |= VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLOAT64; + rb_init(&compiler->symbol_table, vkd3d_symbol_compare);
compiler->shader_type = shader_version->type; @@ -5581,7 +5587,16 @@ static void spirv_compiler_emit_dcl_global_flags(struct spirv_compiler *compiler
if (flags & (VKD3DSGF_ENABLE_DOUBLE_PRECISION_FLOAT_OPS | VKD3DSGF_ENABLE_11_1_DOUBLE_EXTENSIONS)) { - vkd3d_spirv_enable_capability(&compiler->spirv_builder, SpvCapabilityFloat64); + if (compiler->features & VKD3D_SHADER_COMPILE_OPTION_FEATURE_FLOAT64) + { + vkd3d_spirv_enable_capability(&compiler->spirv_builder, SpvCapabilityFloat64); + } + else + { + WARN("Unsupported 64-bit float ops.\n"); + spirv_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_UNSUPPORTED_FEATURE, + "The target environment does not support 64-bit floating point."); + } flags &= ~(VKD3DSGF_ENABLE_DOUBLE_PRECISION_FLOAT_OPS | VKD3DSGF_ENABLE_11_1_DOUBLE_EXTENSIONS); }
This merge request was approved by Henri Verbeet.