Added ImGUI into the render loop, not tested atm

This commit is contained in:
Alexandre 2026-06-09 22:54:53 +02:00
parent 78b5577ff2
commit 76947a59ee
3 changed files with 126 additions and 1 deletions

View File

@ -6,6 +6,7 @@ CompileFlags:
- -DINITIALIZERS_IMPL - -DINITIALIZERS_IMPL
- -DPIPELINES_IMPL - -DPIPELINES_IMPL
- -DDESCRIPTORS_IMPL - -DDESCRIPTORS_IMPL
- -DCALLBACK_IMPL
- -DTIMER_IMPL - -DTIMER_IMPL
- -DLOGGER_IMPL - -DLOGGER_IMPL
- -DSERVER_INIT_IMPL - -DSERVER_INIT_IMPL

View File

@ -109,10 +109,15 @@ class Engine {
uint32_t width, uint32_t width,
uint32_t height uint32_t height
); );
void buildImgui();
void destroySwapchain(); void destroySwapchain();
void drawBackground( void drawBackground(
VkCommandBuffer cmd VkCommandBuffer cmd
); );
void drawImgui(
VkCommandBuffer cmd,
VkImageView targetImageView
);
}; };
@ -325,6 +330,19 @@ void Engine::draw() {
_swapchainExtent _swapchainExtent
); );
// Set the swapchain image layout to Attachment Optimal so ImGui can write on top of it
vkutil::transitionImage(
cmd,
_swapchainImages[swapchainImageIndex],
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
);
drawImgui(
cmd,
_swapchainImageViews[swapchainImageIndex]
);
// Uses the present layout to display into the screen // Uses the present layout to display into the screen
vkutil::transitionImage( vkutil::transitionImage(
cmd, cmd,
@ -384,6 +402,7 @@ void Engine::run() {
continue; continue;
} }
buildImgui();
draw(); draw();
} }
#ifdef DEBUG #ifdef DEBUG
@ -890,7 +909,7 @@ void Engine::initImgui() {
.PipelineRenderingCreateInfo { .PipelineRenderingCreateInfo {
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR, .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR,
.colorAttachmentCount = 1, .colorAttachmentCount = 1,
.pColorAttachmentFormats = &_swapchainImageFormat .pColorAttachmentFormats = &_drawImage.imageFormat
} }
}, },
.UseDynamicRendering = true .UseDynamicRendering = true
@ -955,6 +974,19 @@ void Engine::createSwapchain(
#endif #endif
} }
void Engine::buildImgui() {
// New frames
ImGui_ImplVulkan_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// Main ImGui things
ImGui::ShowDemoWindow();
// Finish everything
ImGui::Render();
}
void Engine::destroySwapchain() { void Engine::destroySwapchain() {
#ifdef DEBUG #ifdef DEBUG
fmt::println("[Engine:Cleanup] Destroying the swapchain..."); fmt::println("[Engine:Cleanup] Destroying the swapchain...");
@ -1011,6 +1043,38 @@ void Engine::drawBackground(
} }
void Engine::drawImgui(
VkCommandBuffer cmd,
VkImageView targetImageView
) {
VkRenderingAttachmentInfo colorAttachment {
vkinit::attachmentInfo(
targetImageView,
nullptr,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
)
};
VkRenderingInfo renderInfo {
vkinit::renderingInfo(
_swapchainExtent,
&colorAttachment,
nullptr
)
};
vkCmdBeginRendering(
cmd,
&renderInfo
);
ImGui_ImplVulkan_RenderDrawData(
ImGui::GetDrawData(),
cmd
);
vkCmdEndRendering(cmd);
}
void Engine::immediateSubmit( void Engine::immediateSubmit(
std::function< std::function<
void(VkCommandBuffer cmd) void(VkCommandBuffer cmd)
@ -1080,5 +1144,7 @@ void Engine::immediateSubmit(
} }
#endif #endif
#endif #endif

View File

@ -2,6 +2,7 @@
#define INITIALIZERS_H #define INITIALIZERS_H
// Normal header // Normal header
#include "Common/Types.h" #include "Common/Types.h"
#include <vulkan/vulkan_core.h>
namespace vkinit { namespace vkinit {
VkCommandPoolCreateInfo commandPoolCreateInfo( VkCommandPoolCreateInfo commandPoolCreateInfo(
@ -57,6 +58,17 @@ namespace vkinit {
VkImageAspectFlags aspectFlags VkImageAspectFlags aspectFlags
); );
VkRenderingAttachmentInfo attachmentInfo(
VkImageView view,
VkClearValue* clear,
VkImageLayout layout /*= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL*/
);
VkRenderingInfo renderingInfo(
VkExtent2D renderExtent,
VkRenderingAttachmentInfo* colorAttachment,
VkRenderingAttachmentInfo* depthAttachment
);
} }
@ -242,6 +254,52 @@ namespace vkinit {
return info; return info;
} }
VkRenderingAttachmentInfo attachmentInfo(
VkImageView view,
VkClearValue* clear,
VkImageLayout layout /*= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL*/
) {
VkRenderingAttachmentInfo colorAttachment {
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
.pNext = nullptr,
.imageView = view,
.imageLayout = layout,
.loadOp = clear ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE
};
if (clear) {
colorAttachment.clearValue = *clear;
}
return colorAttachment;
}
VkRenderingInfo renderingInfo(
VkExtent2D renderExtent,
VkRenderingAttachmentInfo* colorAttachment,
VkRenderingAttachmentInfo* depthAttachment
) {
VkRenderingInfo renderInfo {
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
.pNext = nullptr,
.renderArea = VkRect2D {
VkOffset2D {
0,
0
}, renderExtent
},
.layerCount = 1,
.colorAttachmentCount = 1,
.pColorAttachments = colorAttachment,
.pDepthAttachment = depthAttachment,
.pStencilAttachment = nullptr
};
return renderInfo;
}
} }
#endif #endif
#endif #endif