mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-07 21:46:00 +01:00
ciorba
This commit is contained in:
parent
8f2d1a5e69
commit
44f75ee329
3 changed files with 27 additions and 21 deletions
|
@ -190,18 +190,12 @@ void CFrameSchedulingManager::onPresent(CMonitor* pMonitor, wlr_output_event_pre
|
||||||
} else
|
} else
|
||||||
µsUntilVblank = std::chrono::duration_cast<std::chrono::microseconds>(DATA->nextVblank - std::chrono::system_clock::now()).count();
|
µsUntilVblank = std::chrono::duration_cast<std::chrono::microseconds>(DATA->nextVblank - std::chrono::system_clock::now()).count();
|
||||||
|
|
||||||
if (µsUntilVblank > 100)
|
if (µsUntilVblank > 500)
|
||||||
DATA->vblankTimer->updateTimeout(std::chrono::microseconds(µsUntilVblank / 2));
|
DATA->vblankTimer->updateTimeout(std::chrono::microseconds(µsUntilVblank - 500));
|
||||||
|
|
||||||
Debug::log(LOG, "until vblank {}µs", µsUntilVblank);
|
Debug::log(LOG, "until vblank {}µs", µsUntilVblank);
|
||||||
|
|
||||||
renderMonitor(DATA);
|
renderMonitor(DATA);
|
||||||
|
|
||||||
#ifndef GLES2
|
|
||||||
g_pHyprRenderer->makeEGLCurrent();
|
|
||||||
|
|
||||||
DATA->fenceSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CFrameSchedulingManager::SSchedulingData* CFrameSchedulingManager::dataFor(CMonitor* pMonitor) {
|
CFrameSchedulingManager::SSchedulingData* CFrameSchedulingManager::dataFor(CMonitor* pMonitor) {
|
||||||
|
@ -254,7 +248,7 @@ void CFrameSchedulingManager::renderMonitor(SSchedulingData* data) {
|
||||||
pMonitor->tearingState.frameScheduledWhileBusy = false;
|
pMonitor->tearingState.frameScheduledWhileBusy = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_pHyprRenderer->renderMonitor(pMonitor);
|
data->fenceSync = g_pHyprRenderer->renderMonitor(pMonitor, !data->legacyScheduler);
|
||||||
data->rendered = true;
|
data->rendered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,6 +257,8 @@ void CFrameSchedulingManager::onVblankTimer(void* data) {
|
||||||
|
|
||||||
#ifndef GLES2
|
#ifndef GLES2
|
||||||
|
|
||||||
|
g_pHyprRenderer->makeEGLCurrent();
|
||||||
|
|
||||||
GLint syncStatus = 0;
|
GLint syncStatus = 0;
|
||||||
glGetSynciv(DATA->fenceSync, GL_SYNC_STATUS, sizeof(GLint), nullptr, &syncStatus);
|
glGetSynciv(DATA->fenceSync, GL_SYNC_STATUS, sizeof(GLint), nullptr, &syncStatus);
|
||||||
bool GPUSignaled = syncStatus == GL_SIGNALED;
|
bool GPUSignaled = syncStatus == GL_SIGNALED;
|
||||||
|
|
|
@ -1062,7 +1062,7 @@ bool CHyprRenderer::attemptDirectScanout(CMonitor* pMonitor) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
GLsync CHyprRenderer::renderMonitor(CMonitor* pMonitor, bool withSync) {
|
||||||
|
|
||||||
static std::chrono::high_resolution_clock::time_point renderStart = std::chrono::high_resolution_clock::now();
|
static std::chrono::high_resolution_clock::time_point renderStart = std::chrono::high_resolution_clock::now();
|
||||||
static std::chrono::high_resolution_clock::time_point renderStartOverlay = std::chrono::high_resolution_clock::now();
|
static std::chrono::high_resolution_clock::time_point renderStartOverlay = std::chrono::high_resolution_clock::now();
|
||||||
|
@ -1122,7 +1122,7 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
if (pMonitor->framesToSkip > 10)
|
if (pMonitor->framesToSkip > 10)
|
||||||
pMonitor->framesToSkip = 0;
|
pMonitor->framesToSkip = 0;
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// checks //
|
// checks //
|
||||||
|
@ -1150,7 +1150,7 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
if (!wlr_gamma_control_v1_apply(PGAMMACTRL, pMonitor->state.wlr())) {
|
if (!wlr_gamma_control_v1_apply(PGAMMACTRL, pMonitor->state.wlr())) {
|
||||||
Debug::log(ERR, "Could not apply gamma control to {}", pMonitor->szName);
|
Debug::log(ERR, "Could not apply gamma control to {}", pMonitor->szName);
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wlr_output_test_state(pMonitor->output, pMonitor->state.wlr())) {
|
if (!wlr_output_test_state(pMonitor->output, pMonitor->state.wlr())) {
|
||||||
|
@ -1168,17 +1168,17 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
if (!*PTEARINGENABLED) {
|
if (!*PTEARINGENABLED) {
|
||||||
Debug::log(WARN, "Tearing commit requested but the master switch general:allow_tearing is off, ignoring");
|
Debug::log(WARN, "Tearing commit requested but the master switch general:allow_tearing is off, ignoring");
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_pHyprOpenGL->m_RenderData.mouseZoomFactor != 1.0) {
|
if (g_pHyprOpenGL->m_RenderData.mouseZoomFactor != 1.0) {
|
||||||
Debug::log(WARN, "Tearing commit requested but scale factor is not 1, ignoring");
|
Debug::log(WARN, "Tearing commit requested but scale factor is not 1, ignoring");
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pMonitor->tearingState.canTear) {
|
if (!pMonitor->tearingState.canTear) {
|
||||||
Debug::log(WARN, "Tearing commit requested but monitor doesn't support it, ignoring");
|
Debug::log(WARN, "Tearing commit requested but monitor doesn't support it, ignoring");
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMonitor->solitaryClient)
|
if (pMonitor->solitaryClient)
|
||||||
|
@ -1187,7 +1187,7 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
if (!*PNODIRECTSCANOUT && !shouldTear) {
|
if (!*PNODIRECTSCANOUT && !shouldTear) {
|
||||||
if (attemptDirectScanout(pMonitor)) {
|
if (attemptDirectScanout(pMonitor)) {
|
||||||
return;
|
return nullptr;
|
||||||
} else if (m_pLastScanout) {
|
} else if (m_pLastScanout) {
|
||||||
Debug::log(LOG, "Left a direct scanout.");
|
Debug::log(LOG, "Left a direct scanout.");
|
||||||
m_pLastScanout = nullptr;
|
m_pLastScanout = nullptr;
|
||||||
|
@ -1208,11 +1208,11 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
bool hasChanged = pMonitor->output->needs_frame || pixman_region32_not_empty(&pMonitor->damage.current);
|
bool hasChanged = pMonitor->output->needs_frame || pixman_region32_not_empty(&pMonitor->damage.current);
|
||||||
|
|
||||||
if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && pMonitor->forceFullFrames == 0 && damageBlinkCleanup == 0)
|
if (!hasChanged && *PDAMAGETRACKINGMODE != DAMAGE_TRACKING_NONE && pMonitor->forceFullFrames == 0 && damageBlinkCleanup == 0)
|
||||||
return;
|
return nullptr;
|
||||||
|
|
||||||
if (*PDAMAGETRACKINGMODE == -1) {
|
if (*PDAMAGETRACKINGMODE == -1) {
|
||||||
Debug::log(CRIT, "Damage tracking mode -1 ????");
|
Debug::log(CRIT, "Damage tracking mode -1 ????");
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
EMIT_HOOK_EVENT("render", RENDER_PRE);
|
EMIT_HOOK_EVENT("render", RENDER_PRE);
|
||||||
|
@ -1252,7 +1252,7 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
pMonitor->state.clear();
|
pMonitor->state.clear();
|
||||||
|
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we have no tracking or full tracking, invalidate the entire monitor
|
// if we have no tracking or full tracking, invalidate the entire monitor
|
||||||
|
@ -1352,6 +1352,10 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
EMIT_HOOK_EVENT("render", RENDER_LAST_MOMENT);
|
EMIT_HOOK_EVENT("render", RENDER_LAST_MOMENT);
|
||||||
|
|
||||||
|
GLsync sync = nullptr;
|
||||||
|
if (withSync)
|
||||||
|
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||||
|
|
||||||
endRender();
|
endRender();
|
||||||
|
|
||||||
TRACY_GPU_COLLECT;
|
TRACY_GPU_COLLECT;
|
||||||
|
@ -1384,7 +1388,7 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
|
|
||||||
wlr_damage_ring_add_whole(&pMonitor->damage);
|
wlr_damage_ring_add_whole(&pMonitor->damage);
|
||||||
|
|
||||||
return;
|
return sync;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldTear)
|
if (shouldTear)
|
||||||
|
@ -1409,6 +1413,8 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
g_pDebugOverlay->renderDataNoOverlay(pMonitor, µs);
|
g_pDebugOverlay->renderDataNoOverlay(pMonitor, µs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return sync;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprRenderer::renderWorkspace(CMonitor* pMonitor, PHLWORKSPACE pWorkspace, timespec* now, const CBox& geometry) {
|
void CHyprRenderer::renderWorkspace(CMonitor* pMonitor, PHLWORKSPACE pWorkspace, timespec* now, const CBox& geometry) {
|
||||||
|
|
|
@ -38,11 +38,15 @@ class CToplevelExportProtocolManager;
|
||||||
class CInputManager;
|
class CInputManager;
|
||||||
struct SSessionLockSurface;
|
struct SSessionLockSurface;
|
||||||
|
|
||||||
|
#ifdef GLES2
|
||||||
|
#define GLsync void*
|
||||||
|
#endif
|
||||||
|
|
||||||
class CHyprRenderer {
|
class CHyprRenderer {
|
||||||
public:
|
public:
|
||||||
CHyprRenderer();
|
CHyprRenderer();
|
||||||
|
|
||||||
void renderMonitor(CMonitor* pMonitor);
|
GLsync renderMonitor(CMonitor* pMonitor, bool withSync = false);
|
||||||
void outputMgrApplyTest(wlr_output_configuration_v1*, bool);
|
void outputMgrApplyTest(wlr_output_configuration_v1*, bool);
|
||||||
void arrangeLayersForMonitor(const int&);
|
void arrangeLayersForMonitor(const int&);
|
||||||
void damageSurface(wlr_surface*, double, double, double scale = 1.0);
|
void damageSurface(wlr_surface*, double, double, double scale = 1.0);
|
||||||
|
|
Loading…
Reference in a new issue