From 194149f8dd5d457d37fcc4d1e55abd7ca1205f0e Mon Sep 17 00:00:00 2001 From: matthew Date: Fri, 8 Aug 2025 05:28:57 +1000 Subject: [PATCH] fix depth buffer --- assets/shaders/pbr.frag.spv | Bin 7180 -> 8184 bytes src/gears/game.d | 17 ++++-------- src/gears/platform.d | 52 ++++++++++++++++++++---------------- src/gears/vulkan.d | 31 +++++++++++++-------- src/shaders/pbr.frag.glsl | 2 +- 5 files changed, 55 insertions(+), 47 deletions(-) diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv index cb3526272b56f072158ca5fde81721ef2dd75216..23992e99fddf660d0457e77cc5f069e494458a1a 100644 GIT binary patch delta 1630 zcmZ9M$xl;J6vprC>i`x=#YAL7z^;h6)65oVlI!(_|W+3bJjvN^* zc*CPcv^5ZCj^;D{*&&s+1zp>Bj}4Bge`9uenG?2H=~{f+^<6_p4MLZR+I@?4Ue?!3 zXLT9Zb{hIJ7<{AF7PYoz->B`rNj4U_8DcYv7P)j16WJ?ew+@EFN>_vpVB#&(F_8fM z{{ox_dnB;eIHfbm`e<*1d~b?t6KJkkzqce40{jN)*zO6$V!tn`bedyDe3brm9@c0LLA=;W#N)ecU5vmfa7t@tASZb z){^|Oy%T;23%V=z!5z4-P7!f0x3&=3wtMr4ySv7+Fn}84e z>45vLJ&Caq$K>V(rqnMVn!pFnG*>3b`&<$h)v(WL=$sRfAR+lvm=wD8F;q+b3OIO{ zBk)+c|22}o1^hP(R9}+zwxUGHMFS2I laEP1>2Bgge>CxU8FM@x>Y_CcxQRw001S8I!E)==x$ zJiED7v&$t_Gu3s9FRwHl2ScHDATlCBqj4&JBKD=XqQV#DC_!vU!1Icc>*{q8@J-y! zmols%DLqXV01eF=MP|?JO22vzl{s{cP7Fn&lE@h@u3)6SQu(~rq&3x1MzQ? z+2~##)3>PUKn$1JesCq}91%kax>G=2uTL^YIK@L~-Ohof9vioMHhr%VW N01LF!^Np!*{TJiQW7_}# diff --git a/src/gears/game.d b/src/gears/game.d index 5c93eb5..2bed3a9 100644 --- a/src/gears/game.d +++ b/src/gears/game.d @@ -294,13 +294,11 @@ Cycle(Game* g) model = model.next; } - /* ImageBarrier(&g.rd); Bind(&g.rd, &g.oit_pipeline); Draw(&g.rd, 3, 1); - */ FinishRendering(&g.rd); @@ -337,17 +335,12 @@ Destroy(Game* g) Destroy(&g.rd, &g.ui_pipeline); Destroy(&g.rd, &g.compute_pipeline); - Node!(Model)* model = g.models.first; - for(;;) - { - if (model == null) - { - break; - } + Destroy(&g.rd, &g.rock); + Destroy(&g.rd, &g.tree); + Destroy(&g.rd, &g.magic_rock); + Destroy(&g.rd, &g.log); + Destroy(&g.rd, &g.stump); - Destroy(&g.rd, &model.value); - model = model.next; - } Destroy(&g.rd); } diff --git a/src/gears/platform.d b/src/gears/platform.d index 1acc0cb..b48a6d4 100644 --- a/src/gears/platform.d +++ b/src/gears/platform.d @@ -225,39 +225,45 @@ CreateWindow(string name, u16 width, u16 height) void LockCursor(PlatformWindow* window) { - u32 counter = 0; - for(;;) + if (!window.locked_cursor) { - xcb_generic_error_t *error; - xcb_grab_pointer_cookie_t grab_cookie = xcb_grab_pointer(window.conn, true, window.window, 0, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, window.window, XCB_NONE, XCB_CURRENT_TIME); - xcb_grab_pointer_reply_t* grab_reply = xcb_grab_pointer_reply(window.conn, grab_cookie, &error); - - scope(exit) + u32 counter = 0; + for(;;) { - pureFree(error); - pureFree(grab_reply); + xcb_generic_error_t *error; + xcb_grab_pointer_cookie_t grab_cookie = xcb_grab_pointer(window.conn, true, window.window, 0, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, window.window, XCB_NONE, XCB_CURRENT_TIME); + xcb_grab_pointer_reply_t* grab_reply = xcb_grab_pointer_reply(window.conn, grab_cookie, &error); + + scope(exit) + { + pureFree(error); + pureFree(grab_reply); + } + + if (grab_reply.status == XCB_GRAB_STATUS_SUCCESS) + { + break; + } + + assert(counter < 5, "Unable to grab cursor"); + counter += 1; + Thread.sleep(dur!("msecs")(50)); } - if (grab_reply.status == XCB_GRAB_STATUS_SUCCESS) - { - break; - } - - assert(counter < 5, "Unable to grab cursor"); - counter += 1; - Thread.sleep(dur!("msecs")(50)); + HideCursor(window); + window.locked_cursor = true; } - - HideCursor(window); - window.locked_cursor = true; } void UnlockCursor(PlatformWindow* window) { - xcb_ungrab_pointer(window.conn, XCB_CURRENT_TIME); - ShowCursor(window); - window.locked_cursor = false; + if (window.locked_cursor) + { + xcb_ungrab_pointer(window.conn, XCB_CURRENT_TIME); + ShowCursor(window); + window.locked_cursor = false; + } } // TODO: improve error handling for show/hide cursor diff --git a/src/gears/vulkan.d b/src/gears/vulkan.d index 1e86bc7..a9f7275 100644 --- a/src/gears/vulkan.d +++ b/src/gears/vulkan.d @@ -677,11 +677,18 @@ BeginRendering(Vulkan* vk) VkImage image = CurrentImage(vk); Transition(vk.cmds[vk.frame_index], image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - VkClearValue clear_color = { - color: { - float32: [0.0, 0.0, 0.0, 1.0], + VkClearValue[] clear_color = [ + { + color: { + float32: [0.0, 0.0, 0.0, 1.0], + }, }, - }; + { + color: { + float32: [0.0, 0.0, 0.0, 0.0], + }, + }, + ]; VkRenderPassBeginInfo pass_info = { sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, @@ -697,8 +704,8 @@ BeginRendering(Vulkan* vk) height: vk.swapchain_extent.height, }, }, - clearValueCount: 1, - pClearValues: &clear_color, + clearValueCount: cast(u32)clear_color.length, + pClearValues: clear_color.ptr, }; vkCmdBeginRenderPass(vk.cmds[vk.frame_index], &pass_info, VK_SUBPASS_CONTENTS_INLINE); @@ -1173,10 +1180,10 @@ ImageBarrier(Vulkan* vk) { VkMemoryBarrier2 barrier = { sType: VK_STRUCTURE_TYPE_MEMORY_BARRIER_2, - srcStageMask: VK_PIPELINE_STAGE_2_TRANSFER_BIT, - srcAccessMask: VK_ACCESS_2_TRANSFER_WRITE_BIT, - dstStageMask: VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, - dstAccessMask: VK_ACCESS_2_SHADER_READ_BIT | VK_ACCESS_2_SHADER_WRITE_BIT, + srcStageMask: VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + srcAccessMask: VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, + dstStageMask: VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + dstAccessMask: VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, }; VkDependencyInfo dependency = { @@ -1492,8 +1499,10 @@ InitFramebufferAndRenderPass(Vulkan* vk) finalLayout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }, { - samples: VK_SAMPLE_COUNT_1_BIT, format: vk.depth_image.format, + samples: VK_SAMPLE_COUNT_1_BIT, + loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR, + storeOp: VK_ATTACHMENT_STORE_OP_STORE, initialLayout: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, finalLayout: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, }, diff --git a/src/shaders/pbr.frag.glsl b/src/shaders/pbr.frag.glsl index 1b2ba70..2964c89 100644 --- a/src/shaders/pbr.frag.glsl +++ b/src/shaders/pbr.frag.glsl @@ -61,7 +61,7 @@ void main() FragColor = out_col; /* - TODO: set up OIT again + //TODO: set up OIT again vec4 srgb_col = out_col;// UnPreMultLinearToSRGB(out_col); uvec4 store_value = uvec4(packUnorm4x8(srgb_col), floatBitsToUint(gl_FragCoord.z), store_mask, 0);