graphics: clamp raster depth after polygon offset

Enable native Vulkan depth clamping independently of guest depth clipping
This commit is contained in:
nmzik
2026-09-24 13:31:34 +04:00
parent db7745ef41
commit 2aaf0c9ba3
2 changed files with 7 additions and 0 deletions
@@ -368,6 +368,8 @@ void CreatePipelineInternal(GraphicContext& graphics, PipelineCache::Pipeline& p
// MoltenVK lacks VK_EXT_depth_clip_enable; omit the depth-clip struct on macOS and accept // MoltenVK lacks VK_EXT_depth_clip_enable; omit the depth-clip struct on macOS and accept
// Vulkan's default depth clipping (enabled) instead of the PS5's clamp behavior. // Vulkan's default depth clipping (enabled) instead of the PS5's clamp behavior.
#if !defined(__APPLE__) #if !defined(__APPLE__)
// The DB clamps depth to the viewport range after polygon offset is applied.
rasterizer.depthClampEnable = VK_TRUE;
rasterizer.pNext = &clip_ext; rasterizer.pNext = &clip_ext;
#endif #endif
vk::PipelineRasterizationProvokingVertexStateCreateInfoEXT provoking_vertex {}; vk::PipelineRasterizationProvokingVertexStateCreateInfoEXT provoking_vertex {};
@@ -238,6 +238,10 @@ static void VulkanFindPhysicalDevice(vk::Instance instance, vk::SurfaceKHR surfa
#endif #endif
} }
#if !defined(__APPLE__) #if !defined(__APPLE__)
if (device_features2.features.depthClamp != VK_TRUE) {
LOGF("depthClamp is not supported\n");
skip_device = true;
}
if (fragment_barycentric.fragmentShaderBarycentric != VK_TRUE) { if (fragment_barycentric.fragmentShaderBarycentric != VK_TRUE) {
LOGF("fragmentShaderBarycentric is not supported\n"); LOGF("fragmentShaderBarycentric is not supported\n");
skip_device = true; skip_device = true;
@@ -607,6 +611,7 @@ static vk::Device VulkanCreateDevice(GraphicContext& graphics,
device_features.robustBufferAccess = VK_TRUE; device_features.robustBufferAccess = VK_TRUE;
#if !defined(__APPLE__) #if !defined(__APPLE__)
device_features.depthBounds = VK_TRUE; // unsupported by MoltenVK device_features.depthBounds = VK_TRUE; // unsupported by MoltenVK
device_features.depthClamp = VK_TRUE;
#endif #endif
device_features.shaderStorageImageWriteWithoutFormat = VK_TRUE; device_features.shaderStorageImageWriteWithoutFormat = VK_TRUE;
device_features.shaderImageGatherExtended = VK_TRUE; device_features.shaderImageGatherExtended = VK_TRUE;