diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index 4a5592ae..5cd6005a 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -445,7 +445,10 @@ void CWLSurfaceResource::commitPendingState() { if (previousBuffer && !previousBuffer->isSynchronous() && !bufferReleased) { if (previousBuffer->lockedByBackend) { previousBuffer->hlEvents.backendRelease = previousBuffer->events.backendRelease.registerListener([this, previousBuffer](std::any data) { - previousBuffer->sendReleaseWithSurface(self.lock()); + if (!self.expired()) // could be dead in the dtor + previousBuffer->sendReleaseWithSurface(self.lock()); + else + previousBuffer->sendRelease(); previousBuffer->hlEvents.backendRelease.reset(); bufferReleased = true; }); diff --git a/src/protocols/types/WLBuffer.cpp b/src/protocols/types/WLBuffer.cpp index cc24546d..d34a867d 100644 --- a/src/protocols/types/WLBuffer.cpp +++ b/src/protocols/types/WLBuffer.cpp @@ -35,7 +35,7 @@ void CWLBufferResource::sendRelease() { void CWLBufferResource::sendReleaseWithSurface(SP surf) { sendRelease(); - if (!surf->syncobj) + if (!surf || !surf->syncobj) return; if (drmSyncobjTimelineSignal(g_pCompositor->m_iDRMFD, &surf->syncobj->releaseTimeline->timeline->handle, &surf->syncobj->releasePoint, 1)) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 2d461227..82dfc887 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2622,6 +2622,11 @@ bool CHyprRenderer::beginRender(CMonitor* pMonitor, CRegion& damage, eRenderMode return false; } + if (!m_pCurrentRenderbuffer) { + Debug::log(ERR, "failed to start a render pass for output {}, no RBO could be obtained", pMonitor->szName); + return false; + } + if (mode == RENDER_MODE_NORMAL) { damage = pMonitor->damage.getBufferDamage(HL_BUFFER_AGE); pMonitor->damage.rotate();