diff --git a/README.md b/README.md index d171cd9d..972b8181 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ There are some hard requirements on drivers to be able to implement D3D12 in a r - `VK_KHR_create_renderpass2` - `VK_KHR_sampler_mirror_clamp_to_edge` - `VK_EXT_robustness2` +- `VK_KHR_separate_depth_stencil_layouts` Some notable extensions that **should** be supported for optimal or correct behavior. These extensions will likely become mandatory later. diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index b4eae967..99a0d2f8 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -73,6 +73,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] = VK_EXTENSION(KHR_FRAGMENT_SHADING_RATE, KHR_fragment_shading_rate), VK_EXTENSION(KHR_CREATE_RENDERPASS_2, KHR_create_renderpass2), VK_EXTENSION(KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE, KHR_sampler_mirror_clamp_to_edge), + VK_EXTENSION(KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS, KHR_separate_depth_stencil_layouts), /* EXT extensions */ VK_EXTENSION(EXT_CALIBRATED_TIMESTAMPS, EXT_calibrated_timestamps), VK_EXTENSION(EXT_CONDITIONAL_RENDERING, EXT_conditional_rendering), @@ -1159,6 +1160,13 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i vk_prepend_struct(&info->features2, &info->fragment_shading_rate_features); } + if (vulkan_info->KHR_separate_depth_stencil_layouts) + { + info->separate_depth_stencil_layout_features.sType = + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES; + vk_prepend_struct(&info->features2, &info->separate_depth_stencil_layout_features); + } + /* Core in Vulkan 1.1. */ info->shader_draw_parameters_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES; vk_prepend_struct(&info->features2, &info->shader_draw_parameters_features); @@ -1704,6 +1712,12 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device, return E_INVALIDARG; } + if (!physical_device_info->separate_depth_stencil_layout_features.separateDepthStencilLayouts) + { + ERR("separateDepthStencilLayouts is not supported by this implementation. This is required for correct operation.\n"); + return E_INVALIDARG; + } + if (!vulkan_info->KHR_sampler_mirror_clamp_to_edge) { ERR("KHR_sampler_mirror_clamp_to_edge is not supported by this implementation. This is required for correct operation.\n"); diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 26ac0b88..1edb069d 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -119,6 +119,7 @@ struct vkd3d_vulkan_info bool KHR_fragment_shading_rate; bool KHR_create_renderpass2; bool KHR_sampler_mirror_clamp_to_edge; + bool KHR_separate_depth_stencil_layouts; /* EXT device extensions */ bool EXT_calibrated_timestamps; bool EXT_conditional_rendering; @@ -2516,6 +2517,7 @@ struct vkd3d_physical_device_info VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragment_shading_rate_features; VkPhysicalDeviceShaderDrawParametersFeatures shader_draw_parameters_features; VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_size_control_features; + VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR separate_depth_stencil_layout_features; VkPhysicalDeviceFeatures2 features2;