From 6599a58b8d41a48287e2b7f28530f607e4e02457 Mon Sep 17 00:00:00 2001 From: Vcmp <125277899+thr3343@users.noreply.github.com> Date: Mon, 25 Sep 2023 23:19:36 +0100 Subject: [PATCH] Fix VSync being forced enabled incorrectly (if driver lacks support for Mailbox Mode) --- .../java/net/vulkanmod/config/Config.java | 2 +- .../vulkan/framebuffer/SwapChain.java | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/vulkanmod/config/Config.java b/src/main/java/net/vulkanmod/config/Config.java index 0e4098b14e..1b12766ea1 100644 --- a/src/main/java/net/vulkanmod/config/Config.java +++ b/src/main/java/net/vulkanmod/config/Config.java @@ -14,6 +14,7 @@ public class Config { public int frameQueueSize = 2; public VideoResolution resolution = VideoResolution.getFirstAvailable(); + public boolean useImmediate = !VideoResolution.isWayLand(); //Necessary until tearing-control-unstable-v1 is fully implemented on all GPU Drivers for Wayland public boolean windowedFullscreen = false; public boolean guiOptimizations = false; public int advCulling = 2; @@ -27,7 +28,6 @@ public class Config { .setPrettyPrinting() .excludeFieldsWithModifiers(Modifier.PRIVATE) .create(); - public boolean useImmediate = !VideoResolution.isWayLand(); public static Config load(Path path) { Config config; diff --git a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java index 5ce40d25c3..cf0f97388b 100644 --- a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java +++ b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java @@ -18,7 +18,6 @@ import java.util.Arrays; import java.util.List; -import static net.vulkanmod.Initializer.LOGGER; import static net.vulkanmod.vulkan.Vulkan.*; import static net.vulkanmod.vulkan.util.VUtil.UINT32_MAX; import static org.lwjgl.glfw.GLFW.glfwGetFramebufferSize; @@ -31,13 +30,14 @@ public class SwapChain extends Framebuffer { private static int DEFAULT_DEPTH_FORMAT = 0; + //Drivers are not guaranteed to support Mailbox Mode + private static final int defNoTearMode = checkDisplayMode(VK_PRESENT_MODE_MAILBOX_KHR) ? VK_PRESENT_MODE_MAILBOX_KHR : VK_PRESENT_MODE_IMMEDIATE_KHR; + public static int getDefaultDepthFormat() { return DEFAULT_DEPTH_FORMAT; } private RenderPass renderPass; - //Necessary until tearing-control-unstable-v1 is fully implemented on all GPU Drivers for Wayland - private static final int defUncappedMode = VideoResolution.isWayLand() ? VK_PRESENT_MODE_MAILBOX_KHR : VK_PRESENT_MODE_IMMEDIATE_KHR; private long[] framebuffers; private long swapChain = VK_NULL_HANDLE; private List swapChainImages; @@ -53,10 +53,25 @@ public SwapChain() { this.attachmentCount = 2; this.depthFormat = DEFAULT_DEPTH_FORMAT; + createSwapChain(); } + private static boolean checkDisplayMode(int requestedMode) { + try(MemoryStack stack = MemoryStack.stackPush()) { + IntBuffer availablePresentModes = Device.querySurfaceProperties(getDevice().getPhysicalDevice(), stack).presentModes; + + for (int i = 0; i < availablePresentModes.capacity(); i++) { + if (availablePresentModes.get(i) == requestedMode) { + return true; + } + } + return false; + } + + } + public int recreateSwapChain() { Synchronization.INSTANCE.waitFences(); @@ -357,11 +372,12 @@ private VkSurfaceFormatKHR getFormat(VkSurfaceFormatKHR.Buffer availableFormats) private int getPresentMode(IntBuffer availablePresentModes) { - int requestedMode = Initializer.CONFIG.useImmediate ? VK_PRESENT_MODE_IMMEDIATE_KHR : VK_PRESENT_MODE_MAILBOX_KHR; + int requestedMode = vsync ? VK_PRESENT_MODE_FIFO_KHR + : Initializer.CONFIG.useImmediate ? VK_PRESENT_MODE_IMMEDIATE_KHR : defNoTearMode; //fifo mode is the only mode that has to be supported if (vsync) { - return VK_PRESENT_MODE_FIFO_KHR; + return requestedMode; } //Available Display modes in fullscreen and windowed can vary, so we can't optimise out this loop