summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp70
1 files changed, 28 insertions, 42 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 0db305af..93d3620f 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -1,7 +1,6 @@
#include "Renderer.hpp"
#include "../Compositor.hpp"
#include "../helpers/math/Math.hpp"
-#include "../helpers/sync/SyncReleaser.hpp"
#include <algorithm>
#include <aquamarine/output/Output.hpp>
#include <filesystem>
@@ -1571,25 +1570,6 @@ bool CHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
}
}
- auto explicitOptions = getExplicitSyncSettings(pMonitor->output);
- if (!explicitOptions.explicitEnabled)
- return ok;
-
- Debug::log(TRACE, "Explicit: {} presented", explicitPresented.size());
-
- if (!pMonitor->eglSync)
- Debug::log(TRACE, "Explicit: can't add sync, monitor has no EGLSync");
- else {
- for (auto const& e : explicitPresented) {
- if (!e->current.buffer || !e->current.buffer->syncReleaser)
- continue;
-
- e->current.buffer->syncReleaser->addReleaseSync(pMonitor->eglSync);
- }
- }
-
- explicitPresented.clear();
-
return ok;
}
@@ -2275,7 +2255,7 @@ bool CHyprRenderer::beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMod
return true;
}
-void CHyprRenderer::endRender() {
+void CHyprRenderer::endRender(const std::function<void()>& renderingDoneCallback) {
const auto PMONITOR = g_pHyprOpenGL->m_RenderData.pMonitor;
static auto PNVIDIAANTIFLICKER = CConfigValue<Hyprlang::INT>("opengl:nvidia_anti_flicker");
@@ -2296,42 +2276,48 @@ void CHyprRenderer::endRender() {
g_pHyprOpenGL->m_RenderData.mouseZoomUseMouse = true;
}
+ // send all queued opengl commands so rendering starts happening immediately
+ glFlush();
+
if (m_eRenderMode == RENDER_MODE_FULL_FAKE)
return;
if (m_eRenderMode == RENDER_MODE_NORMAL)
PMONITOR->output->state->setBuffer(m_pCurrentBuffer);
- auto explicitOptions = getExplicitSyncSettings(PMONITOR->output);
-
- if (PMONITOR->inTimeline && explicitOptions.explicitEnabled) {
- PMONITOR->eglSync = g_pHyprOpenGL->createEGLSync();
- if (!PMONITOR->eglSync) {
- Debug::log(ERR, "renderer: couldn't create an EGLSync for out in endRender");
- return;
+ UP<CEGLSync> eglSync = CEGLSync::create();
+ if (eglSync && eglSync->isValid()) {
+ for (auto const& buf : usedAsyncBuffers) {
+ for (const auto& releaser : buf->syncReleasers) {
+ releaser->addSyncFileFd(eglSync->fd());
+ }
}
- PMONITOR->inTimelinePoint++;
- bool ok = PMONITOR->inTimeline->importFromSyncFileFD(PMONITOR->inTimelinePoint, PMONITOR->eglSync->fd());
- if (!ok) {
- Debug::log(ERR, "renderer: couldn't import from sync file fd in endRender");
- return;
- }
+ // release buffer refs with release points now, since syncReleaser handles actual buffer release based on EGLSync
+ std::erase_if(usedAsyncBuffers, [](const auto& buf) { return !buf->syncReleasers.empty(); });
- if (m_eRenderMode == RENDER_MODE_NORMAL && explicitOptions.explicitKMSEnabled) {
- PMONITOR->inFence = CFileDescriptor{PMONITOR->inTimeline->exportAsSyncFileFD(PMONITOR->inTimelinePoint)};
- if (!PMONITOR->inFence.isValid()) {
- Debug::log(ERR, "renderer: couldn't export from sync timeline in endRender");
- return;
- }
+ // release buffer refs without release points when EGLSync sync_file/fence is signalled
+ g_pEventLoopManager->doOnReadable(eglSync->fd().duplicate(), [renderingDoneCallback, prevbfs = std::move(usedAsyncBuffers)]() mutable {
+ prevbfs.clear();
+ if (renderingDoneCallback)
+ renderingDoneCallback();
+ });
+ usedAsyncBuffers.clear();
+ if (m_eRenderMode == RENDER_MODE_NORMAL) {
+ PMONITOR->inFence = eglSync->takeFd();
PMONITOR->output->state->setExplicitInFence(PMONITOR->inFence.get());
}
} else {
+ Debug::log(ERR, "renderer: couldn't use EGLSync for explicit gpu synchronization");
+
+ // nvidia doesn't have implicit sync, so we have to explicitly wait here
if (isNvidia() && *PNVIDIAANTIFLICKER)
glFinish();
- else
- glFlush();
+
+ usedAsyncBuffers.clear(); // release all buffer refs and hope implicit sync works
+ if (renderingDoneCallback)
+ renderingDoneCallback();
}
}