From 8e30af3bb77f45e757e8e9e73a00dca4f4739b58 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Sun, 15 Feb 2026 23:46:59 +0100 Subject: [PATCH] drm: reduce duplicated code in render creation initMgpu already does build gl formats so remove the temp creation of allocator and renderer in onReady() that only built glformats, also if guard the creation of renderers and allocators to make it less likely to recreate one that is already existing. --- src/backend/drm/DRM.cpp | 47 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp index c78c448..0f232f2 100644 --- a/src/backend/drm/DRM.cpp +++ b/src/backend/drm/DRM.cpp @@ -595,13 +595,11 @@ bool Aquamarine::CDRMBackend::shouldBlit() { } bool Aquamarine::CDRMBackend::initMgpu() { - SP newAllocator; - if (primary || backend->primaryAllocator->type() != AQ_ALLOCATOR_TYPE_GBM) { - newAllocator = CGBMAllocator::create(backend->reopenDRMNode(gpu->fd), backend); - rendererState.allocator = newAllocator; - } else { - newAllocator = ((CGBMAllocator*)backend->primaryAllocator.get())->self.lock(); - rendererState.allocator = newAllocator; + if (!rendererState.allocator) { + if (primary || backend->primaryAllocator->type() != AQ_ALLOCATOR_TYPE_GBM) + rendererState.allocator = CGBMAllocator::create(backend->reopenDRMNode(gpu->fd), backend); + else + rendererState.allocator = ((CGBMAllocator*)backend->primaryAllocator.get())->self.lock(); } if (!rendererState.allocator) { @@ -609,7 +607,8 @@ bool Aquamarine::CDRMBackend::initMgpu() { return false; } - rendererState.renderer = CDRMRenderer::attempt(backend.lock(), gpu->renderNodeFd >= 0 ? gpu->renderNodeFd : gpu->fd); + if (!rendererState.renderer) + rendererState.renderer = CDRMRenderer::attempt(backend.lock(), gpu->renderNodeFd >= 0 ? gpu->renderNodeFd : gpu->fd); if (!rendererState.renderer) { backend->log(AQ_LOG_ERROR, "drm: initMgpu: no renderer"); @@ -1092,21 +1091,15 @@ void Aquamarine::CDRMBackend::onReady() { // init a drm renderer to gather gl formats. // if we are secondary, initMgpu will have done that - if (!primary) { - auto a = CGBMAllocator::create(backend->reopenDRMNode(gpu->fd), backend); - if (!a) - backend->log(AQ_LOG_ERROR, "drm: onReady: no renderer for gl formats"); - else { - auto r = CDRMRenderer::attempt(backend.lock(), gpu->renderNodeFd >= 0 ? gpu->renderNodeFd : gpu->fd); - if (!r) - backend->log(AQ_LOG_ERROR, "drm: onReady: no renderer for gl formats"); - else { - TRACE(backend->log(AQ_LOG_TRACE, std::format("drm: onReady: gathered {} gl formats", r->formats.size()))); - buildGlFormats(r->formats); - r.reset(); - a.reset(); - } - } + bool ok = true; + if (primary) + ok = updateSecondaryRendererState(); + else if (!rendererState.renderer || !rendererState.allocator) + ok = initMgpu(); + + if (!ok) { + backend->log(AQ_LOG_ERROR, std::format("drm: Failed to initialize renderer state for {}", gpu->path)); + return; } for (auto const& c : connectors) { @@ -1670,7 +1663,13 @@ void Aquamarine::SDRMConnector::connect(drmModeConnector* connector) { if (!backend->backend->ready) return; - if (!backend->updateSecondaryRendererState()) { + bool ok = true; + if (backend->primary) + ok = backend->updateSecondaryRendererState(); + else if (!backend->rendererState.renderer || !backend->rendererState.allocator) + ok = backend->initMgpu(); + + if (!ok) { backend->backend->log(AQ_LOG_ERROR, std::format("drm: Failed to update renderer state for {} on connect", szName)); return; }