feat: Integrate GUI renderer service into render command and coordinator services

This commit is contained in:
2026-01-05 14:01:51 +00:00
parent d1bee3b237
commit 647b43521e
6 changed files with 43 additions and 9 deletions

View File

@@ -308,6 +308,7 @@ void ServiceBasedApp::RegisterServices() {
registry_.GetService<services::ISwapchainService>(),
registry_.GetService<services::IPipelineService>(),
registry_.GetService<services::IBufferService>(),
registry_.GetService<services::IGuiRendererService>(),
std::static_pointer_cast<services::impl::JsonConfigService>(registry_.GetService<services::IConfigService>()),
registry_.GetService<services::ILogger>());

View File

@@ -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;

View File

@@ -9,12 +9,14 @@ RenderCommandService::RenderCommandService(std::shared_ptr<IVulkanDeviceService>
std::shared_ptr<ISwapchainService> swapchainService,
std::shared_ptr<IPipelineService> pipelineService,
std::shared_ptr<IBufferService> bufferService,
std::shared_ptr<IGuiRendererService> guiRendererService,
std::shared_ptr<JsonConfigService> configService,
std::shared_ptr<ILogger> 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<IVulkanDeviceService>
"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);
}

View File

@@ -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<ISwapchainService> swapchainService,
std::shared_ptr<IPipelineService> pipelineService,
std::shared_ptr<IBufferService> bufferService,
std::shared_ptr<IGuiRendererService> guiRendererService,
std::shared_ptr<JsonConfigService> configService,
std::shared_ptr<ILogger> logger);
~RenderCommandService() override;
@@ -58,6 +60,7 @@ private:
std::shared_ptr<ISwapchainService> swapchainService_;
std::shared_ptr<IPipelineService> pipelineService_;
std::shared_ptr<IBufferService> bufferService_;
std::shared_ptr<IGuiRendererService> guiRendererService_;
std::shared_ptr<JsonConfigService> configService_;
std::shared_ptr<ILogger> logger_;

View File

@@ -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_) {

View File

@@ -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};