Skip to content

Commit 1e92f15

Browse files
committed
add renderingDoneCallback and use it in screencopy
1 parent f9dc208 commit 1e92f15

File tree

5 files changed

+13
-23
lines changed

5 files changed

+13
-23
lines changed

src/helpers/Monitor.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,6 @@ void CMonitor::onConnect(bool noRule) {
6060

6161
g_pEventLoopManager->doLater([] { g_pConfigManager->ensurePersistentWorkspacesPresent(); });
6262

63-
if (output->supportsExplicit) {
64-
inTimeline = CSyncTimeline::create(output->getBackend()->drmFD());
65-
}
66-
6763
listeners.frame = output->events.frame.registerListener([this](std::any d) { onMonitorFrame(); });
6864
listeners.commit = output->events.commit.registerListener([this](std::any d) {
6965
if (true) { // FIXME: E->state->committed & WLR_OUTPUT_STATE_BUFFER

src/helpers/Monitor.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,7 @@ class CMonitor {
139139
SMonitorRule activeMonitorRule;
140140

141141
// explicit sync
142-
SP<CSyncTimeline> inTimeline;
143142
Hyprutils::OS::CFileDescriptor inFence; // TODO: remove when aq uses CFileDescriptor
144-
uint64_t inTimelinePoint = 0;
145143

146144
PHLMONITORREF self;
147145

src/protocols/Screencopy.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -229,21 +229,11 @@ void CScreencopyFrame::copyDmabuf(std::function<void(bool)> callback) {
229229
}
230230

231231
g_pHyprOpenGL->m_RenderData.blockScreenShader = true;
232-
g_pHyprRenderer->endRender();
233232

234-
auto explicitOptions = g_pHyprRenderer->getExplicitSyncSettings(pMonitor->output);
235-
if (pMonitor->inTimeline && explicitOptions.explicitEnabled) {
236-
if (pMonitor->inTimeline->addWaiter(
237-
[callback, sync = pMonitor->eglSync]() {
238-
LOGM(TRACE, "Copied frame via dma with explicit sync");
239-
callback(true);
240-
},
241-
pMonitor->inTimelinePoint, 0))
242-
return;
243-
// on explicit sync failure, fallthrough to immediate callback
244-
}
245-
LOGM(TRACE, "Copied frame via dma");
246-
callback(true);
233+
g_pHyprRenderer->endRender([callback]() {
234+
LOGM(TRACE, "Copied frame via dma");
235+
callback(true);
236+
});
247237
}
248238

249239
bool CScreencopyFrame::copyShm() {

src/render/Renderer.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2237,7 +2237,7 @@ bool CHyprRenderer::beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMod
22372237
return true;
22382238
}
22392239

2240-
void CHyprRenderer::endRender() {
2240+
void CHyprRenderer::endRender(const std::function<void()>& renderingDoneCallback) {
22412241
const auto PMONITOR = g_pHyprOpenGL->m_RenderData.pMonitor;
22422242
static auto PNVIDIAANTIFLICKER = CConfigValue<Hyprlang::INT>("opengl:nvidia_anti_flicker");
22432243

@@ -2279,7 +2279,11 @@ void CHyprRenderer::endRender() {
22792279
std::erase_if(usedAsyncBuffers, [](const auto& buf) { return !buf->syncReleasers.empty(); });
22802280

22812281
// release buffer refs without release points when EGLSync sync_file/fence is signalled
2282-
g_pEventLoopManager->doOnReadable(eglSync.fd().duplicate(), [prevbfs = std::move(usedAsyncBuffers)]() mutable { prevbfs.clear(); });
2282+
g_pEventLoopManager->doOnReadable(eglSync.fd().duplicate(), [renderingDoneCallback, prevbfs = std::move(usedAsyncBuffers)]() mutable {
2283+
prevbfs.clear();
2284+
if (renderingDoneCallback)
2285+
renderingDoneCallback();
2286+
});
22832287
usedAsyncBuffers.clear();
22842288

22852289
if (m_eRenderMode == RENDER_MODE_NORMAL) {
@@ -2294,6 +2298,8 @@ void CHyprRenderer::endRender() {
22942298
glFinish();
22952299

22962300
usedAsyncBuffers.clear(); // release all buffer refs and hope implicit sync works
2301+
if (renderingDoneCallback)
2302+
renderingDoneCallback();
22972303
}
22982304
}
22992305

src/render/Renderer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class CHyprRenderer {
8787
// if RENDER_MODE_NORMAL, provided damage will be written to.
8888
// otherwise, it will be the one used.
8989
bool beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMode mode = RENDER_MODE_NORMAL, SP<IHLBuffer> buffer = {}, CFramebuffer* fb = nullptr, bool simple = false);
90-
void endRender();
90+
void endRender(const std::function<void()>& renderingDoneCallback = {});
9191

9292
bool m_bBlockSurfaceFeedback = false;
9393
bool m_bRenderingSnapshot = false;

0 commit comments

Comments
 (0)