diff options
| author | Tom Englund <tomenglund26@gmail.com> | 2025-08-24 09:57:37 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-24 08:57:37 +0100 |
| commit | ced38b1b0f46f9fbdf9d37644d27bdbd2a29af1d (patch) | |
| tree | 1518e6ba2d2ad3803ae74be86f6921321cf7e305 /src | |
| parent | d9cf1cb78ef3dfd82f03965aab70792bbe25c9e2 (diff) | |
disable buffer readability checks on intel (#11515)
* dmabuf: disable buffer read check on intel
readability checks directly on buffer fds on some intel laptops is
broken, see https://gitlab.freedesktop.org/drm/intel/-/issues/9415
* sync: use rvalue ref in addwaiter doonreadable
use rvalue reference in addwaiter and doonreadable, because we store the
function in the SReadableWaiter a lot of the time, move it into place
there when that happends or let it go out of scope after function call.
Diffstat (limited to 'src')
| -rw-r--r-- | src/helpers/sync/SyncTimeline.cpp | 4 | ||||
| -rw-r--r-- | src/helpers/sync/SyncTimeline.hpp | 2 | ||||
| -rw-r--r-- | src/managers/eventLoop/EventLoopManager.cpp | 4 | ||||
| -rw-r--r-- | src/managers/eventLoop/EventLoopManager.hpp | 2 | ||||
| -rw-r--r-- | src/protocols/DRMSyncobj.cpp | 4 | ||||
| -rw-r--r-- | src/protocols/DRMSyncobj.hpp | 2 | ||||
| -rw-r--r-- | src/protocols/core/Compositor.cpp | 4 | ||||
| -rw-r--r-- | src/protocols/types/DMABuffer.cpp | 8 | ||||
| -rw-r--r-- | src/render/Renderer.cpp | 8 | ||||
| -rw-r--r-- | src/render/Renderer.hpp | 2 |
10 files changed, 27 insertions, 13 deletions
diff --git a/src/helpers/sync/SyncTimeline.cpp b/src/helpers/sync/SyncTimeline.cpp index 614a7c5b..9fe2e406 100644 --- a/src/helpers/sync/SyncTimeline.cpp +++ b/src/helpers/sync/SyncTimeline.cpp @@ -64,7 +64,7 @@ std::optional<bool> CSyncTimeline::check(uint64_t point, uint32_t flags) { return ret == 0; } -bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags) { +bool CSyncTimeline::addWaiter(std::function<void()>&& waiter, uint64_t point, uint32_t flags) { auto eventFd = CFileDescriptor(eventfd(0, EFD_CLOEXEC)); if (!eventFd.isValid()) { @@ -77,7 +77,7 @@ bool CSyncTimeline::addWaiter(const std::function<void()>& waiter, uint64_t poin return false; } - g_pEventLoopManager->doOnReadable(std::move(eventFd), waiter); + g_pEventLoopManager->doOnReadable(std::move(eventFd), std::move(waiter)); return true; } diff --git a/src/helpers/sync/SyncTimeline.hpp b/src/helpers/sync/SyncTimeline.hpp index 37d5b301..5b5aa224 100644 --- a/src/helpers/sync/SyncTimeline.hpp +++ b/src/helpers/sync/SyncTimeline.hpp @@ -25,7 +25,7 @@ class CSyncTimeline { // std::nullopt on fail std::optional<bool> check(uint64_t point, uint32_t flags); - bool addWaiter(const std::function<void()>& waiter, uint64_t point, uint32_t flags); + bool addWaiter(std::function<void()>&& waiter, uint64_t point, uint32_t flags); Hyprutils::OS::CFileDescriptor exportAsSyncFileFD(uint64_t src); bool importFromSyncFileFD(uint64_t dst, Hyprutils::OS::CFileDescriptor& fd); bool transfer(SP<CSyncTimeline> from, uint64_t fromPoint, uint64_t toPoint); diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 3297d31e..1426e424 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -193,13 +193,13 @@ void CEventLoopManager::doLater(const std::function<void()>& fn) { &m_idle); } -void CEventLoopManager::doOnReadable(CFileDescriptor fd, const std::function<void()>& fn) { +void CEventLoopManager::doOnReadable(CFileDescriptor fd, std::function<void()>&& fn) { if (!fd.isValid() || fd.isReadable()) { fn(); return; } - auto& waiter = m_readableWaiters.emplace_back(makeUnique<SReadableWaiter>(nullptr, std::move(fd), fn)); + auto& waiter = m_readableWaiters.emplace_back(makeUnique<SReadableWaiter>(nullptr, std::move(fd), std::move(fn))); waiter->source = wl_event_loop_add_fd(g_pEventLoopManager->m_wayland.loop, waiter->fd.get(), WL_EVENT_READABLE, ::handleWaiterFD, waiter.get()); } diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp index d3a67ae5..9963d4ae 100644 --- a/src/managers/eventLoop/EventLoopManager.hpp +++ b/src/managers/eventLoop/EventLoopManager.hpp @@ -63,7 +63,7 @@ class CEventLoopManager { // schedule function to when fd is readable (WL_EVENT_READABLE / POLLIN), // takes ownership of fd - void doOnReadable(Hyprutils::OS::CFileDescriptor fd, const std::function<void()>& fn); + void doOnReadable(Hyprutils::OS::CFileDescriptor fd, std::function<void()>&& fn); void onFdReadable(SReadableWaiter* waiter); private: diff --git a/src/protocols/DRMSyncobj.cpp b/src/protocols/DRMSyncobj.cpp index 2d232e28..bedec422 100644 --- a/src/protocols/DRMSyncobj.cpp +++ b/src/protocols/DRMSyncobj.cpp @@ -27,9 +27,9 @@ UP<CSyncReleaser> CDRMSyncPointState::createSyncRelease() { return makeUnique<CSyncReleaser>(m_timeline, m_point); } -bool CDRMSyncPointState::addWaiter(const std::function<void()>& waiter) { +bool CDRMSyncPointState::addWaiter(std::function<void()>&& waiter) { m_acquireCommitted = true; - return m_timeline->addWaiter(waiter, m_point, 0u); + return m_timeline->addWaiter(std::move(waiter), m_point, 0u); } bool CDRMSyncPointState::committed() { diff --git a/src/protocols/DRMSyncobj.hpp b/src/protocols/DRMSyncobj.hpp index b330818d..4fcbaf09 100644 --- a/src/protocols/DRMSyncobj.hpp +++ b/src/protocols/DRMSyncobj.hpp @@ -20,7 +20,7 @@ class CDRMSyncPointState { const uint64_t& point(); WP<CSyncTimeline> timeline(); Hyprutils::Memory::CUniquePointer<CSyncReleaser> createSyncRelease(); - bool addWaiter(const std::function<void()>& waiter); + bool addWaiter(std::function<void()>&& waiter); bool committed(); Hyprutils::OS::CFileDescriptor exportAsFD(); void signal(); diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp index 73326990..a859148f 100644 --- a/src/protocols/core/Compositor.cpp +++ b/src/protocols/core/Compositor.cpp @@ -161,7 +161,7 @@ CWLSurfaceResource::CWLSurfaceResource(SP<CWlSurface> resource_) : m_resource(re if (state->updated.bits.acquire) { // wait on acquire point for this surface, from explicit sync protocol - state->acquire.addWaiter(whenReadable); + state->acquire.addWaiter(std::move(whenReadable)); } else if (state->buffer->isSynchronous()) { // synchronous (shm) buffers can be read immediately whenReadable(); @@ -170,7 +170,7 @@ CWLSurfaceResource::CWLSurfaceResource(SP<CWlSurface> resource_) : m_resource(re auto syncFd = dc<CDMABuffer*>(state->buffer.m_buffer.get())->exportSyncFile(); if (syncFd.isValid()) - g_pEventLoopManager->doOnReadable(std::move(syncFd), whenReadable); + g_pEventLoopManager->doOnReadable(std::move(syncFd), std::move(whenReadable)); else whenReadable(); } else { diff --git a/src/protocols/types/DMABuffer.cpp b/src/protocols/types/DMABuffer.cpp index 1f6a1a6b..464008f4 100644 --- a/src/protocols/types/DMABuffer.cpp +++ b/src/protocols/types/DMABuffer.cpp @@ -118,8 +118,12 @@ CFileDescriptor CDMABuffer::exportSyncFile() { if (fd == -1) continue; - if (CFileDescriptor::isReadable(fd)) - continue; + // buffer readability checks are rather slow on some Intel laptops + // see https://gitlab.freedesktop.org/drm/intel/-/issues/9415 + if (g_pHyprRenderer && !g_pHyprRenderer->isIntel()) { + if (CFileDescriptor::isReadable(fd)) + continue; + } dma_buf_export_sync_file request{ .flags = DMA_BUF_SYNC_READ, diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 14bf5cac..beeb0f5a 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -67,6 +67,8 @@ CHyprRenderer::CHyprRenderer() { if (name.contains("nvidia")) m_nvidia = true; + else if (name.contains("i915")) + m_intel = true; Debug::log(LOG, "DRM driver information: {} v{}.{}.{} from {} description {}", name, DRMV->version_major, DRMV->version_minor, DRMV->version_patchlevel, std::string{DRMV->date, DRMV->date_len}, std::string{DRMV->desc, DRMV->desc_len}); @@ -85,6 +87,8 @@ CHyprRenderer::CHyprRenderer() { if (name.contains("nvidia")) m_nvidia = true; + else if (name.contains("i915")) + m_intel = true; Debug::log(LOG, "Primary DRM driver information: {} v{}.{}.{} from {} description {}", name, DRMV->version_major, DRMV->version_minor, DRMV->version_patchlevel, std::string{DRMV->date, DRMV->date_len}, std::string{DRMV->desc, DRMV->desc_len}); @@ -2287,6 +2291,10 @@ bool CHyprRenderer::isNvidia() { return m_nvidia; } +bool CHyprRenderer::isIntel() { + return m_intel; +} + bool CHyprRenderer::isMgpu() { return m_mgpu; } diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 1e184174..a986b63b 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -74,6 +74,7 @@ class CHyprRenderer { void onRenderbufferDestroy(CRenderbuffer* rb); SP<CRenderbuffer> getCurrentRBO(); bool isNvidia(); + bool isIntel(); bool isMgpu(); void makeEGLCurrent(); void unsetEGL(); @@ -141,6 +142,7 @@ class CHyprRenderer { SP<Aquamarine::IBuffer> m_currentBuffer = nullptr; eRenderMode m_renderMode = RENDER_MODE_NORMAL; bool m_nvidia = false; + bool m_intel = false; bool m_mgpu = false; struct { |
