summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-07-19 12:38:41 +0200
committerGitHub <noreply@github.com>2025-07-19 12:38:41 +0200
commitd84699d8e5e984422da37595ee41fc0d8d93fef5 (patch)
treeb3ed5c1f47d25e961c53c823ead9d0000141a138 /src/render/Renderer.cpp
parentae3cc48f223386b057137400354ed0ca1f7a8b1a (diff)
opengl: detect android fence support and disable explicit if it's missing (#11077)
Checks for explicit sync support via the android fences, and falls back to implicit sync if it isn't
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index e9797fbe..13f8ff4d 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -2326,6 +2326,22 @@ void CHyprRenderer::endRender(const std::function<void()>& renderingDoneCallback
if (m_renderMode == RENDER_MODE_NORMAL)
PMONITOR->m_output->state->setBuffer(m_currentBuffer);
+ if (!g_pHyprOpenGL->explicitSyncSupported()) {
+ Debug::log(TRACE, "renderer: Explicit sync unsupported, falling back to implicit in endRender");
+
+ // nvidia doesn't have implicit sync, so we have to explicitly wait here
+ if (isNvidia() && *PNVIDIAANTIFLICKER)
+ glFinish();
+ else
+ glFlush(); // mark an implicit sync point
+
+ m_usedAsyncBuffers.clear(); // release all buffer refs and hope implicit sync works
+ if (renderingDoneCallback)
+ renderingDoneCallback();
+
+ return;
+ }
+
UP<CEGLSync> eglSync = CEGLSync::create();
if (eglSync && eglSync->isValid()) {
for (auto const& buf : m_usedAsyncBuffers) {
@@ -2350,11 +2366,7 @@ void CHyprRenderer::endRender(const std::function<void()>& renderingDoneCallback
PMONITOR->m_output->state->setExplicitInFence(PMONITOR->m_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();
+ Debug::log(ERR, "renderer: Explicit sync failed, releasing resources");
m_usedAsyncBuffers.clear(); // release all buffer refs and hope implicit sync works
if (renderingDoneCallback)