From 647b43521ef0804be9b2d1b7b0384aecd825c22f Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Mon, 5 Jan 2026 14:01:51 +0000 Subject: [PATCH] feat: Integrate GUI renderer service into render command and coordinator services --- src/app/service_based_app.cpp | 1 + src/services/impl/gui_renderer.cpp | 2 +- src/services/impl/render_command_service.cpp | 28 ++++++++++++++++++- src/services/impl/render_command_service.hpp | 3 ++ .../impl/render_coordinator_service.cpp | 12 ++++---- src/services/impl/swapchain_service.cpp | 6 +++- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/app/service_based_app.cpp b/src/app/service_based_app.cpp index f8c29e4..64c7a89 100644 --- a/src/app/service_based_app.cpp +++ b/src/app/service_based_app.cpp @@ -308,6 +308,7 @@ void ServiceBasedApp::RegisterServices() { registry_.GetService(), registry_.GetService(), registry_.GetService(), + registry_.GetService(), std::static_pointer_cast(registry_.GetService()), registry_.GetService()); diff --git a/src/services/impl/gui_renderer.cpp b/src/services/impl/gui_renderer.cpp index 6ed51a9..98d29ac 100644 --- a/src/services/impl/gui_renderer.cpp +++ b/src/services/impl/gui_renderer.cpp @@ -416,7 +416,7 @@ GuiRenderer::GuiRenderer(VkDevice device, VkPhysicalDevice physicalDevice, VkFor } VkImageMemoryBarrier barrier{}; barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; diff --git a/src/services/impl/render_command_service.cpp b/src/services/impl/render_command_service.cpp index 4a06bb1..5fa2fd1 100644 --- a/src/services/impl/render_command_service.cpp +++ b/src/services/impl/render_command_service.cpp @@ -9,12 +9,14 @@ RenderCommandService::RenderCommandService(std::shared_ptr std::shared_ptr swapchainService, std::shared_ptr pipelineService, std::shared_ptr bufferService, + std::shared_ptr guiRendererService, std::shared_ptr configService, std::shared_ptr logger) : deviceService_(std::move(deviceService)), swapchainService_(std::move(swapchainService)), pipelineService_(std::move(pipelineService)), bufferService_(std::move(bufferService)), + guiRendererService_(std::move(guiRendererService)), configService_(std::move(configService)), logger_(logger) { if (logger_) { @@ -22,7 +24,8 @@ RenderCommandService::RenderCommandService(std::shared_ptr "deviceService=" + std::string(deviceService_ ? "set" : "null") + ", swapchainService=" + std::string(swapchainService_ ? "set" : "null") + ", pipelineService=" + std::string(pipelineService_ ? "set" : "null") + - ", bufferService=" + std::string(bufferService_ ? "set" : "null")); + ", bufferService=" + std::string(bufferService_ ? "set" : "null") + + ", guiRendererService=" + std::string(guiRendererService_ ? "set" : "null")); } if (!deviceService_ || !swapchainService_ || !pipelineService_ || !bufferService_) { @@ -217,6 +220,29 @@ void RenderCommandService::RecordCommands(uint32_t imageIndex, } vkCmdEndRenderPass(commandBuffer); + if (guiRendererService_) { + bool guiReady = guiRendererService_->IsReady(); + const auto& images = swapchainService_->GetSwapchainImages(); + if (!guiReady) { + if (logger_) { + logger_->Trace("RenderCommandService", "RecordCommands", + "GUI overlay skipped: renderer not ready"); + } + } else if (imageIndex >= images.size() || images[imageIndex] == VK_NULL_HANDLE) { + if (logger_) { + logger_->Error("RenderCommandService: GUI overlay skipped due to invalid swapchain image"); + } + } else { + if (logger_) { + logger_->Trace("RenderCommandService", "RecordCommands", + "Rendering GUI overlay imageIndex=" + std::to_string(imageIndex)); + } + guiRendererService_->RenderToSwapchain(commandBuffer, images[imageIndex]); + } + } else if (logger_) { + logger_->Trace("RenderCommandService", "RecordCommands", + "GUI overlay skipped: renderer service not available"); + } vkEndCommandBuffer(commandBuffer); } diff --git a/src/services/impl/render_command_service.hpp b/src/services/impl/render_command_service.hpp index 8af9397..c47efb5 100644 --- a/src/services/impl/render_command_service.hpp +++ b/src/services/impl/render_command_service.hpp @@ -6,6 +6,7 @@ #include "../interfaces/i_vulkan_device_service.hpp" #include "../interfaces/i_swapchain_service.hpp" #include "../interfaces/i_config_service.hpp" +#include "../interfaces/i_gui_renderer_service.hpp" #include "../impl/json_config_service.hpp" #include "../interfaces/i_logger.hpp" #include "../../di/lifecycle.hpp" @@ -27,6 +28,7 @@ public: std::shared_ptr swapchainService, std::shared_ptr pipelineService, std::shared_ptr bufferService, + std::shared_ptr guiRendererService, std::shared_ptr configService, std::shared_ptr logger); ~RenderCommandService() override; @@ -58,6 +60,7 @@ private: std::shared_ptr swapchainService_; std::shared_ptr pipelineService_; std::shared_ptr bufferService_; + std::shared_ptr guiRendererService_; std::shared_ptr configService_; std::shared_ptr logger_; diff --git a/src/services/impl/render_coordinator_service.cpp b/src/services/impl/render_coordinator_service.cpp index 110365d..0f3bfa5 100644 --- a/src/services/impl/render_coordinator_service.cpp +++ b/src/services/impl/render_coordinator_service.cpp @@ -58,6 +58,12 @@ void RenderCoordinatorService::RenderFrame(float time) { graphicsService_->BeginFrame(); + if (guiService_ && guiScriptService_ && guiScriptService_->HasGuiCommands()) { + auto guiCommands = guiScriptService_->LoadGuiCommands(); + auto extent = graphicsService_->GetSwapchainExtent(); + guiService_->PrepareFrame(guiCommands, extent.width, extent.height); + } + if (sceneScriptService_ && sceneService_) { auto sceneObjects = sceneScriptService_->LoadSceneObjects(); sceneService_->LoadScene(sceneObjects); @@ -94,12 +100,6 @@ void RenderCoordinatorService::RenderFrame(float time) { graphicsService_->RenderScene(renderCommands, viewProj); } - if (guiService_ && guiScriptService_ && guiScriptService_->HasGuiCommands()) { - auto guiCommands = guiScriptService_->LoadGuiCommands(); - auto extent = graphicsService_->GetSwapchainExtent(); - guiService_->PrepareFrame(guiCommands, extent.width, extent.height); - } - graphicsService_->EndFrame(); if (logger_) { diff --git a/src/services/impl/swapchain_service.cpp b/src/services/impl/swapchain_service.cpp index c09df7d..8b5aeb2 100644 --- a/src/services/impl/swapchain_service.cpp +++ b/src/services/impl/swapchain_service.cpp @@ -89,7 +89,11 @@ void SwapchainService::CreateSwapchain(uint32_t width, uint32_t height) { createInfo.imageColorSpace = surfaceFormat.colorSpace; createInfo.imageExtent = extent; createInfo.imageArrayLayers = 1; - createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + VkImageUsageFlags usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + if (support.capabilities.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT) { + usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + } + createInfo.imageUsage = usage; QueueFamilyIndices indices = deviceService_->GetQueueFamilies(); uint32_t queueFamilyIndices[] = {indices.graphicsFamily, indices.presentFamily};