From 896e6fb868a70cc5f7492af34072ab305364cdb8 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Tue, 31 May 2022 14:23:24 +0200 Subject: [PATCH] vkd3d-shader: Enable native 16-bit path for min16float DXIL. Signed-off-by: Hans-Kristian Arntzen --- include/vkd3d_shader.h | 1 + libs/vkd3d-shader/dxil.c | 24 ++++++++++++++++++++++++ libs/vkd3d/device.c | 6 ++++++ 3 files changed, 31 insertions(+) diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index c5e5724c..eb8d66a8 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -309,6 +309,7 @@ enum vkd3d_shader_target_extension * but not byte address buffer. */ VKD3D_SHADER_TARGET_EXTENSION_ASSUME_PER_COMPONENT_SSBO_ROBUSTNESS, VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR, + VKD3D_SHADER_TARGET_EXTENSION_MIN_PRECISION_IS_NATIVE_16BIT, VKD3D_SHADER_TARGET_EXTENSION_COUNT, }; diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index d0d6cb6b..0a3ed2cd 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -776,6 +776,18 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc, goto end; } } + else if (compiler_args->target_extensions[i] == VKD3D_SHADER_TARGET_EXTENSION_MIN_PRECISION_IS_NATIVE_16BIT) + { + static const dxil_spv_option_min_precision_native_16bit helper = + { { DXIL_SPV_OPTION_MIN_PRECISION_NATIVE_16BIT }, DXIL_SPV_TRUE }; + + if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS) + { + ERR("dxil-spirv does not support MIN_PRECISION_NATIVE_16BIT.\n"); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + goto end; + } + } } if (compiler_args->dual_source_blending) @@ -1262,6 +1274,18 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil, goto end; } } + else if (compiler_args->target_extensions[i] == VKD3D_SHADER_TARGET_EXTENSION_MIN_PRECISION_IS_NATIVE_16BIT) + { + static const dxil_spv_option_min_precision_native_16bit helper = + { { DXIL_SPV_OPTION_MIN_PRECISION_NATIVE_16BIT }, DXIL_SPV_TRUE }; + + if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS) + { + ERR("dxil-spirv does not support MIN_PRECISION_NATIVE_16BIT.\n"); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + goto end; + } + } } } diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index f2d4855f..6e70a806 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -6080,6 +6080,12 @@ static void vkd3d_init_shader_extensions(struct d3d12_device *device) device->vk_info.shader_extensions[device->vk_info.shader_extension_count++] = VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR; } + + if (device->d3d12_caps.options4.Native16BitShaderOpsSupported) + { + device->vk_info.shader_extensions[device->vk_info.shader_extension_count++] = + VKD3D_SHADER_TARGET_EXTENSION_MIN_PRECISION_IS_NATIVE_16BIT; + } } static void vkd3d_compute_shader_interface_key(struct d3d12_device *device)