Skip to content

Commit d7f7552

Browse files
committed
add renderingDoneCallback and use it in screencopy
1 parent e216468 commit d7f7552

File tree

5 files changed

+12
-21
lines changed

5 files changed

+12
-21
lines changed

src/helpers/Monitor.cpp

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

5656
g_pEventLoopManager->doLater([] { g_pConfigManager->ensurePersistentWorkspacesPresent(); });
5757

58-
if (output->supportsExplicit) {
59-
inTimeline = CSyncTimeline::create(output->getBackend()->drmFD());
60-
}
61-
6258
listeners.frame = output->events.frame.registerListener([this](std::any d) { onMonitorFrame(); });
6359
listeners.commit = output->events.commit.registerListener([this](std::any d) {
6460
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: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -216,20 +216,10 @@ void CScreencopyFrame::copyDmabuf(std::function<void(bool)> callback) {
216216
g_pHyprOpenGL->setMonitorTransformEnabled(false);
217217

218218
g_pHyprOpenGL->m_RenderData.blockScreenShader = true;
219-
g_pHyprRenderer->endRender();
220-
221-
auto explicitOptions = g_pHyprRenderer->getExplicitSyncSettings(pMonitor->output);
222-
if (pMonitor->inTimeline && explicitOptions.explicitEnabled) {
223-
pMonitor->inTimeline->addWaiter(
224-
[callback]() {
225-
LOGM(TRACE, "Copied frame via dma with explicit sync");
226-
callback(true);
227-
},
228-
pMonitor->inTimelinePoint, 0);
229-
} else {
219+
g_pHyprRenderer->endRender([callback]() {
230220
LOGM(TRACE, "Copied frame via dma");
231221
callback(true);
232-
}
222+
});
233223
}
234224

235225
bool CScreencopyFrame::copyShm() {

src/render/Renderer.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2239,7 +2239,7 @@ bool CHyprRenderer::beginRender(PHLMONITOR pMonitor, CRegion& damage, eRenderMod
22392239
return true;
22402240
}
22412241

2242-
void CHyprRenderer::endRender() {
2242+
void CHyprRenderer::endRender(const std::function<void()>& renderingDoneCallback) {
22432243
const auto PMONITOR = g_pHyprOpenGL->m_RenderData.pMonitor;
22442244

22452245
g_pHyprOpenGL->m_RenderData.damage = m_sRenderPass.render(g_pHyprOpenGL->m_RenderData.damage);
@@ -2278,7 +2278,11 @@ void CHyprRenderer::endRender() {
22782278

22792279
// release all CHLBufferRefernce when EGLSync sync_file/fence is signalled,
22802280
// meaning that when opengl rendering is done we can send release for all used buffers
2281-
g_pEventLoopManager->doOnReadable(eglSync.fd().duplicate(), [prevbfs = std::move(usedAsyncBuffers)]() mutable { prevbfs.clear(); });
2281+
g_pEventLoopManager->doOnReadable(eglSync.fd().duplicate(), [renderingDoneCallback, prevbfs = std::move(usedAsyncBuffers)]() mutable {
2282+
if (renderingDoneCallback)
2283+
renderingDoneCallback();
2284+
prevbfs.clear();
2285+
});
22822286
usedAsyncBuffers.clear();
22832287

22842288
if (m_eRenderMode == RENDER_MODE_NORMAL) {
@@ -2292,6 +2296,9 @@ void CHyprRenderer::endRender() {
22922296
// plus we can only release buffers if we know rendering from them is done
22932297
glFinish();
22942298
usedAsyncBuffers.clear();
2299+
2300+
if (renderingDoneCallback)
2301+
renderingDoneCallback();
22952302
}
22962303
}
22972304

src/render/Renderer.hpp

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

9191
bool m_bBlockSurfaceFeedback = false;
9292
bool m_bRenderingSnapshot = false;

0 commit comments

Comments
 (0)