From b41e64db4a4e5a84c413e8badffe861222a098b8 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Fri, 19 Jun 2026 09:04:03 +0300 Subject: [PATCH] fix: CaptureFrame no longer overwrites CapturedFrame with null MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: CaptureFrame returned null and was assigned to CapturedFrame, overwriting the data that ReadCapturedBuffer had just set at the start of the same frame. Fix: CaptureFrame is now void — only records GPU copy commands. ReadCapturedBuffer runs at start of next frame (after WaitFrame/fence) and sets CapturedFrame with actual pixel data. Program.cs reads CapturedFrame after RenderWorld — now contains data from the previous frame's GPU copy. --- Videos/cortex_20260619_090226.mp4 | Bin 0 -> 261 bytes src/Engine.Graphics.Vulkan/VulkanRenderer.cs | 6 ++---- 2 files changed, 2 insertions(+), 4 deletions(-) create mode 100644 Videos/cortex_20260619_090226.mp4 diff --git a/Videos/cortex_20260619_090226.mp4 b/Videos/cortex_20260619_090226.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..862f49648777ee248bc8b232c07d0600e621c1fa GIT binary patch literal 261 zcmZQzU{FXasVvAW&d+6FU}6B#Kx~v)mTZ_?U}DI?z`&7Kl$r{nb5jyafb`Ye{QNQ? zos(OZkpiTV0P_nlhmnB+h!6mU0~AK%J0MhIV=(~*6H8M{5`lDNZYr1tsZ-2I$teOc yKp;0Ivna8kAP2&OkUE(;#UKZ(tSrgT2huV?_k#=pTkn%tmS$$8XRK#vU;qH;LL|HZ literal 0 HcmV?d00001 diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index 8ca22cb..22ba848 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -100,7 +100,7 @@ public sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreensh Vk.vkBindBufferMemory(_ctx.Device, _screenshotBuffer, _screenshotMemory, 0); } - public byte[]? CaptureFrame(VkCommandBuffer cmd, uint imageIndex) + public void CaptureFrame(VkCommandBuffer cmd, uint imageIndex) { InitScreenshotBuffer(); @@ -136,8 +136,6 @@ public sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreensh TransitionImageLayout(cmd, _swapchain.Images[imageIndex], VkImageLayout.TransferSrcOptimal, VkImageLayout.ColorAttachmentOptimal, 0x10000, 0x1000, 0x400, 0x100); - - return null; // Data will be read next frame after GPU completes } private byte[]? ReadCapturedBuffer() @@ -525,7 +523,7 @@ public sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreensh // Capture frame AFTER render pass ends, BEFORE present transition if (IsRecording) { - CapturedFrame = CaptureFrame(cmd, imageIndex); + CaptureFrame(cmd, imageIndex); // Only records GPU commands, does NOT overwrite CapturedFrame } TransitionImageLayout(cmd, _swapchain.Images[imageIndex],