summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Englund <tomenglund26@gmail.com>2025-08-24 09:57:37 +0200
committerGitHub <noreply@github.com>2025-08-24 08:57:37 +0100
commitced38b1b0f46f9fbdf9d37644d27bdbd2a29af1d (patch)
tree1518e6ba2d2ad3803ae74be86f6921321cf7e305 /src
parentd9cf1cb78ef3dfd82f03965aab70792bbe25c9e2 (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.cpp4
-rw-r--r--src/helpers/sync/SyncTimeline.hpp2
-rw-r--r--src/managers/eventLoop/EventLoopManager.cpp4
-rw-r--r--src/managers/eventLoop/EventLoopManager.hpp2
-rw-r--r--src/protocols/DRMSyncobj.cpp4
-rw-r--r--src/protocols/DRMSyncobj.hpp2
-rw-r--r--src/protocols/core/Compositor.cpp4
-rw-r--r--src/protocols/types/DMABuffer.cpp8
-rw-r--r--src/render/Renderer.cpp8
-rw-r--r--src/render/Renderer.hpp2
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 {