From 620e9a4b7a3a8e436f66e3bc573f58ceea55c6b9 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Tue, 6 Jan 2026 16:18:04 +0000 Subject: [PATCH] feat(bgfx): Enhance renderer initialization with detailed logging and support for multiple renderer types --- src/services/impl/bgfx_graphics_backend.cpp | 85 ++++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/src/services/impl/bgfx_graphics_backend.cpp b/src/services/impl/bgfx_graphics_backend.cpp index 1137344..e65e2fe 100644 --- a/src/services/impl/bgfx_graphics_backend.cpp +++ b/src/services/impl/bgfx_graphics_backend.cpp @@ -18,6 +18,7 @@ #include #include #include +#include namespace sdl3cpp::services::impl { namespace { @@ -64,6 +65,41 @@ bgfx::RendererType::Enum RendererFromString(const std::string& value) { return bgfx::RendererType::Vulkan; } +std::string RendererTypeName(bgfx::RendererType::Enum type) { + if (type == bgfx::RendererType::Count) { + return "auto"; + } + const char* name = bgfx::getRendererName(type); + if (!name || name[0] == '\0') { + return "unknown"; + } + return name; +} + +std::vector GetSupportedRenderers() { + const uint8_t count = bgfx::getSupportedRenderers(); + std::vector renderers; + renderers.resize(count); + if (count > 0) { + bgfx::getSupportedRenderers(count, renderers.data()); + } + return renderers; +} + +std::string JoinRendererNames(const std::vector& renderers) { + if (renderers.empty()) { + return "none"; + } + std::string result; + for (size_t i = 0; i < renderers.size(); ++i) { + if (i > 0) { + result += ", "; + } + result += RendererTypeName(renderers[i]); + } + return result; +} + } // namespace BgfxGraphicsBackend::BgfxGraphicsBackend(std::shared_ptr configService, @@ -162,15 +198,60 @@ void BgfxGraphicsBackend::Initialize(void* window, const GraphicsConfig& config) SetupPlatformData(window); + const auto requestedRenderer = ResolveRendererType(); + const auto supportedRenderers = GetSupportedRenderers(); + if (logger_) { + logger_->Trace("BgfxGraphicsBackend", "Initialize", + "requestedRenderer=" + RendererTypeName(requestedRenderer) + + ", supportedRenderers=" + JoinRendererNames(supportedRenderers)); + } + bgfx::Init init{}; - init.type = ResolveRendererType(); init.resolution.width = viewportWidth_; init.resolution.height = viewportHeight_; init.resolution.reset = BGFX_RESET_VSYNC; - if (!bgfx::init(init)) { + std::vector candidates; + auto addCandidate = [&candidates](bgfx::RendererType::Enum type) { + if (std::find(candidates.begin(), candidates.end(), type) == candidates.end()) { + candidates.push_back(type); + } + }; + + if (requestedRenderer == bgfx::RendererType::Count) { + addCandidate(bgfx::RendererType::Count); + } else { + addCandidate(requestedRenderer); + } + for (bgfx::RendererType::Enum renderer : supportedRenderers) { + addCandidate(renderer); + } + addCandidate(bgfx::RendererType::Count); + + bool initialized = false; + for (bgfx::RendererType::Enum renderer : candidates) { + init.type = renderer; + if (logger_) { + logger_->Trace("BgfxGraphicsBackend", "Initialize", + "attemptingRenderer=" + RendererTypeName(renderer)); + } + if (bgfx::init(init)) { + initialized = true; + break; + } + if (logger_) { + logger_->Warn("BgfxGraphicsBackend::Initialize: bgfx init failed for renderer=" + + RendererTypeName(renderer)); + } + } + + if (!initialized) { throw std::runtime_error("Failed to initialize bgfx"); } + if (logger_) { + logger_->Trace("BgfxGraphicsBackend", "Initialize", + "selectedRenderer=" + RendererTypeName(bgfx::getRendererType())); + } bgfx::setViewClear(viewId_, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x1f1f1fff, 1.0f, 0); bgfx::setDebug(BGFX_DEBUG_TEXT);