diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/build.sh b/build.sh index 1df185b..316955f 100755 --- a/build.sh +++ b/build.sh @@ -24,13 +24,12 @@ source_files="../src/main.c" include_flags="-I../src/ -I../external/ -L." # executable name -out_name="GearWorks" +out_name="Gears" # vma flags -vma_ld="ld -static vma.o `g++ -print-file-name=libstdc++.a` -o vmastdc++.o" vma_source_files="../external/vma/vma.cpp" -vma_compile_flags="-std=c++20 -I../external/vma" -vma_out="-c -o" +vma_compile_flags="-std=c++20 -I../external/vma -c" +vma_out="-o" vma_obj="vma.o" # glslc @@ -51,10 +50,10 @@ clang_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${clang_common} ${auto_compile_f clang_link="-lpthread -lm -lrt -ldl -l:libvma.a" clang_out="-o" -gcc_common="${include_flags} -fuse-ld=mold -g -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -DVMA_STATIC_VULKAN_FUNCTIONS=0" +gcc_common="${include_flags} -std=c99 -fuse-ld=mold -g -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -DVMA_STATIC_VULKAN_FUNCTIONS=0" gcc_debug="$compiler -g -O0 -DBUILD_DEBUG=1 ${gcc_common} ${auto_compile_flags}" gcc_release="$compiler -g -O2 -DBUILD_DEBUG=0 ${gcc_common} ${auto_compile_flags}" -gcc_link="-lpthread -lm -lrt -ldl -l:libvma.a" +gcc_link="-lpthread -lm -lrt -ldl -l:libvma.a -lstdc++" gcc_out="-o" link_dll="-fPIC" @@ -77,11 +76,6 @@ mkdir -p build cd build -if [ ! -f $vma_obj ]; then - $vma_ld -fi - - if [ -v vulkan ]; then mkdir -p ./shaders/glsl mkdir -p ../src/file_data @@ -115,7 +109,8 @@ fi $cpp_compiler $vma_compile_flags $vma_source_files $vma_out $vma_obj -ar rcs libvma.a vmastdc++.o +ar rcs libvma.a vma.o $compile $source_files $compile_link $link_os_gfx $out $out_name + diff --git a/src/platform_linux.c b/src/platform_linux.c index 8be3c4b..aaae720 100644 --- a/src/platform_linux.c +++ b/src/platform_linux.c @@ -308,13 +308,10 @@ b32 HandleWindowEvent(WindowEvent *event, b32 wait_for_event) linux_window.h = expose_e->height; break; case XCB_CONFIGURE_NOTIFY: - Printfln("configure notify"); xcb_configure_notify_event_t *configure_event = (xcb_configure_notify_event_t *)e; if (linux_window.w != configure_event->width || linux_window.h != configure_event->height) { - - Printfln("inner w %d h %d", configure_event->width, configure_event->height); event->type = EVENT_RESIZE; valid_event = true; diff --git a/src/render_vulkan.c b/src/render_vulkan.c index 030f721..c4aa7ea 100644 --- a/src/render_vulkan.c +++ b/src/render_vulkan.c @@ -108,6 +108,44 @@ b32 _BeginFrame() } } + if (success) + { + TransitionImage(cmd, &renderer.vk.sc.draw_img, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + TransitionImage(cmd, &renderer.vk.sc.depth_img, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); + + VkRenderingAttachmentInfo col_attach_info = { + .sType = STYPE(RENDERING_ATTACHMENT_INFO), + .imageView = renderer.vk.sc.draw_img.view, + .imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + }; + + VkRenderingAttachmentInfo depth_attach_info = { + .sType = STYPE(RENDERING_ATTACHMENT_INFO), + .imageView = renderer.vk.sc.depth_img.view, + .imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + }; + + VkRenderingInfo render_info = { + .sType = STYPE(RENDERING_INFO), + .layerCount = 1, + .colorAttachmentCount = 1, + .pColorAttachments = &col_attach_info, + .pDepthAttachment = &depth_attach_info, + .renderArea = { + .extent = { + .width = renderer.vk.sc.extent.width, + .height = renderer.vk.sc.extent.height, + }, + }, + }; + + vkCmdBeginRendering(cmd, &render_info); + } + return success; } @@ -118,44 +156,7 @@ void _ClearScreen() void _DrawTriangle() { - u32 f_ix = renderer.frame_state.frame_cnt % renderer.vk.sc.img_count; - - VkCommandBuffer cmd = renderer.vk.frame.buffers[f_ix]; - - TransitionImage(cmd, renderer.vk.sc.draw_img.img, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - TransitionImage(cmd, renderer.vk.sc.depth_img.img, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL); - - VkRenderingAttachmentInfo col_attach_info = { - .sType = STYPE(RENDERING_ATTACHMENT_INFO), - .imageView = renderer.vk.sc.draw_img.view, - .imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - }; - - VkRenderingAttachmentInfo depth_attach_info = { - .sType = STYPE(RENDERING_ATTACHMENT_INFO), - .imageView = renderer.vk.sc.depth_img.view, - .imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, - .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - }; - - VkRenderingInfo render_info = { - .sType = STYPE(RENDERING_INFO), - .layerCount = 1, - .colorAttachmentCount = 1, - .pColorAttachments = &col_attach_info, - .pDepthAttachment = &depth_attach_info, - .renderArea = { - .extent = { - .width = renderer.vk.sc.extent.width, - .height = renderer.vk.sc.extent.height, - }, - }, - }; - - vkCmdBeginRendering(cmd, &render_info); + VkCommandBuffer cmd = GetFrameCmdBuf(); vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, renderer.vk.pipe.pipelines[PIPELINE_CUBE]); vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, renderer.vk.pipe.pipeline_layout, 0, DESC_TYPE_MAX, renderer.vk.pipe.sets, 0, NULL); @@ -187,18 +188,16 @@ b32 _FinishFrame() b32 success = true; VkResult result; - u32 f_ix = renderer.frame_state.frame_cnt % renderer.vk.sc.img_count; - - VkCommandBuffer cmd = renderer.vk.frame.buffers[f_ix]; - VkSemaphore sc_sem = renderer.vk.frame.swapchain_sems[f_ix]; - VkSemaphore rndr_sem = renderer.vk.frame.render_sems[f_ix]; - VkFence fence = renderer.vk.frame.render_fences[f_ix]; + VkCommandBuffer cmd = GetFrameCmdBuf(); + VkSemaphore sc_sem = GetFrameSwapSem(); + VkSemaphore rndr_sem = GetFrameRenderSem(); + VkFence *fence = GetFrameRenderFence(); VkImage curr_img = renderer.vk.sc.imgs[renderer.frame_state.img_ix]; vkCmdEndRendering(cmd); - TransitionImage(cmd, renderer.vk.sc.draw_img.img, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - TransitionImage(cmd, curr_img, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + TransitionImage(cmd, &renderer.vk.sc.draw_img, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + TransitionImageLayout(cmd, curr_img, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkExtent2D extent = { .width = renderer.vk.sc.extent.width, @@ -207,7 +206,7 @@ b32 _FinishFrame() CopyImageToImage(cmd, renderer.vk.sc.draw_img.img, curr_img, extent, extent); - TransitionImage(cmd, curr_img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + TransitionImageLayout(cmd, curr_img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); result = vkEndCommandBuffer(cmd); if (result != VK_SUCCESS) @@ -247,7 +246,7 @@ b32 _FinishFrame() .pCommandBufferInfos = &cmd_info, }; - result = vkQueueSubmit2(renderer.vk.queues.graphics_queue, 1, &submit_info, fence); + result = vkQueueSubmit2(renderer.vk.queues.graphics_queue, 1, &submit_info, *fence); if (result != VK_SUCCESS) { Printf("vkQueueSubmit2 failure: %s", VkResultStr(result)); @@ -357,7 +356,7 @@ static void CopyImageToImage(VkCommandBuffer cmd, VkImage src, VkImage dst, VkEx vkCmdBlitImage2(cmd, &blit_info); } -static void TransitionImage(VkCommandBuffer cmd, VkImage img, VkImageLayout curr, VkImageLayout new) +static void TransitionImageLayout(VkCommandBuffer cmd, VkImage img, VkImageLayout curr, VkImageLayout new) { VkImageMemoryBarrier2 barrier = { .sType = STYPE(IMAGE_MEMORY_BARRIER_2), @@ -386,6 +385,12 @@ static void TransitionImage(VkCommandBuffer cmd, VkImage img, VkImageLayout curr vkCmdPipelineBarrier2(cmd, &dep_info); } +static void TransitionImage(VkCommandBuffer cmd, Image *img, VkImageLayout new) +{ + TransitionImageLayout(cmd, img->img, img->curr_layout, new); + img->curr_layout = new; +} + // INIT static b32 InitVulkan(Arena *arena) @@ -989,7 +994,9 @@ static b32 CreateDrawImages() // Setting values renderer.vk.sc.extent = extent; renderer.vk.sc.depth_img.fmt = depth_image_create_info.format; + renderer.vk.sc.depth_img.curr_layout = VK_IMAGE_LAYOUT_UNDEFINED; renderer.vk.sc.draw_img.fmt = draw_image_create_info.format; + renderer.vk.sc.draw_img.curr_layout = VK_IMAGE_LAYOUT_UNDEFINED; return success; } @@ -1383,3 +1390,4 @@ static VkBool32 DebugCallback( return VK_FALSE; } + diff --git a/src/render_vulkan.h b/src/render_vulkan.h index a176cb4..c3dbfd7 100644 --- a/src/render_vulkan.h +++ b/src/render_vulkan.h @@ -196,6 +196,7 @@ typedef struct { VkImageView view; VmaAllocation alloc; VkFormat fmt; + VkImageLayout curr_layout; } Image; typedef struct { @@ -282,6 +283,7 @@ static VkFence *GetFrameRenderFence(); static VkSemaphore GetFrameRenderSem(); static VkSemaphore GetFrameSwapSem(); static u32 GetFrameIndex(); +static VkImage GetFrameSwapImage(); // Destroy static void DestroyVulkan(); @@ -289,7 +291,8 @@ static void DestroySwapchain(); static void DestroyDrawImages(); // Util -static void TransitionImage(VkCommandBuffer cmd, VkImage img, VkImageLayout curr, VkImageLayout new); +static void TransitionImage(VkCommandBuffer cmd, Image *img, VkImageLayout new); +static void TransitionImageLayout(VkCommandBuffer cmd, VkImage img, VkImageLayout curr, VkImageLayout new); static void CopyImageToImage(VkCommandBuffer cmd, VkImage src, VkImage dst, VkExtent2D src_ext, VkExtent2D dst_ext); // Swapchain @@ -343,3 +346,4 @@ static b32 _BeginFrame(); static void _DrawTriangle(); static b32 _FinishFrame(); static void _SetRenderSize(u32 x, u32 y); +