Renderer class progress

This commit is contained in:
Harrison Corlett 2026-01-23 14:52:40 +00:00
parent ff35846afa
commit 504e7d0c4b

View file

@ -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.GPUSynchronisation.Semaphore;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.Queues.Queue; 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.SceneRender;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.SwapChain;
import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils; 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 { public class Render {
@ -45,10 +55,66 @@ public class Render {
} }
sceneRender = new SceneRender(); 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() { 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(); RendererContext.cleanup();
} }
public void render(EngineInstance engineInstance){ 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);
}
} }
} }