From 5eeca3c69d896a3ead028236e34f865f0ee5210f Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 25 May 2022 13:07:56 +0200 Subject: [PATCH] vkd3d: Enable and use VK_KHR_fragment_shader_barycentric. For now, just keep the NV path as well. It's the exact same extension basically as the KHR one. Signed-off-by: Hans-Kristian Arntzen --- include/vkd3d_shader.h | 2 ++ libs/vkd3d-shader/dxil.c | 12 ++++++++++++ libs/vkd3d/device.c | 20 ++++++++++++++++++-- libs/vkd3d/vkd3d_private.h | 5 +++-- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h index ad00508f..c5e5724c 100644 --- a/include/vkd3d_shader.h +++ b/include/vkd3d_shader.h @@ -308,6 +308,8 @@ enum vkd3d_shader_target_extension * all in range, or all out of range. We can implement structured buffer vectorization of vec3, * but not byte address buffer. */ VKD3D_SHADER_TARGET_EXTENSION_ASSUME_PER_COMPONENT_SSBO_ROBUSTNESS, + VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR, + VKD3D_SHADER_TARGET_EXTENSION_COUNT, }; enum vkd3d_shader_quirk diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 552fa3c1..d0d6cb6b 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -764,6 +764,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_BARYCENTRIC_KHR) + { + static const dxil_spv_option_barycentric_khr helper = + { { DXIL_SPV_OPTION_BARYCENTRIC_KHR }, DXIL_SPV_TRUE }; + + if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS) + { + ERR("dxil-spirv does not support BARYCENTRIC_KHR.\n"); + ret = VKD3D_ERROR_NOT_IMPLEMENTED; + goto end; + } + } } if (compiler_args->dual_source_blending) diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 4f64f600..c8146701 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -87,6 +87,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] = VK_EXTENSION(KHR_DRIVER_PROPERTIES, KHR_driver_properties), VK_EXTENSION(KHR_UNIFORM_BUFFER_STANDARD_LAYOUT, KHR_uniform_buffer_standard_layout), VK_EXTENSION(KHR_MAINTENANCE_4, KHR_maintenance4), + VK_EXTENSION(KHR_FRAGMENT_SHADER_BARYCENTRIC, KHR_fragment_shader_barycentric), /* EXT extensions */ VK_EXTENSION(EXT_CALIBRATED_TIMESTAMPS, EXT_calibrated_timestamps), VK_EXTENSION(EXT_CONDITIONAL_RENDERING, EXT_conditional_rendering), @@ -1392,13 +1393,20 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i vk_prepend_struct(&info->properties2, &info->shader_integer_dot_product_properties); } - if (vulkan_info->NV_fragment_shader_barycentric) + if (vulkan_info->NV_fragment_shader_barycentric && !vulkan_info->KHR_fragment_shader_barycentric) { info->barycentric_features_nv.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV; vk_prepend_struct(&info->features2, &info->barycentric_features_nv); } + if (vulkan_info->KHR_fragment_shader_barycentric) + { + info->barycentric_features_khr.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR; + vk_prepend_struct(&info->features2, &info->barycentric_features_khr); + } + if (vulkan_info->NV_compute_shader_derivatives) { info->compute_shader_derivatives_features_nv.sType = @@ -5664,7 +5672,9 @@ static void d3d12_device_caps_init_feature_options3(struct d3d12_device *device) D3D12_COMMAND_LIST_SUPPORT_FLAG_BUNDLE; /* Currently not supported */ options3->ViewInstancingTier = D3D12_VIEW_INSTANCING_TIER_NOT_SUPPORTED; - options3->BarycentricsSupported = device->device_info.barycentric_features_nv.fragmentShaderBarycentric; + options3->BarycentricsSupported = + device->device_info.barycentric_features_nv.fragmentShaderBarycentric || + device->device_info.barycentric_features_khr.fragmentShaderBarycentric; } static void d3d12_device_caps_init_feature_options4(struct d3d12_device *device) @@ -6068,6 +6078,12 @@ static void vkd3d_init_shader_extensions(struct d3d12_device *device) VKD3D_SHADER_TARGET_EXTENSION_ASSUME_PER_COMPONENT_SSBO_ROBUSTNESS; } } + + if (device->device_info.barycentric_features_khr.fragmentShaderBarycentric) + { + device->vk_info.shader_extensions[device->vk_info.shader_extension_count++] = + VKD3D_SHADER_TARGET_EXTENSION_BARYCENTRIC_KHR; + } } static void vkd3d_compute_shader_interface_key(struct d3d12_device *device) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 23936620..fa61a543 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -50,7 +50,6 @@ #define MAKE_MAGIC(a,b,c,d) (((uint32_t)a) | (((uint32_t)b) << 8) | (((uint32_t)c) << 16) | (((uint32_t)d) << 24)) #define VKD3D_MAX_COMPATIBLE_FORMAT_COUNT 10u -#define VKD3D_MAX_SHADER_EXTENSIONS 6u #define VKD3D_MAX_SHADER_STAGES 5u #define VKD3D_MAX_VK_SYNC_OBJECTS 4u @@ -134,6 +133,7 @@ struct vkd3d_vulkan_info bool KHR_uniform_buffer_standard_layout; bool KHR_maintenance4; bool KHR_ray_tracing_maintenance1; + bool KHR_fragment_shader_barycentric; /* EXT device extensions */ bool EXT_calibrated_timestamps; bool EXT_conditional_rendering; @@ -187,7 +187,7 @@ struct vkd3d_vulkan_info VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT texel_buffer_alignment_properties; unsigned int shader_extension_count; - enum vkd3d_shader_target_extension shader_extensions[VKD3D_MAX_SHADER_EXTENSIONS]; + enum vkd3d_shader_target_extension shader_extensions[VKD3D_SHADER_TARGET_EXTENSION_COUNT]; }; struct vkd3d_instance @@ -3065,6 +3065,7 @@ struct vkd3d_physical_device_info VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR separate_depth_stencil_layout_features; VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR shader_integer_dot_product_features; VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV barycentric_features_nv; + VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR barycentric_features_khr; VkPhysicalDeviceRayQueryFeaturesKHR ray_query_features; VkPhysicalDeviceComputeShaderDerivativesFeaturesNV compute_shader_derivatives_features_nv; VkPhysicalDeviceShaderAtomicInt64FeaturesKHR shader_atomic_int64_features;