graphics: preserve unrestricted viewport depth ranges

This commit is contained in:
nmzik
2026-09-04 01:07:15 +02:00
parent 0ce19357f6
commit eccd6f6cac
2 changed files with 13 additions and 9 deletions
+11 -8
View File
@@ -335,7 +335,9 @@ static void SetGraphicsDynamicParams(const CommandBuffer& buffer, vk::CommandBuf
EXIT_IF(colors == nullptr); EXIT_IF(colors == nullptr);
const auto& ctx = buffer.GetRegisters(); const auto& ctx = buffer.GetRegisters();
const auto& vp = ctx.GetScreenViewport(); const auto& vp = ctx.GetScreenViewport();
const auto& viewport_regs = vp.viewports[0];
const auto& clip_control = ctx.GetClipControl();
vk::Extent2D framebuffer_extent {}; vk::Extent2D framebuffer_extent {};
if (color_count > 0 && colors[0].image_id) { if (color_count > 0 && colors[0].image_id) {
framebuffer_extent = colors[0].extent; framebuffer_extent = colors[0].extent;
@@ -349,20 +351,21 @@ static void SetGraphicsDynamicParams(const CommandBuffer& buffer, vk::CommandBuf
const auto final_scissor = calc_final_scissor(vp, ctx.GetScanModeControl(), framebuffer_extent); const auto final_scissor = calc_final_scissor(vp, ctx.GetScanModeControl(), framebuffer_extent);
vk::Viewport viewport {}; vk::Viewport viewport {};
if (ctx.GetClipControl().clip_disable) { if (clip_control.clip_disable) {
const auto& limits = buffer.GetGraphics().GetPhysicalDeviceProperties().limits; const auto& limits = buffer.GetGraphics().GetPhysicalDeviceProperties().limits;
viewport.x = 0.0f; viewport.x = 0.0f;
viewport.y = 0.0f; viewport.y = 0.0f;
viewport.width = static_cast<float>(std::min(limits.maxViewportDimensions[0], 16384u)); viewport.width = static_cast<float>(std::min(limits.maxViewportDimensions[0], 16384u));
viewport.height = static_cast<float>(std::min(limits.maxViewportDimensions[1], 16384u)); viewport.height = static_cast<float>(std::min(limits.maxViewportDimensions[1], 16384u));
} else { } else {
viewport.x = vp.viewports[0].xoffset - vp.viewports[0].xscale; viewport.x = viewport_regs.xoffset - viewport_regs.xscale;
viewport.y = vp.viewports[0].yoffset - vp.viewports[0].yscale; viewport.y = viewport_regs.yoffset - viewport_regs.yscale;
viewport.width = vp.viewports[0].xscale * 2.0f; viewport.width = viewport_regs.xscale * 2.0f;
viewport.height = vp.viewports[0].yscale * 2.0f; viewport.height = viewport_regs.yscale * 2.0f;
} }
viewport.minDepth = vp.viewports[0].zoffset; viewport.minDepth =
viewport.maxDepth = vp.viewports[0].zscale + vp.viewports[0].zoffset; viewport_regs.zoffset - (clip_control.dx_clip_space ? 0.0f : viewport_regs.zscale);
viewport.maxDepth = viewport_regs.zoffset + viewport_regs.zscale;
vk_buffer.setViewport(0, 1, &viewport); vk_buffer.setViewport(0, 1, &viewport);
vk::Rect2D scissor {}; vk::Rect2D scissor {};
@@ -1019,7 +1019,8 @@ void WindowContext::CreateVulkan() {
std::vector<const char*> device_extensions = { std::vector<const char*> device_extensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME, VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME,
VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, "VK_KHR_maintenance1"}; VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
"VK_KHR_maintenance1"};
#if defined(__APPLE__) #if defined(__APPLE__)
// MoltenVK lacks VK_EXT_depth_clip_enable and VK_EXT_color_write_enable; the renderer // MoltenVK lacks VK_EXT_depth_clip_enable and VK_EXT_color_write_enable; the renderer