Skip to content

Commit a31912a

Browse files
committed
add renderingDoneCallback and use it in screencopy
1 parent 7272742 commit a31912a

File tree

5 files changed

+11
-21
lines changed

5 files changed

+11
-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: 8 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
static auto PNVIDIAANTIFLICKER = CConfigValue<Hyprlang::INT>("opengl:nvidia_anti_flicker");
22452245

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

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

22872291
if (m_eRenderMode == RENDER_MODE_NORMAL) {
@@ -2296,6 +2300,8 @@ void CHyprRenderer::endRender() {
22962300
glFinish();
22972301

22982302
usedAsyncBuffers.clear(); // release all buffer refs and hope implicit sync works
2303+
if (renderingDoneCallback)
2304+
renderingDoneCallback();
22992305
}
23002306
}
23012307

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)