mirror of
https://github.com/johndoe6345789/SDL3CPlusPlus.git
synced 2026-04-24 13:44:58 +00:00
feat: Integrate GUI renderer service into render command and coordinator services
This commit is contained in:
@@ -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>());
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -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_) {
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user