From 504e7d0c4b0597b2222c9953101f5e40943409d4 Mon Sep 17 00:00:00 2001 From: Halbear Date: Fri, 23 Jan 2026 14:52:40 +0000 Subject: [PATCH] Renderer class progress --- .../Terrain4J/EngineCore/Display/Render.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java index b9967de..209c8d3 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java @@ -8,7 +8,17 @@ import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.GPUSynchro import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.GPUSynchronisation.Semaphore; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.Queues.Queue; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.SceneRender; +import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.SwapChain; import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.vulkan.VkCommandBufferSubmitInfo; +import org.lwjgl.vulkan.VkSemaphoreSubmitInfo; + +import javax.swing.*; +import java.util.Arrays; + +import static org.lwjgl.vulkan.VK13.VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT; +import static org.lwjgl.vulkan.VK13.VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT; public class Render { @@ -45,10 +55,66 @@ public class Render { } sceneRender = new SceneRender(); } + + private void RecordingStart(CommandPool commandPool, CommandBuffer commandBuffer){ + commandPool.Reset(RendererContext); + commandBuffer.BeginRecording(); + } + + private void RecordingStop(CommandBuffer commandBuffer){ + commandBuffer.EndRecording(); + } + public void cleanup() { + RendererContext.WaitIdle(); + sceneRender.cleanup(); + Arrays.asList(RenderCompleteSemaphores).forEach(i->i.cleanup(RendererContext)); + Arrays.asList(PresentCompleteSemaphores).forEach(i->i.cleanup(RendererContext)); + Arrays.asList(Fences).forEach(i->i.cleanup(RendererContext)); + for(int i = 0; i < CommandPools.length; i++){ + CommandBuffers[i].cleanup(RendererContext, CommandPools[i]); + CommandPools[i].cleanup(RendererContext); + } RendererContext.cleanup(); } public void render(EngineInstance engineInstance){ + SwapChain swapChain = RendererContext.GetSwapChain(); + WaitForFence(CurrentFrame); + var CommandPool = CommandPools[CurrentFrame]; + var CommandBuffer = CommandBuffers[CurrentFrame]; + RecordingStart(CommandPool, CommandBuffer); + int ImageIndex = swapChain.FetchNextImage(RendererContext.GetDevice(), PresentCompleteSemaphores[CurrentFrame]); + if (ImageIndex < 0){ + return; + } + sceneRender.render(RendererContext,CommandBuffer,ImageIndex); + RecordingStop(CommandBuffer); + Submit(CommandBuffer, CurrentFrame, ImageIndex); + swapChain.PresentImage(PresentQueue, RenderCompleteSemaphores[ImageIndex],ImageIndex); + CurrentFrame = (CurrentFrame + 1) % VulkanUtils.MAX_IN_FLIGHT; + } + private void WaitForFence(int currentFrame){ + var fence = Fences[currentFrame]; + fence.FenceWait(RendererContext); + } + + public void Submit(CommandBuffer commandBuffer, int currentFrame, int ImageIndex){ + try(var MemStack = MemoryStack.stackPush()){ + var fence = Fences[currentFrame]; + fence.Reset(RendererContext); + var Commands = VkCommandBufferSubmitInfo.calloc(1,MemStack) + .sType$Default() + .commandBuffer(commandBuffer.GetVulkanCommandBuffer()); + VkSemaphoreSubmitInfo.Buffer SemaphoreWait = VkSemaphoreSubmitInfo.calloc(1,MemStack) + .sType$Default() + .stageMask(VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT) + .semaphore(PresentCompleteSemaphores[currentFrame].GetSemaphore()); + VkSemaphoreSubmitInfo.Buffer SemaphoreSignals = VkSemaphoreSubmitInfo.calloc(1, MemStack) + .sType$Default() + .stageMask(VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT) + .semaphore(RenderCompleteSemaphores[currentFrame].GetSemaphore()); + GraphicsQueue.Sumbit(Commands, SemaphoreWait, SemaphoreSignals, fence); + } } }