Skip to content

Commit f409c8b

Browse files
committed
Enable VK_EXT_swapchain_colorspace and fix Display P3 color space for macOS
1 parent 3f293ed commit f409c8b

File tree

3 files changed

+34
-10
lines changed

3 files changed

+34
-10
lines changed

src/main/java/net/vulkanmod/mixin/window/WindowMixin.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ private void redirect(int hint, int value) { }
6161
private void vulkanHint(WindowEventHandler windowEventHandler, ScreenManager screenManager, DisplayData displayData, String string, String string2, CallbackInfo ci) {
6262
GLFW.glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
6363

64+
// Enable 32bit P3 wide color gamut on macOS
65+
if (Platform.isMacOS()) {
66+
GLFW.glfwWindowHint(GLFW_COCOA_RETINA_FRAMEBUFFER, GLFW_TRUE);
67+
GLFW.glfwWindowHint(GLFW_RED_BITS, 10);
68+
GLFW.glfwWindowHint(GLFW_GREEN_BITS, 10);
69+
GLFW.glfwWindowHint(GLFW_BLUE_BITS, 10);
70+
GLFW.glfwWindowHint(GLFW_ALPHA_BITS, 2);
71+
}
72+
6473
//Fix Gnome Client-Side Decorators
6574
boolean b = (Platform.isGnome() | Platform.isWeston() | Platform.isGeneric()) && Platform.isWayLand();
6675
GLFW.glfwWindowHint(GLFW_DECORATED, (b ? GLFW_FALSE : GLFW_TRUE));

src/main/java/net/vulkanmod/vulkan/Vulkan.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import net.vulkanmod.vulkan.util.VkResult;
1414
import org.lwjgl.PointerBuffer;
1515
import org.lwjgl.system.MemoryStack;
16+
import static org.lwjgl.vulkan.EXTSwapchainColorspace.VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME;
1617
import org.lwjgl.util.vma.VmaAllocatorCreateInfo;
1718
import org.lwjgl.util.vma.VmaVulkanFunctions;
1819
import org.lwjgl.vulkan.*;
@@ -361,23 +362,21 @@ private static void createCommandPool() {
361362
}
362363

363364
private static PointerBuffer getRequiredInstanceExtensions() {
364-
365365
PointerBuffer glfwExtensions = glfwGetRequiredInstanceExtensions();
366+
MemoryStack stack = stackGet();
366367

367368
if (ENABLE_VALIDATION_LAYERS) {
368-
369-
MemoryStack stack = stackGet();
370-
371-
PointerBuffer extensions = stack.mallocPointer(glfwExtensions.capacity() + 1);
372-
369+
PointerBuffer extensions = stack.mallocPointer(glfwExtensions.capacity() + 2);
373370
extensions.put(glfwExtensions);
374371
extensions.put(stack.UTF8(VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
375-
376-
// Rewind the buffer before returning it to reset its position back to 0
372+
extensions.put(stack.UTF8(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME));
377373
return extensions.rewind();
378374
}
379375

380-
return glfwExtensions;
376+
PointerBuffer extensions = stack.mallocPointer(glfwExtensions.capacity() + 1);
377+
extensions.put(glfwExtensions);
378+
extensions.put(stack.UTF8(VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME));
379+
return extensions.rewind();
381380
}
382381

383382
public static void checkResult(int result, String errorMessage) {

src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.vulkanmod.vulkan.queue.Queue;
1010
import net.vulkanmod.vulkan.texture.SamplerManager;
1111
import net.vulkanmod.vulkan.texture.VulkanImage;
12+
import net.vulkanmod.config.Platform;
1213
import org.lwjgl.system.MemoryStack;
1314
import org.lwjgl.vulkan.*;
1415

@@ -24,6 +25,7 @@
2425
import static org.lwjgl.glfw.GLFW.glfwGetFramebufferSize;
2526
import static org.lwjgl.system.MemoryStack.stackGet;
2627
import static org.lwjgl.system.MemoryStack.stackPush;
28+
import static org.lwjgl.vulkan.EXTSwapchainColorspace.*;
2729
import static org.lwjgl.vulkan.KHRSurface.*;
2830
import static org.lwjgl.vulkan.KHRSwapchain.*;
2931
import static org.lwjgl.vulkan.VK10.*;
@@ -243,19 +245,33 @@ public long getImageView(int i) {
243245
private VkSurfaceFormatKHR getFormat(VkSurfaceFormatKHR.Buffer availableFormats) {
244246
List<VkSurfaceFormatKHR> list = availableFormats.stream().toList();
245247

246-
VkSurfaceFormatKHR format = list.get(0);
248+
// Extended sRGB (P3 gamut with sRGB gamma) on macOS
249+
if (Platform.isMacOS()) {
250+
for (VkSurfaceFormatKHR f : list) {
251+
if (f.format() == VK_FORMAT_B8G8R8A8_UNORM && f.colorSpace() == VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT) {
252+
isBGRAformat = true;
253+
return f;
254+
}
255+
}
256+
}
247257

258+
// If fail try RGBA format with standard sRGB
248259
for (VkSurfaceFormatKHR availableFormat : list) {
249260
if (availableFormat.format() == VK_FORMAT_R8G8B8A8_UNORM && availableFormat.colorSpace() == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
250261
return availableFormat;
262+
}
251263

264+
// Standard BGRA sRGB
265+
VkSurfaceFormatKHR format = list.get(0);
266+
for (VkSurfaceFormatKHR availableFormat : list) {
252267
if (availableFormat.format() == VK_FORMAT_B8G8R8A8_UNORM && availableFormat.colorSpace() == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {
253268
format = availableFormat;
254269
}
255270
}
256271

257272
if (format.format() == VK_FORMAT_B8G8R8A8_UNORM)
258273
isBGRAformat = true;
274+
259275
return format;
260276
}
261277

0 commit comments

Comments
 (0)