From 14282e0b5db3d7698e14a4bdb449d5da87162f38 Mon Sep 17 00:00:00 2001 From: Halbear Date: Thu, 22 Jan 2026 21:19:21 +0000 Subject: [PATCH] Fences and Semaphores --- .../EngineCore/Main/PrimaryRuntime.java | 2 +- .../GPUSynchronisation/Fence.java | 41 ++++++++++++++++++- .../GPUSynchronisation/Semaphore.java | 27 +++++++++++- .../DisplayToScreen/SceneRender.java | 4 ++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java index 6d09ffe..7a6b345 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java @@ -74,7 +74,7 @@ public class PrimaryRuntime { PrimaryThread.KillThread(); DrawingThread.KillThread(); cleanup(); - Logger.debug("Waiting to close Primary Thread, making sure vulkan has shut down properly first and Engine Threads are closed"); + Logger.debug("Waiting to close Primary Thread, making sure vulkan has shut down properly first and Engine Threads are closed\nThreads Open:[{}]\nVulkan Layers Open:[{}]",ThreadsOpen, VulkanContext.VulkanLayersOpen); while(ThreadsOpen > 0 || VulkanContext.VulkanLayersOpen > 0){ } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Fence.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Fence.java index 7a814da..372e411 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Fence.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Fence.java @@ -1,5 +1,44 @@ package net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.GPUSynchronisation; +import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.vulkan.VkFenceCreateInfo; + +import java.nio.LongBuffer; + +import static net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils.vkCheck; +import static org.lwjgl.vulkan.VK13.vkResetFences; +import static org.lwjgl.vulkan.VK13.vkWaitForFences; +import static org.lwjgl.vulkan.VK13.vkDestroyFence; +import static org.lwjgl.vulkan.VK13.VK_FENCE_CREATE_SIGNALED_BIT; +import static org.lwjgl.vulkan.VK13.vkCreateFence; + public class Fence { - //To Be Completed Later + private final long VulkanFence; + public Fence(VulkanContext vulkanContext, boolean Signaled){ + try(var MemStack = MemoryStack.stackPush()){ + var VulkanFenceCreateInfo = VkFenceCreateInfo.calloc(MemStack) + .sType$Default() + .flags(Signaled ? VK_FENCE_CREATE_SIGNALED_BIT : 0); + LongBuffer LongPointers = MemStack.mallocLong(1); + vkCheck(vkCreateFence(vulkanContext.GetDevice().FetchVulkanDevice(),VulkanFenceCreateInfo, null, LongPointers),"Failed to create Vulkan Fence"); + VulkanFence = LongPointers.get(0); + } + } + + public void cleanup(VulkanContext vulkanContext){ + vkDestroyFence(vulkanContext.GetDevice().FetchVulkanDevice(), VulkanFence, null); + } + + public void FenceWait(VulkanContext vulkanContext){ + vkWaitForFences(vulkanContext.GetDevice().FetchVulkanDevice(), VulkanFence,true,Long.MAX_VALUE); + } + + public long GetVulkanFence(){ + return VulkanFence; + } + + public void Reset(VulkanContext vulkanContext){ + vkResetFences(vulkanContext.GetDevice().FetchVulkanDevice(), VulkanFence); + } } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Semaphore.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Semaphore.java index b0f5cd4..49cbc39 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Semaphore.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/GPUSynchronisation/Semaphore.java @@ -1,5 +1,30 @@ package net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.GPUSynchronisation; +import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.vulkan.VkSemaphoreCreateInfo; + +import java.nio.LongBuffer; + +import static net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils.vkCheck; +import static org.lwjgl.vulkan.VK13.vkCreateSemaphore; +import static org.lwjgl.vulkan.VK13.vkDestroySemaphore; + public class Semaphore { - //To Be Completed Later + private final long VulkanSemaphore; + public Semaphore(VulkanContext vulkanContext){ + try(var MemStack = MemoryStack.stackPush()){ + var SemaphoreCreateInfo = VkSemaphoreCreateInfo.calloc(MemStack).sType$Default(); + LongBuffer LongPointers = MemStack.mallocLong(1); + vkCheck(vkCreateSemaphore(vulkanContext.GetDevice().FetchVulkanDevice(), SemaphoreCreateInfo, null, LongPointers),"Failed to Create Semaphore"); + VulkanSemaphore = LongPointers.get(0); + } + } + + public void cleanup(VulkanContext vulkanContext){ + vkDestroySemaphore(vulkanContext.GetDevice().FetchVulkanDevice(), VulkanSemaphore, null); + } + public long GetSemaphore(){ + return VulkanSemaphore; + } } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java new file mode 100644 index 0000000..05caf71 --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java @@ -0,0 +1,4 @@ +package net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen; + +public class SceneRender { +}