Skip to content

Commit

Permalink
renderer: reduce scope of variables and refactor
Browse files Browse the repository at this point in the history
move a few variables down in their scopes to reduce the amount of calls
and copies when not needed, also add one more for loop in
renderWorkspaceWindows and store the windows in a vector with
weakpointers that should be rendered, this adds a loop but reduces the
amount of repeated calls to shouldRenderWindow and also makes the rest
of the loops go over way smaller vector when many windows exist.
  • Loading branch information
gulafaran committed Oct 30, 2024
1 parent 12a9019 commit 0277dbb
Showing 1 changed file with 29 additions and 26 deletions.
55 changes: 29 additions & 26 deletions src/render/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,7 @@ static void renderSurface(SP<CWLSurfaceResource> surface, int x, int y, void* da
if (!surface->current.texture)
return;

const auto& TEXTURE = surface->current.texture;
const auto RDATA = (SRenderData*)data;
const auto INTERACTIVERESIZEINPROGRESS = RDATA->pWindow && g_pInputManager->currentlyDraggedWindow && g_pInputManager->dragMode == MBIND_RESIZE;
const auto& TEXTURE = surface->current.texture;

// this is bad, probably has been logged elsewhere. Means the texture failed
// uploading to the GPU.
Expand All @@ -175,6 +173,8 @@ static void renderSurface(SP<CWLSurfaceResource> surface, int x, int y, void* da
}
}

const auto RDATA = (SRenderData*)data;
const auto INTERACTIVERESIZEINPROGRESS = RDATA->pWindow && g_pInputManager->currentlyDraggedWindow && g_pInputManager->dragMode == MBIND_RESIZE;
TRACY_GPU_ZONE("RenderSurface");

double outputX = -RDATA->pMonitor->vecPosition.x, outputY = -RDATA->pMonitor->vecPosition.y;
Expand Down Expand Up @@ -484,36 +484,43 @@ void CHyprRenderer::renderWorkspaceWindows(PHLMONITOR pMonitor, PHLWORKSPACE pWo

EMIT_HOOK_EVENT("render", RENDER_PRE_WINDOWS);

// Non-floating main
std::vector<PHLWINDOWREF> windows;
windows.reserve(g_pCompositor->m_vWindows.size());

for (auto const& w : g_pCompositor->m_vWindows) {
if (w->isHidden() || (!w->m_bIsMapped && !w->m_bFadingOut))
continue;

if (w->m_bIsFloating)
continue; // floating are in the second pass

if (!shouldRenderWindow(w, pMonitor))
continue;

windows.push_back(w);
}

// Non-floating main
for (auto& w : windows) {
if (w->m_bIsFloating)
continue; // floating are in the second pass

if (pWorkspace->m_bIsSpecialWorkspace != w->onSpecialWorkspace())
continue;

// render active window after all others of this pass
if (w == g_pCompositor->m_pLastWindow) {
lastWindow = w;
lastWindow = w.lock();
continue;
}

// render the bad boy
renderWindow(w, pMonitor, time, true, RENDER_PASS_MAIN);
renderWindow(w.lock(), pMonitor, time, true, RENDER_PASS_MAIN);
}

if (lastWindow)
renderWindow(lastWindow, pMonitor, time, true, RENDER_PASS_MAIN);

// Non-floating popup
for (auto const& w : g_pCompositor->m_vWindows) {
if (w->isHidden() || (!w->m_bIsMapped && !w->m_bFadingOut))
for (auto& w : windows) {
if (!w)
continue;

if (w->m_bIsFloating)
Expand All @@ -522,32 +529,27 @@ void CHyprRenderer::renderWorkspaceWindows(PHLMONITOR pMonitor, PHLWORKSPACE pWo
if (pWorkspace->m_bIsSpecialWorkspace != w->onSpecialWorkspace())
continue;

if (!shouldRenderWindow(w, pMonitor))
continue;

// render the bad boy
renderWindow(w, pMonitor, time, true, RENDER_PASS_POPUP);
renderWindow(w.lock(), pMonitor, time, true, RENDER_PASS_POPUP);
w.reset();
}

// floating on top
for (auto const& w : g_pCompositor->m_vWindows) {
if (w->isHidden() || (!w->m_bIsMapped && !w->m_bFadingOut))
for (auto& w : windows) {
if (!w)
continue;

if (!w->m_bIsFloating || w->m_bPinned)
continue;

if (!shouldRenderWindow(w, pMonitor))
continue;

if (pWorkspace->m_bIsSpecialWorkspace != w->onSpecialWorkspace())
continue;

if (pWorkspace->m_bIsSpecialWorkspace && w->m_pMonitor != pWorkspace->m_pMonitor)
continue; // special on another are rendered as a part of the base pass

// render the bad boy
renderWindow(w, pMonitor, time, true, RENDER_PASS_ALL);
renderWindow(w.lock(), pMonitor, time, true, RENDER_PASS_ALL);
}
}

Expand Down Expand Up @@ -1093,8 +1095,8 @@ void CHyprRenderer::calculateUVForSurface(PHLWINDOW pWindow, SP<CWLSurfaceResour

if (pSurface->current.viewport.hasSource) {
// we stretch it to dest. if no dest, to 1,1
Vector2D bufferSize = pSurface->current.bufferSize;
auto bufferSource = pSurface->current.viewport.source;
Vector2D const& bufferSize = pSurface->current.bufferSize;
auto const& bufferSource = pSurface->current.viewport.source;

// calculate UV for the basic src_box. Assume dest == size. Scale to dest later
uvTL = Vector2D(bufferSource.x / bufferSize.x, bufferSource.y / bufferSize.y);
Expand Down Expand Up @@ -1904,10 +1906,11 @@ void CHyprRenderer::damageBox(CBox* pBox, bool skipFrameSchedule) {
if (m->isMirror())
continue; // don't damage mirrors traditionally

CBox damageBox = {pBox->x - m->vecPosition.x, pBox->y - m->vecPosition.y, pBox->width, pBox->height};
damageBox.scale(m->scale);
if (!skipFrameSchedule)
if (!skipFrameSchedule) {
CBox damageBox = {pBox->x - m->vecPosition.x, pBox->y - m->vecPosition.y, pBox->width, pBox->height};
damageBox.scale(m->scale);
m->addDamage(&damageBox);
}
}

static auto PLOGDAMAGE = CConfigValue<Hyprlang::INT>("debug:log_damage");
Expand Down

0 comments on commit 0277dbb

Please sign in to comment.