From c557c044330e85e662d9fd2c717dab96854abf67 Mon Sep 17 00:00:00 2001 From: artdeell Date: Thu, 9 Jan 2025 19:25:00 +0300 Subject: [PATCH 1/2] Fix incorrect usage of stack.npointer when binding buffers. --- .../java/net/vulkanmod/render/chunk/buffer/DrawBuffers.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/vulkanmod/render/chunk/buffer/DrawBuffers.java b/src/main/java/net/vulkanmod/render/chunk/buffer/DrawBuffers.java index 16c4b64b6..6e71d4336 100644 --- a/src/main/java/net/vulkanmod/render/chunk/buffer/DrawBuffers.java +++ b/src/main/java/net/vulkanmod/render/chunk/buffer/DrawBuffers.java @@ -365,7 +365,10 @@ private int getMask(Vec3 camera, RenderSection section) { public void bindBuffers(VkCommandBuffer commandBuffer, Pipeline pipeline, TerrainRenderType terrainRenderType, double camX, double camY, double camZ) { try (MemoryStack stack = MemoryStack.stackPush()) { var vertexBuffer = getAreaBuffer(terrainRenderType); - nvkCmdBindVertexBuffers(commandBuffer, 0, 1, stack.npointer(vertexBuffer.getId()), stack.npointer(0)); + // VkBuffer is either a 64-bit unsigned integer or a 64-bit pointer, and + // VkDeviceSize is always an uint64_t. Both are equivalent to a Java "long", + // so use "stack.nlong" here. + nvkCmdBindVertexBuffers(commandBuffer, 0, 1, stack.nlong(vertexBuffer.getId()), stack.nlong(0)); updateChunkAreaOrigin(commandBuffer, pipeline, camX, camY, camZ, stack); } From e7accc65191cdd95a32268e16073c475c75df285 Mon Sep 17 00:00:00 2001 From: artdeell Date: Thu, 9 Jan 2025 19:25:25 +0300 Subject: [PATCH 2/2] Better compositeAlpha handling for swapchains --- .../vulkanmod/vulkan/framebuffer/SwapChain.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java index 9b68ec2d7..ccb623fbe 100644 --- a/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java +++ b/src/main/java/net/vulkanmod/vulkan/framebuffer/SwapChain.java @@ -121,7 +121,19 @@ private void createSwapChain() { } createInfo.preTransform(surfaceProperties.capabilities.currentTransform()); - createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR); + + int supportedCompositeAlpha = surfaceProperties.capabilities.supportedCompositeAlpha(); + if((supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) != 0) { + createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR); + }else if((supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) != 0){ + // PowerVR GE8320 Vulkan drivers don't support the alpha composite opaque bit. + // In that case, use the inherit mode if supported. + createInfo.compositeAlpha(VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR); + } else { + // Not sure how to handle the other cases, to be honest... + throw new RuntimeException("Neither opaque, nor inherited alpha compositing modes are supported."); + } + createInfo.presentMode(presentMode); createInfo.clipped(true);