From 7428616d5ccefa4c8d767f7371c9f6b44905dca3 Mon Sep 17 00:00:00 2001 From: Halbear Date: Tue, 27 Jan 2026 12:17:31 +0000 Subject: [PATCH] IT RENDERS RAHHHHHHHHHH COLOURS CAN BE SHOWN, AAAAND UPDATED LIVE OH YEAHHH THIS IS CAUSE FOR CELEBRATION --- .../Terrain4J/EngineCore/Display/Render.java | 21 +++++++--- .../EngineCore/Threads/RenderThread.java | 4 +- .../Structure/DeviceLayers/CommandBuffer.java | 2 +- .../GPUSynchronisation/Fence.java | 1 - .../Structure/DeviceLayers/Queues/Queue.java | 2 +- .../DisplayToScreen/SceneRender.java | 42 +++++++++++++++++-- .../Structure/DisplayToScreen/SwapChain.java | 8 ++-- terrain4j.properties | 2 +- 8 files changed, 65 insertions(+), 17 deletions(-) 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 4e81bc9..19474e6 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java @@ -1,5 +1,6 @@ package net.halbear.Terrain4J.EngineCore.Display; +import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.CommandBuffer; @@ -15,7 +16,6 @@ import org.lwjgl.vulkan.VkCommandBufferSubmitInfo; import org.lwjgl.vulkan.VkSemaphoreSubmitInfo; import org.tinylog.Logger; -import javax.swing.*; import java.util.Arrays; import static org.lwjgl.vulkan.VK13.VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT; @@ -36,7 +36,7 @@ public class Render { public Render(EngineInstance engineInstance) { RendererContext = new VulkanContext(engineInstance.window()); - + CurrentFrame = 0; GraphicsQueue = new Queue.GraphicsQueue(RendererContext, 0); PresentQueue = new Queue.PresentQueue(RendererContext, 0); CommandPools= new CommandPool[VulkanUtils.MAX_IN_FLIGHT]; @@ -68,19 +68,25 @@ public class Render { public void cleanup() { RendererContext.GetDevice().waitIdle(); + Logger.debug("Waiting Vulkan Context"); sceneRender.cleanup(); + Logger.debug("Dynamic Renderer Cleaned up"); Arrays.asList(RenderCompleteSemaphores).forEach(i->i.cleanup(RendererContext)); + Logger.debug("Render Semaphores cleaned up"); Arrays.asList(PresentCompleteSemaphores).forEach(i->i.cleanup(RendererContext)); + Logger.debug("Present Semaphores cleaned up"); Arrays.asList(Fences).forEach(i->i.cleanup(RendererContext)); + Logger.debug("Fences cleaned up"); for(int i = 0; i < CommandPools.length; i++){ CommandBuffers[i].cleanup(RendererContext, CommandPools[i]); CommandPools[i].cleanup(RendererContext); } + Logger.debug("Command pools cleaned up"); RendererContext.cleanup(); } public void render(EngineInstance engineInstance){ SwapChain swapChain = RendererContext.GetSwapChain(); - WaitForFence(CurrentFrame); + WaitForFence(CurrentFrame); //problem child found var CommandPool = CommandPools[CurrentFrame]; var CommandBuffer = CommandBuffers[CurrentFrame]; RecordingStart(CommandPool, CommandBuffer); @@ -94,7 +100,10 @@ public class Render { swapChain.PresentImage(PresentQueue, RenderCompleteSemaphores[ImageIndex],ImageIndex); CurrentFrame = (CurrentFrame + 1) % VulkanUtils.MAX_IN_FLIGHT; } - + private void ResetFence(int currentFrame){ + var fence = Fences[currentFrame]; + fence.Reset(RendererContext); + } private void WaitForFence(int currentFrame){ var fence = Fences[currentFrame]; fence.FenceWait(RendererContext); @@ -114,8 +123,8 @@ public class Render { 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); + .semaphore(RenderCompleteSemaphores[ImageIndex].GetSemaphore()); + GraphicsQueue.Submit(Commands, SemaphoreWait, SemaphoreSignals, fence); } } } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/RenderThread.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/RenderThread.java index 399a277..2f5c377 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/RenderThread.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/RenderThread.java @@ -39,6 +39,7 @@ public class RenderThread implements Runnable { } @Override public void run() { + int TotalFrames = 0; PrimaryRuntime.ThreadsOpen++; long InitialTime = System.nanoTime(); double FrameDiff =0; @@ -55,11 +56,12 @@ public class RenderThread implements Runnable { Frames++; if (SecondCounter >= 1000000000L){ SecondCounter = 0; - EngineConfig.FrameRate_RENDERTHREAD = Frames; + //EngineConfig.FrameRate_RENDERTHREAD = Frames; Logger.info("Render FPS: " + Frames); Frames = 0; } render.render(PrimaryRuntime.GetEngineInstance()); + TotalFrames++; FrameDiff = 0; } InitialTime = now; diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/CommandBuffer.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/CommandBuffer.java index 9ece880..ca80eb1 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/CommandBuffer.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/CommandBuffer.java @@ -74,7 +74,7 @@ public class CommandBuffer { var Commands = VkCommandBufferSubmitInfo.calloc(1, MemStack) .sType$Default() .commandBuffer(VulkanCommandBuffer); - queue.Sumbit(Commands, null, null, fence); + queue.Submit(Commands, null, null, fence); } fence.FenceWait(vulkanContext); fence.cleanup(vulkanContext); 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 51b2259..4d70a94 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 @@ -28,7 +28,6 @@ public class Fence { } public void cleanup(VulkanContext vulkanContext){ - Logger.debug("Destroying Vulkan Fence"); vkDestroyFence(vulkanContext.GetDevice().FetchVulkanDevice(), VulkanFence, null); } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/Queues/Queue.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/Queues/Queue.java index d50f56d..c5ee38d 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/Queues/Queue.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DeviceLayers/Queues/Queue.java @@ -38,7 +38,7 @@ public class Queue { vkQueueWaitIdle(VulkanQueue); } - public void Sumbit(VkCommandBufferSubmitInfo.Buffer CommandBuffers, VkSemaphoreSubmitInfo.Buffer WaitSemaphores, VkSemaphoreSubmitInfo.Buffer SignalSemaphores, Fence fence){ + public void Submit(VkCommandBufferSubmitInfo.Buffer CommandBuffers, VkSemaphoreSubmitInfo.Buffer WaitSemaphores, VkSemaphoreSubmitInfo.Buffer SignalSemaphores, Fence fence){ try(var MemStack = MemoryStack.stackPush()){ var SubmitInfo = VkSubmitInfo2.calloc(1, MemStack) .sType$Default() 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 index a3cefb1..b0351e9 100644 --- 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 @@ -1,11 +1,13 @@ package net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen; import net.halbear.Terrain4J.EngineCore.Display.Render; +import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.CommandBuffer; import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils; import org.lwjgl.system.MemoryStack; import org.lwjgl.vulkan.*; +import org.tinylog.Logger; import java.util.Arrays; @@ -16,16 +18,50 @@ import static org.lwjgl.vulkan.VK10.*; import static org.lwjgl.vulkan.VK13.*; public class SceneRender { //dynamic rendering; - private final VkClearValue ClearValueColour; + private VkClearValue ClearValueColour; private VkRenderingAttachmentInfo.Buffer[] AttachmentInfoColour; private VkRenderingInfo[] RenderInfo; + private float R = 0f; + private float G = 0.5f; + private float B = 0.7f; + private boolean Rb = false; + private boolean Gb = true; + private boolean Bb = false; public SceneRender(VulkanContext vulkanContext){ - ClearValueColour = VkClearValue.calloc().color(c->c.float32(0,0.5f).float32(1,0.7f).float32(2,0.9f).float32(3,1.0f)); + ClearValueColour = VkClearValue.calloc().color(c->c.float32(0,R).float32(1,G).float32(2,B).float32(3,1.0f)); + AttachmentInfoColour = CreateColourAttachmentsInfo(vulkanContext,ClearValueColour); + RenderInfo = CreateRenderInfo(vulkanContext, AttachmentInfoColour); + } + + public void UpdateColours(VulkanContext vulkanContext){ + if (Gb){ + if (G < 1.0f && Math.random() <0.5) G+=0.0005f; + else if (G >= 1.0f) Gb = false; + } else{ + if (G >0.0f&& Math.random() <0.5) G-=0.0005f; + else if (G <= 0.0f) Gb = true; + } + if (Rb){ + if (R < 1.0f&& Math.random() <0.3) R+=0.0005f; + else if (R >= 1.0f) Rb = false; + } else{ + if (R >0.0f&& Math.random() <0.3) R-=0.0005f; + else if (R <= 0.0f) Rb = true; + } + if (Bb){ + if (B < 1.0f&& Math.random() <0.7) B+=0.0005f; + else if (B >= 1.0f) Bb = false; + } else{ + if (B >0.0f&& Math.random() <0.7) B-=0.0005f; + else if (B <= 0.0f) Bb = true; + } + ClearValueColour = VkClearValue.calloc().color(c->c.float32(0,R).float32(1,G).float32(2,B).float32(3,1.0f)); AttachmentInfoColour = CreateColourAttachmentsInfo(vulkanContext,ClearValueColour); RenderInfo = CreateRenderInfo(vulkanContext, AttachmentInfoColour); } public void Render(VulkanContext vulkanContext, CommandBuffer commandBuffer, int ImageIndex){ + EngineConfig.FrameRate_RENDERTHREAD++; try(var MemStack = MemoryStack.stackPush()){ SwapChain swapChain = vulkanContext.GetSwapChain(); long SwapChainImage = swapChain.GetVulkanImageView(ImageIndex).GetVulkanImage(); @@ -34,7 +70,7 @@ public class SceneRender { //dynamic rendering; VulkanUtils.ImageBarrier(MemStack, CommandHandle, SwapChainImage, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_ACCESS_2_NONE,VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,VK_IMAGE_ASPECT_COLOR_BIT); + VK_ACCESS_2_NONE, VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_ASPECT_COLOR_BIT); vkCmdBeginRendering(CommandHandle, RenderInfo[ImageIndex]); vkCmdEndRendering(CommandHandle); diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SwapChain.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SwapChain.java index 288a8fb..791be2f 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SwapChain.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SwapChain.java @@ -66,7 +66,6 @@ public class SwapChain { return Math.min(RequestedImages, MaxImages); } ReturnValue = Math.max(ReturnValue, MinImages); - Logger.debug("Requested Image Count: [{}]\nReceived [{}] Images\nSurfaceCapabilities-> MaxImgs:[{}] MinImgs:[{}] ",RequestedImages,ReturnValue,MaxImages,MinImages); return ReturnValue; } public static VkExtent2D CalculateSwapChainExtent(Window window, VkSurfaceCapabilitiesKHR SurfaceCapabilities){ @@ -109,7 +108,7 @@ public class SwapChain { return -1; } else if (Error == KHRSwapchain.VK_SUBOPTIMAL_KHR){ - Logger.warn("Suboptimal surface properties match, not fatal"); + //Logger.warn("Suboptimal surface properties match, not fatal"); } else if (Error != VK_SUCCESS){ throw new RuntimeException("Failed to fetch next image in the swapchain: " + Error); } @@ -129,9 +128,12 @@ public class SwapChain { int Error = KHRSwapchain.vkQueuePresentKHR(queue.GetVulkanQueue(), Present); if (Error == KHRSwapchain.VK_ERROR_OUT_OF_DATE_KHR){ resize = true; + //Logger.debug("Detected Resize"); + //vkQueueWaitIdle(queue.GetVulkanQueue()); } else if (Error == KHRSwapchain.VK_SUBOPTIMAL_KHR){ - Logger.warn("Suboptimal surface properties match, not fatal"); + //Logger.warn("Suboptimal surface properties match, not fatal"); } else if (Error != VK_SUCCESS){ + Logger.debug("Failure in Present Image"); throw new RuntimeException("failed to present KHR: " + Error); } } diff --git a/terrain4j.properties b/terrain4j.properties index 3928f01..778e029 100644 --- a/terrain4j.properties +++ b/terrain4j.properties @@ -11,7 +11,7 @@ cap_main_to_tickrate=false #Vulkan Debugging toggle vkValidated=true -vsync=true +vsync=false RequestedImages=3 #This is the name of the GPU you want the engine to use PhysicalDeviceName=