Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package aquamarine for openSUSE:Factory checked in at 2026-09-24 23:00:11 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/aquamarine (Old) and /work/SRC/openSUSE:Factory/.aquamarine.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "aquamarine" Thu Sep 24 23:00:11 2026 rev:13 rq:1380160 version:0.15.1 Changes: -------- --- /work/SRC/openSUSE:Factory/aquamarine/aquamarine.changes 2026-09-02 17:05:04.013161666 +0200 +++ /work/SRC/openSUSE:Factory/.aquamarine.new.383539/aquamarine.changes 2026-09-24 23:02:09.445015051 +0200 @@ -1,0 +2,11 @@ +Sat Sep 19 17:35:58 UTC 2026 - Nassim Lhadj <[email protected]> + +- Update to aquamarine version 0.15.1: + * drm: don't terminate shared EGL displays in ~CDRMRenderer + * drm: reserve CRTCs used by redundant tiles + * session: fix libinput missing new events on resume + * drm: release output on disconnect manually + * renderer: fix version pragmas not being on the first line + * drm: fix UAF in frameIdle + +------------------------------------------------------------------- Old: ---- aquamarine-0.15.0.tar.xz New: ---- aquamarine-0.15.1.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ aquamarine.spec ++++++ --- /var/tmp/diff_new_pack.1A1Lqn/_old 2026-09-24 23:02:10.018039011 +0200 +++ /var/tmp/diff_new_pack.1A1Lqn/_new 2026-09-24 23:02:10.019039053 +0200 @@ -22,7 +22,7 @@ provides basic abstractions for an application to render on a Wayland session (in a window) or a native DRM session.} Name: aquamarine -Version: 0.15.0 +Version: 0.15.1 Release: 0 Summary: Rendering backend library License: BSD-3-Clause ++++++ aquamarine-0.15.0.tar.xz -> aquamarine-0.15.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aquamarine-0.15.0/VERSION new/aquamarine-0.15.1/VERSION --- old/aquamarine-0.15.0/VERSION 2026-08-29 17:19:44.000000000 +0200 +++ new/aquamarine-0.15.1/VERSION 2026-09-17 09:32:02.000000000 +0200 @@ -1 +1 @@ -0.15.0 +0.15.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aquamarine-0.15.0/include/aquamarine/backend/Session.hpp new/aquamarine-0.15.1/include/aquamarine/backend/Session.hpp --- old/aquamarine-0.15.0/include/aquamarine/backend/Session.hpp 2026-08-29 17:19:44.000000000 +0200 +++ new/aquamarine-0.15.1/include/aquamarine/backend/Session.hpp 2026-09-17 09:32:02.000000000 +0200 @@ -223,6 +223,10 @@ bool switchVT(uint32_t vt); void onReady(); + void dispatchUdevEvents(); + void dispatchLibinputEvents(); + void dispatchLibseatEvents(); + struct SAddDrmCardEvent { std::string path; }; @@ -237,9 +241,6 @@ Hyprutils::Memory::CWeakPointer<CBackend> backend; std::vector<Hyprutils::Memory::CSharedPointer<SPollFD>> polls; - void dispatchUdevEvents(); - void dispatchLibinputEvents(); - void dispatchLibseatEvents(); void handleLibinputEvent(libinput_event* e); void handleLibinputTabletToolAxis(libinput_event* e); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aquamarine-0.15.0/src/backend/Session.cpp new/aquamarine-0.15.1/src/backend/Session.cpp --- old/aquamarine-0.15.0/src/backend/Session.cpp 2026-08-29 17:19:44.000000000 +0200 +++ new/aquamarine-0.15.1/src/backend/Session.cpp 2026-09-17 09:32:02.000000000 +0200 @@ -79,8 +79,10 @@ static void libseatEnableSeat(struct libseat* seat, void* data) { auto PSESSION = (Aquamarine::CSession*)data; PSESSION->active = true; - if (PSESSION->libinputHandle) + if (PSESSION->libinputHandle) { libinput_resume(PSESSION->libinputHandle); + PSESSION->dispatchLibinputEvents(); + } PSESSION->events.changeActive.emit(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aquamarine-0.15.0/src/backend/drm/DRM.cpp new/aquamarine-0.15.1/src/backend/drm/DRM.cpp --- old/aquamarine-0.15.0/src/backend/drm/DRM.cpp 2026-08-29 17:19:44.000000000 +0200 +++ new/aquamarine-0.15.1/src/backend/drm/DRM.cpp 2026-09-17 09:32:02.000000000 +0200 @@ -998,7 +998,7 @@ if (c->crtc != crtc) continue; - if (c->status != DRM_MODE_CONNECTED || c->tilingRedundant) + if (c->status != DRM_MODE_CONNECTED && !c->tilingRedundant) continue; backend->log(AQ_LOG_DEBUG, std::format("drm: slot {} crtc {} taken by {}, skipping", i, c->crtc->id, c->szName)); @@ -1073,7 +1073,7 @@ } for (auto const& c : connectors) { - if (c->status == DRM_MODE_CONNECTED) + if (c->status == DRM_MODE_CONNECTED || c->tilingRedundant) continue; if (c->crtc) @@ -2133,6 +2133,26 @@ backend->cancelAsyncOutput(output.get()); invalidateFrame(); + // normal output commits reject disconnected connectors, so disable KMS + // directly before releasing the output and its framebuffer references. + if (crtc && backend->backend->session && backend->backend->session->active && output->enabledState) { + const auto QUEUE_KEY = crtc->id; + if (backend->pauseCommitQueue(QUEUE_KEY)) { + CScopeGuard resume([this, QUEUE_KEY] { backend->resumeCommitQueue(QUEUE_KEY); }); + SDRMConnectorCommitData data = {}; + data.modeset = true; + data.blocking = true; + data.committed = COutputState::AQ_OUTPUT_STATE_ENABLED; + + if (backend->impl->commit(self.lock(), data)) { + output->enabledState = false; + backend->log(AQ_LOG_DEBUG, std::format("drm: Disabled KMS output {} before disconnect", szName)); + } else + backend->log(AQ_LOG_ERROR, std::format("drm: Failed to disable KMS output {} before disconnect", szName)); + } else + backend->log(AQ_LOG_ERROR, std::format("drm: Failed to pause commit queue for disconnect of {}", szName)); + } + status = DRM_MODE_DISCONNECTED; releaseFBReferences(); @@ -2954,7 +2974,7 @@ if (!frameIdle) { frameIdle = makeShared<std::function<void(void)>>([this, self_ = self, backend_ = backend]() { - if (!self) + if (!self_) return; connector->sched.setFrameScheduled(false); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aquamarine-0.15.0/src/backend/drm/Renderer.cpp new/aquamarine-0.15.1/src/backend/drm/Renderer.cpp --- old/aquamarine-0.15.0/src/backend/drm/Renderer.cpp 2026-08-29 17:19:44.000000000 +0200 +++ new/aquamarine-0.15.1/src/backend/drm/Renderer.cpp 2026-09-17 09:32:02.000000000 +0200 @@ -82,8 +82,7 @@ return prog; } -inline const std::string VERT_SRC = R"#( -#version 300 es +inline const std::string VERT_SRC = R"#(#version 300 es precision highp float; uniform mat3 proj; @@ -98,8 +97,7 @@ v_texcoord = texcoord; })#"; -inline const std::string FRAG_SRC = R"#( -#version 300 es +inline const std::string FRAG_SRC = R"#(#version 300 es precision highp float; in vec2 v_texcoord; @@ -111,8 +109,7 @@ fragColor = texture(tex, v_texcoord); })#"; -inline const std::string FRAG_SRC_EXT = R"#( -#version 300 es +inline const std::string FRAG_SRC_EXT = R"#(#version 300 es #extension GL_OES_EGL_image_external_essl3 : require precision highp float; @@ -388,7 +385,10 @@ if (egl.display && egl.context != EGL_NO_CONTEXT && egl.context != nullptr) eglDestroyContext(egl.display, egl.context); - if (egl.display) + // without EGL_KHR_display_reference, eglTerminate destroys a display that may be shared + // with other users of the same device in this process (e.g. the compositor's own EGL state), + // invalidating their contexts. Only terminate when reference tracking is in effect. + if (egl.display && exts.KHR_display_reference) eglTerminate(egl.display); eglReleaseThread(); ++++++ aquamarine.obsinfo ++++++ --- /var/tmp/diff_new_pack.1A1Lqn/_old 2026-09-24 23:02:10.156044782 +0200 +++ /var/tmp/diff_new_pack.1A1Lqn/_new 2026-09-24 23:02:10.159044907 +0200 @@ -1,5 +1,5 @@ name: aquamarine -version: 0.15.0 -mtime: 1788016784 -commit: 783bfd9ae441d1d0519b979ac68b73ddd6e81df0 +version: 0.15.1 +mtime: 1789630322 +commit: f31c47a1b9d300847d8fc3108ad959448103dfc1
