diff options
| author | UjinT34 <41110182+UjinT34@users.noreply.github.com> | 2026-03-07 16:47:13 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-07 13:47:13 +0000 |
| commit | 73fca55e7c9dd19222c8c0cc331ddebf4c4bfddf (patch) | |
| tree | 58d0905be7e4f854ab5c8daf869b0bef210d99f1 /src/render/OpenGL.cpp | |
| parent | 966f20d305345b3042dc1d37a1dd8833f3a4783b (diff) | |
renderer: move m_renderData to renderer (#13474)
Diffstat (limited to 'src/render/OpenGL.cpp')
| -rw-r--r-- | src/render/OpenGL.cpp | 680 |
1 files changed, 354 insertions, 326 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 0a54613c..f9cb83ac 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -641,7 +641,7 @@ EGLImageKHR CHyprOpenGLImpl::createEGLImage(const Aquamarine::SDMABUFAttrs& attr } void CHyprOpenGLImpl::beginSimple(PHLMONITOR pMonitor, const CRegion& damage, SP<IRenderbuffer> rb, SP<IFramebuffer> fb) { - m_renderData.pMonitor = pMonitor; + g_pHyprRenderer->m_renderData.pMonitor = pMonitor; const GLenum RESETSTATUS = glGetGraphicsResetStatus(); if (RESETSTATUS != GL_NO_ERROR) { @@ -662,29 +662,29 @@ void CHyprOpenGLImpl::beginSimple(PHLMONITOR pMonitor, const CRegion& damage, SP setViewport(0, 0, pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y); - m_renderData.projection = Mat3x3::outputProjection(pMonitor->m_pixelSize, HYPRUTILS_TRANSFORM_NORMAL); + g_pHyprRenderer->m_renderData.projection = Mat3x3::outputProjection(pMonitor->m_pixelSize, HYPRUTILS_TRANSFORM_NORMAL); - m_renderData.monitorProjection = Mat3x3::identity(); + g_pHyprRenderer->m_renderData.monitorProjection = Mat3x3::identity(); if (pMonitor->m_transform != WL_OUTPUT_TRANSFORM_NORMAL) { const Vector2D tfmd = pMonitor->m_transform % 2 == 1 ? Vector2D{FBO->m_size.y, FBO->m_size.x} : FBO->m_size; - m_renderData.monitorProjection.translate(FBO->m_size / 2.0).transform(Math::wlTransformToHyprutils(pMonitor->m_transform)).translate(-tfmd / 2.0); + g_pHyprRenderer->m_renderData.monitorProjection.translate(FBO->m_size / 2.0).transform(Math::wlTransformToHyprutils(pMonitor->m_transform)).translate(-tfmd / 2.0); } if (!m_shadersInitialized) initShaders(); - m_renderData.transformDamage = true; - m_renderData.damage.set(damage); - m_renderData.finalDamage.set(damage); + g_pHyprRenderer->m_renderData.transformDamage = true; + g_pHyprRenderer->m_renderData.damage.set(damage); + g_pHyprRenderer->m_renderData.finalDamage.set(damage); m_fakeFrame = true; - m_renderData.currentFB = FBO; + g_pHyprRenderer->m_renderData.currentFB = FBO; FBO->bind(); m_offloadedFramebuffer = false; - m_renderData.mainFB = m_renderData.currentFB; - m_renderData.outFB = FBO; + g_pHyprRenderer->m_renderData.mainFB = g_pHyprRenderer->m_renderData.currentFB; + g_pHyprRenderer->m_renderData.outFB = FBO; g_pHyprRenderer->pushMonitorTransformEnabled(false); } @@ -698,7 +698,7 @@ void CHyprOpenGLImpl::makeEGLCurrent() { } void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, SP<IFramebuffer> fb, std::optional<CRegion> finalDamage) { - m_renderData.pMonitor = pMonitor; + g_pHyprRenderer->m_renderData.pMonitor = pMonitor; const GLenum RESETSTATUS = glGetGraphicsResetStatus(); if (RESETSTATUS != GL_NO_ERROR) { @@ -717,9 +717,9 @@ void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, SP<IFra setViewport(0, 0, pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y); - m_renderData.projection = Mat3x3::outputProjection(pMonitor->m_pixelSize, HYPRUTILS_TRANSFORM_NORMAL); + g_pHyprRenderer->m_renderData.projection = Mat3x3::outputProjection(pMonitor->m_pixelSize, HYPRUTILS_TRANSFORM_NORMAL); - m_renderData.monitorProjection = pMonitor->m_projMatrix; + g_pHyprRenderer->m_renderData.monitorProjection = pMonitor->m_projMatrix; if (pMonitor && (!pMonitor->m_offloadFB || pMonitor->m_offloadFB->m_size != pMonitor->m_pixelSize)) destroyMonitorResources(pMonitor); @@ -730,39 +730,40 @@ void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, SP<IFra const auto DRM_FORMAT = fb ? fb->m_drmFormat : pMonitor->m_output->state->state().drmFormat; // ensure a framebuffer for the monitor exists - if (!m_renderData.pMonitor->m_offloadFB || m_renderData.pMonitor->m_offloadFB->m_size != pMonitor->m_pixelSize || - DRM_FORMAT != m_renderData.pMonitor->m_offloadFB->m_drmFormat) { - m_renderData.pMonitor->m_stencilTex = g_pHyprRenderer->createStencilTexture(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y); - m_renderData.pMonitor->m_offloadFB = g_pHyprRenderer->createFB(); - m_renderData.pMonitor->m_mirrorFB = g_pHyprRenderer->createFB(); - m_renderData.pMonitor->m_mirrorSwapFB = g_pHyprRenderer->createFB(); + if (!g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB || g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->m_size != pMonitor->m_pixelSize || + DRM_FORMAT != g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->m_drmFormat) { + g_pHyprRenderer->m_renderData.pMonitor->m_stencilTex = g_pHyprRenderer->createStencilTexture(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y); + g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB = g_pHyprRenderer->createFB(); + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB = g_pHyprRenderer->createFB(); + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB = g_pHyprRenderer->createFB(); - m_renderData.pMonitor->m_offloadFB->addStencil(m_renderData.pMonitor->m_stencilTex); - m_renderData.pMonitor->m_mirrorFB->addStencil(m_renderData.pMonitor->m_stencilTex); - m_renderData.pMonitor->m_mirrorSwapFB->addStencil(m_renderData.pMonitor->m_stencilTex); + g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->addStencil(g_pHyprRenderer->m_renderData.pMonitor->m_stencilTex); + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB->addStencil(g_pHyprRenderer->m_renderData.pMonitor->m_stencilTex); + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB->addStencil(g_pHyprRenderer->m_renderData.pMonitor->m_stencilTex); - m_renderData.pMonitor->m_offloadFB->alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); - m_renderData.pMonitor->m_mirrorFB->alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); - m_renderData.pMonitor->m_mirrorSwapFB->alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); + g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB->alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB->alloc(pMonitor->m_pixelSize.x, pMonitor->m_pixelSize.y, DRM_FORMAT); } - const bool HAS_MIRROR_FB = m_renderData.pMonitor->m_monitorMirrorFB && m_renderData.pMonitor->m_monitorMirrorFB->isAllocated(); - const bool NEEDS_COPY_FB = needsACopyFB(m_renderData.pMonitor.lock()); + const bool HAS_MIRROR_FB = g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB && g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB->isAllocated(); + const bool NEEDS_COPY_FB = needsACopyFB(g_pHyprRenderer->m_renderData.pMonitor.lock()); if (HAS_MIRROR_FB && !NEEDS_COPY_FB) - m_renderData.pMonitor->m_monitorMirrorFB->release(); - else if (!HAS_MIRROR_FB && NEEDS_COPY_FB && m_renderData.pMonitor->m_monitorMirrorFB) - m_renderData.pMonitor->m_monitorMirrorFB->alloc(m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y, - m_renderData.pMonitor->m_output->state->state().drmFormat); + g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB->release(); + else if (!HAS_MIRROR_FB && NEEDS_COPY_FB && g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB) + g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB->alloc(g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x, + g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y, + g_pHyprRenderer->m_renderData.pMonitor->m_output->state->state().drmFormat); - m_renderData.transformDamage = true; + g_pHyprRenderer->m_renderData.transformDamage = true; if (HAS_MIRROR_FB != NEEDS_COPY_FB) { // force full damage because the mirror fb will be empty - m_renderData.damage.set({0, 0, INT32_MAX, INT32_MAX}); - m_renderData.finalDamage.set(m_renderData.damage); + g_pHyprRenderer->m_renderData.damage.set({0, 0, INT32_MAX, INT32_MAX}); + g_pHyprRenderer->m_renderData.finalDamage.set(g_pHyprRenderer->m_renderData.damage); } else { - m_renderData.damage.set(damage_); - m_renderData.finalDamage.set(finalDamage.value_or(damage_)); + g_pHyprRenderer->m_renderData.damage.set(damage_); + g_pHyprRenderer->m_renderData.finalDamage.set(finalDamage.value_or(damage_)); } m_fakeFrame = fb; @@ -773,12 +774,12 @@ void CHyprOpenGLImpl::begin(PHLMONITOR pMonitor, const CRegion& damage_, SP<IFra applyScreenShader(*PSHADER); } - m_renderData.pMonitor->m_offloadFB->bind(); - m_renderData.currentFB = m_renderData.pMonitor->m_offloadFB; - m_offloadedFramebuffer = true; + g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->bind(); + g_pHyprRenderer->m_renderData.currentFB = g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB; + m_offloadedFramebuffer = true; - m_renderData.mainFB = m_renderData.currentFB; - m_renderData.outFB = fb ? fb : g_pHyprRenderer->getCurrentRBO()->getFB(); + g_pHyprRenderer->m_renderData.mainFB = g_pHyprRenderer->m_renderData.currentFB; + g_pHyprRenderer->m_renderData.outFB = fb ? fb : g_pHyprRenderer->getCurrentRBO()->getFB(); g_pHyprRenderer->pushMonitorTransformEnabled(false); } @@ -788,83 +789,84 @@ void CHyprOpenGLImpl::end() { TRACY_GPU_ZONE("RenderEnd"); - m_renderData.currentWindow.reset(); - m_renderData.surface.reset(); - m_renderData.currentLS.reset(); - m_renderData.clipBox = {}; - m_renderData.clipRegion.clear(); + g_pHyprRenderer->m_renderData.currentWindow.reset(); + g_pHyprRenderer->m_renderData.surface.reset(); + g_pHyprRenderer->m_renderData.currentLS.reset(); + g_pHyprRenderer->m_renderData.clipBox = {}; + g_pHyprRenderer->m_renderData.clipRegion.clear(); // end the render, copy the data to the main framebuffer if LIKELY (m_offloadedFramebuffer) { - m_renderData.damage = m_renderData.finalDamage; + g_pHyprRenderer->m_renderData.damage = g_pHyprRenderer->m_renderData.finalDamage; g_pHyprRenderer->pushMonitorTransformEnabled(true); - CBox monbox = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; + CBox monbox = {0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; - if LIKELY (g_pHyprRenderer->m_renderMode == RENDER_MODE_NORMAL && m_renderData.mouseZoomFactor == 1.0f) - m_renderData.pMonitor->m_zoomController.m_resetCameraState = true; - m_renderData.pMonitor->m_zoomController.applyZoomTransform(monbox, m_renderData); + if LIKELY (g_pHyprRenderer->m_renderMode == RENDER_MODE_NORMAL && g_pHyprRenderer->m_renderData.mouseZoomFactor == 1.0f) + g_pHyprRenderer->m_renderData.pMonitor->m_zoomController.m_resetCameraState = true; + g_pHyprRenderer->m_renderData.pMonitor->m_zoomController.applyZoomTransform(monbox, g_pHyprRenderer->m_renderData); - m_applyFinalShader = !m_renderData.blockScreenShader; - if UNLIKELY (m_renderData.mouseZoomFactor != 1.F && m_renderData.mouseZoomUseMouse && *PZOOMDISABLEAA) - m_renderData.useNearestNeighbor = true; + m_applyFinalShader = !g_pHyprRenderer->m_renderData.blockScreenShader; + if UNLIKELY (g_pHyprRenderer->m_renderData.mouseZoomFactor != 1.F && g_pHyprRenderer->m_renderData.mouseZoomUseMouse && *PZOOMDISABLEAA) + g_pHyprRenderer->m_renderData.useNearestNeighbor = true; // copy the damaged areas into the mirror buffer // we can't use the offloadFB for mirroring / ss, as it contains artifacts from blurring - if UNLIKELY (needsACopyFB(m_renderData.pMonitor.lock()) && !m_fakeFrame) + if UNLIKELY (needsACopyFB(g_pHyprRenderer->m_renderData.pMonitor.lock()) && !m_fakeFrame) saveBufferForMirror(monbox); - m_renderData.outFB->bind(); + g_pHyprRenderer->m_renderData.outFB->bind(); blend(false); - const auto PRIMITIVE_BLOCKED = - m_finalScreenShader->program() >= 1 || g_pHyprRenderer->m_crashingInProgress || m_renderData.pMonitor->m_imageDescription->value() != SImageDescription{}; + const auto PRIMITIVE_BLOCKED = m_finalScreenShader->program() >= 1 || g_pHyprRenderer->m_crashingInProgress || + g_pHyprRenderer->m_renderData.pMonitor->m_imageDescription->value() != SImageDescription{}; if LIKELY (!PRIMITIVE_BLOCKED || g_pHyprRenderer->m_renderMode != RENDER_MODE_NORMAL) - renderTexturePrimitive(m_renderData.pMonitor->m_offloadFB->getTexture(), monbox); + renderTexturePrimitive(g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->getTexture(), monbox); else // we need to use renderTexture if we do any CM whatsoever. - renderTexture(m_renderData.pMonitor->m_offloadFB->getTexture(), monbox, {.finalMonitorCM = true}); + renderTexture(g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->getTexture(), monbox, {.finalMonitorCM = true}); blend(true); - m_renderData.useNearestNeighbor = false; - m_applyFinalShader = false; + g_pHyprRenderer->m_renderData.useNearestNeighbor = false; + m_applyFinalShader = false; g_pHyprRenderer->popMonitorTransformEnabled(); } // invalidate our render FBs to signal to the driver we don't need them anymore - if (m_renderData.pMonitor->m_mirrorFB) { - m_renderData.pMonitor->m_mirrorFB->bind(); - GLFB(m_renderData.pMonitor->m_mirrorFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); + if (g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB) { + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB->bind(); + GLFB(g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); } - if (m_renderData.pMonitor->m_mirrorSwapFB) { - m_renderData.pMonitor->m_mirrorSwapFB->bind(); - GLFB(m_renderData.pMonitor->m_mirrorSwapFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); + if (g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB) { + g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB->bind(); + GLFB(g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); } - if (m_renderData.pMonitor->m_offloadFB) { - m_renderData.pMonitor->m_offloadFB->bind(); - GLFB(m_renderData.pMonitor->m_offloadFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); + if (g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB) { + g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB->bind(); + GLFB(g_pHyprRenderer->m_renderData.pMonitor->m_offloadFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); } - if (m_renderData.pMonitor->m_offMainFB) { - m_renderData.pMonitor->m_offMainFB->bind(); - GLFB(m_renderData.pMonitor->m_offMainFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); + if (g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB) { + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->bind(); + GLFB(g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB)->invalidate({GL_STENCIL_ATTACHMENT, GL_COLOR_ATTACHMENT0}); } // reset our data - m_renderData.pMonitor.reset(); - m_renderData.mouseZoomFactor = 1.f; - m_renderData.mouseZoomUseMouse = true; - m_renderData.blockScreenShader = false; - m_renderData.currentFB = nullptr; - m_renderData.mainFB = nullptr; - m_renderData.outFB = nullptr; + g_pHyprRenderer->m_renderData.pMonitor.reset(); + g_pHyprRenderer->m_renderData.mouseZoomFactor = 1.f; + g_pHyprRenderer->m_renderData.mouseZoomUseMouse = true; + g_pHyprRenderer->m_renderData.blockScreenShader = false; + g_pHyprRenderer->m_renderData.currentFB = nullptr; + g_pHyprRenderer->m_renderData.mainFB = nullptr; + g_pHyprRenderer->m_renderData.outFB = nullptr; g_pHyprRenderer->popMonitorTransformEnabled(); // if we dropped to offMain, release it now. // if there is a plugin constantly using it, this might be a bit slow, // but I haven't seen a single plugin yet use these, so it's better to drop a bit of vram. - if UNLIKELY (m_renderData.pMonitor && m_renderData.pMonitor->m_offMainFB && m_renderData.pMonitor->m_offMainFB->isAllocated()) - m_renderData.pMonitor->m_offMainFB->release(); + if UNLIKELY (g_pHyprRenderer->m_renderData.pMonitor && g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB && + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->isAllocated()) + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->release(); static const auto GLDEBUG = CConfigValue<Hyprlang::INT>("debug:gl_debugging"); @@ -882,8 +884,8 @@ bool CHyprOpenGLImpl::needsACopyFB(PHLMONITOR mon) { } void CHyprOpenGLImpl::setDamage(const CRegion& damage_, std::optional<CRegion> finalDamage) { - m_renderData.damage.set(damage_); - m_renderData.finalDamage.set(finalDamage.value_or(damage_)); + g_pHyprRenderer->m_renderData.damage.set(damage_); + g_pHyprRenderer->m_renderData.finalDamage.set(finalDamage.value_or(damage_)); } static const std::vector<std::string> SHADER_INCLUDES = { @@ -987,15 +989,15 @@ void CHyprOpenGLImpl::applyScreenShader(const std::string& path) { } void CHyprOpenGLImpl::clear(const CHyprColor& color) { - RASSERT(m_renderData.pMonitor, "Tried to render without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render without begin()!"); TRACY_GPU_ZONE("RenderClear"); GLCALL(glClearColor(color.r, color.g, color.b, color.a)); - if (!m_renderData.damage.empty()) { - m_renderData.damage.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + if (!g_pHyprRenderer->m_renderData.damage.empty()) { + g_pHyprRenderer->m_renderData.damage.forEachRect([this](const auto& RECT) { + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glClear(GL_COLOR_BUFFER_BIT); }); } @@ -1012,15 +1014,15 @@ void CHyprOpenGLImpl::blend(bool enabled) { } void CHyprOpenGLImpl::scissor(const CBox& originalBox, bool transform) { - RASSERT(m_renderData.pMonitor, "Tried to scissor without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to scissor without begin()!"); // only call glScissor if the box has changed static CBox m_lastScissorBox = {}; if (transform) { CBox box = originalBox; - const auto TR = Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)); - box.transform(TR, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y); + const auto TR = Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)); + box.transform(TR, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); if (box != m_lastScissorBox) { GLCALL(glScissor(box.x, box.y, box.width, box.height)); @@ -1040,7 +1042,7 @@ void CHyprOpenGLImpl::scissor(const CBox& originalBox, bool transform) { } void CHyprOpenGLImpl::scissor(const pixman_box32* pBox, bool transform) { - RASSERT(m_renderData.pMonitor, "Tried to scissor without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to scissor without begin()!"); if (!pBox) { setCapStatus(GL_SCISSOR_TEST, false); @@ -1059,7 +1061,7 @@ void CHyprOpenGLImpl::scissor(const int x, const int y, const int w, const int h void CHyprOpenGLImpl::renderRect(const CBox& box, const CHyprColor& col, SRectRenderData data) { if (!data.damage) - data.damage = &m_renderData.damage; + data.damage = &g_pHyprRenderer->m_renderData.damage; if (data.blur) renderRectWithBlurInternal(box, col, data); @@ -1071,38 +1073,40 @@ void CHyprOpenGLImpl::renderRectWithBlurInternal(const CBox& box, const CHyprCol if (data.damage->empty()) return; - CRegion damage{m_renderData.damage}; + CRegion damage{g_pHyprRenderer->m_renderData.damage}; damage.intersect(box); - auto POUTFB = data.xray ? m_renderData.pMonitor->m_blurFB : blurMainFramebufferWithDamage(data.blurA, &damage); + auto POUTFB = data.xray ? g_pHyprRenderer->m_renderData.pMonitor->m_blurFB : blurMainFramebufferWithDamage(data.blurA, &damage); - m_renderData.currentFB->bind(); + g_pHyprRenderer->m_renderData.currentFB->bind(); - CBox MONITORBOX = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; + CBox MONITORBOX = {0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; g_pHyprRenderer->pushMonitorTransformEnabled(true); - const auto SAVEDRENDERMODIF = m_renderData.renderModif; - m_renderData.renderModif = {}; // fix shit + const auto SAVEDRENDERMODIF = g_pHyprRenderer->m_renderData.renderModif; + g_pHyprRenderer->m_renderData.renderModif = {}; // fix shit renderTexture(POUTFB->getTexture(), MONITORBOX, STextureRenderData{.damage = &damage, .a = data.blurA, .round = data.round, .roundingPower = 2.F, .allowCustomUV = false, .allowDim = false, .noAA = false}); g_pHyprRenderer->popMonitorTransformEnabled(); - m_renderData.renderModif = SAVEDRENDERMODIF; + g_pHyprRenderer->m_renderData.renderModif = SAVEDRENDERMODIF; renderRectWithDamageInternal(box, col, data); } void CHyprOpenGLImpl::renderRectWithDamageInternal(const CBox& box, const CHyprColor& col, const SRectRenderData& data) { RASSERT((box.width > 0 && box.height > 0), "Tried to render rect with width/height < 0!"); - RASSERT(m_renderData.pMonitor, "Tried to render rect without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render rect without begin()!"); TRACY_GPU_ZONE("RenderRectWithDamage"); CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, Math::wlTransformToHyprutils(Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox( + newBox, + Math::wlTransformToHyprutils( + Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : g_pHyprRenderer->m_renderData.pMonitor->m_transform)), newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); auto shader = useShader(getShaderVariant(SH_FRAG_QUAD, data.round > 0 ? SH_FEAT_ROUNDING : 0)); shader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); @@ -1111,8 +1115,8 @@ void CHyprOpenGLImpl::renderRectWithDamageInternal(const CBox& box, const CHyprC shader->setUniformFloat4(SHADER_COLOR, col.r * col.a, col.g * col.a, col.b * col.a, col.a); CBox transformedBox = box; - transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)), m_renderData.pMonitor->m_transformedSize.x, - m_renderData.pMonitor->m_transformedSize.y); + transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)), + g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); const auto TOPLEFT = Vector2D(transformedBox.x, transformedBox.y); const auto FULLSIZE = Vector2D(transformedBox.width, transformedBox.height); @@ -1125,19 +1129,20 @@ void CHyprOpenGLImpl::renderRectWithDamageInternal(const CBox& box, const CHyprC glBindVertexArray(shader->getUniformLocation(SHADER_SHADER_VAO)); - if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { - CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; + if (g_pHyprRenderer->m_renderData.clipBox.width != 0 && g_pHyprRenderer->m_renderData.clipBox.height != 0) { + CRegion damageClip{g_pHyprRenderer->m_renderData.clipBox.x, g_pHyprRenderer->m_renderData.clipBox.y, g_pHyprRenderer->m_renderData.clipBox.width, + g_pHyprRenderer->m_renderData.clipBox.height}; damageClip.intersect(*data.damage); if (!damageClip.empty()) { damageClip.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } } else { data.damage->forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } @@ -1147,13 +1152,13 @@ void CHyprOpenGLImpl::renderRectWithDamageInternal(const CBox& box, const CHyprC } void CHyprOpenGLImpl::renderTexture(SP<ITexture> tex, const CBox& box, STextureRenderData data) { - RASSERT(m_renderData.pMonitor, "Tried to render texture without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render texture without begin()!"); if (!data.damage) { - if (m_renderData.damage.empty()) + if (g_pHyprRenderer->m_renderData.damage.empty()) return; - data.damage = &m_renderData.damage; + data.damage = &g_pHyprRenderer->m_renderData.damage; } if (data.blur) @@ -1184,7 +1189,8 @@ static bool isHDR2SDR(const NColorManagement::SImageDescription& imageDescriptio void CHyprOpenGLImpl::passCMUniforms(WP<CShader> shader, const NColorManagement::PImageDescription imageDescription, const NColorManagement::PImageDescription targetImageDescription, bool modifySDR, float sdrMinLuminance, int sdrMaxLuminance) { - const auto settings = g_pHyprRenderer->getCMSettings(imageDescription, targetImageDescription, m_renderData.surface.valid() ? m_renderData.surface.lock() : nullptr, modifySDR, + const auto settings = g_pHyprRenderer->getCMSettings(imageDescription, targetImageDescription, + g_pHyprRenderer->m_renderData.surface.valid() ? g_pHyprRenderer->m_renderData.surface.lock() : nullptr, modifySDR, sdrMinLuminance, sdrMaxLuminance); shader->setUniformInt(SHADER_SOURCE_TF, settings.sourceTF); @@ -1231,8 +1237,8 @@ void CHyprOpenGLImpl::passCMUniforms(WP<CShader> shader, const NColorManagement: } void CHyprOpenGLImpl::passCMUniforms(WP<CShader> shader, const PImageDescription imageDescription) { - passCMUniforms(shader, imageDescription, g_pHyprRenderer->workBufferImageDescription(), true, m_renderData.pMonitor->m_sdrMinLuminance, - m_renderData.pMonitor->m_sdrMaxLuminance); + passCMUniforms(shader, imageDescription, g_pHyprRenderer->workBufferImageDescription(), true, g_pHyprRenderer->m_renderData.pMonitor->m_sdrMinLuminance, + g_pHyprRenderer->m_renderData.pMonitor->m_sdrMaxLuminance); } WP<CShader> CHyprOpenGLImpl::renderToOutputInternal() { @@ -1249,8 +1255,8 @@ WP<CShader> CHyprOpenGLImpl::renderToOutputInternal() { else shader->setUniformFloat(SHADER_TIME, 0.f); - shader->setUniformInt(SHADER_WL_OUTPUT, m_renderData.pMonitor->m_id); - shader->setUniformFloat2(SHADER_FULL_SIZE, m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y); + shader->setUniformInt(SHADER_WL_OUTPUT, g_pHyprRenderer->m_renderData.pMonitor->m_id); + shader->setUniformFloat2(SHADER_FULL_SIZE, g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y); shader->setUniformFloat(SHADER_POINTER_INACTIVE_TIMEOUT, *PCURSORTIMEOUT); shader->setUniformInt(SHADER_POINTER_HIDDEN, g_pHyprRenderer->m_cursorHiddenByCondition); shader->setUniformInt(SHADER_POINTER_KILLING, g_pInputManager->getClickMode() == CLICKMODE_KILL); @@ -1259,7 +1265,7 @@ WP<CShader> CHyprOpenGLImpl::renderToOutputInternal() { shader->setUniformFloat(SHADER_POINTER_SIZE, g_pCursorManager->getScaledSize()); if (*PDT == 0) { - PHLMONITORREF pMonitor = m_renderData.pMonitor; + PHLMONITORREF pMonitor = g_pHyprRenderer->m_renderData.pMonitor; Vector2D p = ((g_pInputManager->getMouseCoordsInternal() - pMonitor->m_position) * pMonitor->m_scale); p = p.transform(Math::wlTransformToHyprutils(pMonitor->m_transform), pMonitor->m_pixelSize); shader->setUniformFloat2(SHADER_POINTER, p.x / pMonitor->m_pixelSize.x, p.y / pMonitor->m_pixelSize.y); @@ -1300,7 +1306,7 @@ WP<CShader> CHyprOpenGLImpl::renderToOutputInternal() { if (g_pHyprRenderer->m_crashingInProgress) { shader->setUniformFloat(SHADER_DISTORT, g_pHyprRenderer->m_crashingDistort); - shader->setUniformFloat2(SHADER_FULL_SIZE, m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y); + shader->setUniformFloat2(SHADER_FULL_SIZE, g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y); } return shader; @@ -1325,10 +1331,10 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, default: RASSERT(false, "tex->m_iTarget unsupported!"); } - if (data.finalMonitorCM || (m_renderData.currentWindow && m_renderData.currentWindow->m_ruleApplicator->RGBX().valueOrDefault())) + if (data.finalMonitorCM || (g_pHyprRenderer->m_renderData.currentWindow && g_pHyprRenderer->m_renderData.currentWindow->m_ruleApplicator->RGBX().valueOrDefault())) shaderFeatures &= ~SH_FEAT_RGBA; - const auto surface = m_renderData.surface; + const auto surface = g_pHyprRenderer->m_renderData.surface; const bool isHDRSurface = surface.valid() && surface->m_colorManagement.valid() ? surface->m_colorManagement->isHDR() : false; const bool canPassHDRSurface = isHDRSurface && !surface->m_colorManagement->isWindowsScRGB(); // windows scRGB requires CM shader @@ -1338,8 +1344,8 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, const auto SOURCE_IMAGE_DESCRIPTION = [&] { // if valid CM surface, use that as a source - if (m_renderData.surface.valid() && m_renderData.surface->m_colorManagement.valid()) - return CImageDescription::from(m_renderData.surface->m_colorManagement->imageDescription()); + if (g_pHyprRenderer->m_renderData.surface.valid() && g_pHyprRenderer->m_renderData.surface->m_colorManagement.valid()) + return CImageDescription::from(g_pHyprRenderer->m_renderData.surface->m_colorManagement->imageDescription()); // otherwise, if we are CM'ing back into source, use chosen, because that's what our work buffer is in // the same applies to the final monitor CM @@ -1357,7 +1363,7 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, // for final CM, use the target description if (data.finalMonitorCM) - return m_renderData.pMonitor->m_imageDescription; + return g_pHyprRenderer->m_renderData.pMonitor->m_imageDescription; // otherwise, use chosen, we're drawing into the work buffer // NOLINTNEXTLINE return WORK_BUFFER_IMAGE_DESCRIPTION; @@ -1369,16 +1375,19 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, if (data.discardActive) shaderFeatures |= SH_FEAT_DISCARD; - const bool CANT_CHECK_CM_EQUALITY = data.cmBackToSRGB || data.finalMonitorCM || (!m_renderData.surface || !m_renderData.surface->m_colorManagement); + const bool CANT_CHECK_CM_EQUALITY = + data.cmBackToSRGB || data.finalMonitorCM || (!g_pHyprRenderer->m_renderData.surface || !g_pHyprRenderer->m_renderData.surface->m_colorManagement); const bool skipCM = !*PENABLECM || !m_cmSupported /* CM unsupported or disabled */ - || m_renderData.pMonitor->doesNoShaderCM() /* no shader needed */ + || g_pHyprRenderer->m_renderData.pMonitor->doesNoShaderCM() /* no shader needed */ || (SOURCE_IMAGE_DESCRIPTION->id() == TARGET_IMAGE_DESCRIPTION->id() && !CANT_CHECK_CM_EQUALITY) /* Source and target have the same image description */ || (((*PPASS && canPassHDRSurface) || - (*PPASS == 1 && !isHDRSurface && m_renderData.pMonitor->m_cmType != NCMType::CM_HDR && m_renderData.pMonitor->m_cmType != NCMType::CM_HDR_EDID)) && - m_renderData.pMonitor->inFullscreenMode()) /* Fullscreen window with pass cm enabled */; + (*PPASS == 1 && !isHDRSurface && g_pHyprRenderer->m_renderData.pMonitor->m_cmType != NCMType::CM_HDR && + g_pHyprRenderer->m_renderData.pMonitor->m_cmType != NCMType::CM_HDR_EDID)) && + g_pHyprRenderer->m_renderData.pMonitor->inFullscreenMode()) /* Fullscreen window with pass cm enabled */; - if (data.allowDim && m_renderData.currentWindow && (m_renderData.currentWindow->m_notRespondingTint->value() > 0 || m_renderData.currentWindow->m_dimPercent->value() > 0)) + if (data.allowDim && g_pHyprRenderer->m_renderData.currentWindow && + (g_pHyprRenderer->m_renderData.currentWindow->m_notRespondingTint->value() > 0 || g_pHyprRenderer->m_renderData.currentWindow->m_dimPercent->value() > 0)) shaderFeatures |= SH_FEAT_TINT; if (data.round > 0) @@ -1404,8 +1413,8 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, (SOURCE_IMAGE_DESCRIPTION->value().transferFunction == CM_TRANSFER_FUNCTION_SRGB || SOURCE_IMAGE_DESCRIPTION->value().transferFunction == CM_TRANSFER_FUNCTION_GAMMA22) && TARGET_IMAGE_DESCRIPTION->value().transferFunction == CM_TRANSFER_FUNCTION_ST2084_PQ && - ((m_renderData.pMonitor->m_sdrSaturation > 0 && m_renderData.pMonitor->m_sdrSaturation != 1.0f) || - (m_renderData.pMonitor->m_sdrBrightness > 0 && m_renderData.pMonitor->m_sdrBrightness != 1.0f))) + ((g_pHyprRenderer->m_renderData.pMonitor->m_sdrSaturation > 0 && g_pHyprRenderer->m_renderData.pMonitor->m_sdrSaturation != 1.0f) || + (g_pHyprRenderer->m_renderData.pMonitor->m_sdrBrightness > 0 && g_pHyprRenderer->m_renderData.pMonitor->m_sdrBrightness != 1.0f))) shaderFeatures |= SH_FEAT_SDR_MOD; } } @@ -1416,7 +1425,8 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, if (!skipCM) { if (data.finalMonitorCM || data.cmBackToSRGB) - passCMUniforms(shader, SOURCE_IMAGE_DESCRIPTION, TARGET_IMAGE_DESCRIPTION, true, m_renderData.pMonitor->m_sdrMinLuminance, m_renderData.pMonitor->m_sdrMaxLuminance); + passCMUniforms(shader, SOURCE_IMAGE_DESCRIPTION, TARGET_IMAGE_DESCRIPTION, true, g_pHyprRenderer->m_renderData.pMonitor->m_sdrMinLuminance, + g_pHyprRenderer->m_renderData.pMonitor->m_sdrMaxLuminance); else passCMUniforms(shader, SOURCE_IMAGE_DESCRIPTION); } @@ -1426,25 +1436,27 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, if (shaderFeatures & SH_FEAT_BLUR) { shader->setUniformInt(SHADER_BLURRED_BG, 1); // shader->setUniformFloat2(SHADER_UV_OFFSET, 0, 0); - shader->setUniformFloat2(SHADER_UV_OFFSET, newBox.x / m_renderData.pMonitor->m_transformedSize.x, newBox.y / m_renderData.pMonitor->m_transformedSize.y); - shader->setUniformFloat2(SHADER_UV_SIZE, newBox.width / m_renderData.pMonitor->m_transformedSize.x, newBox.height / m_renderData.pMonitor->m_transformedSize.y); + shader->setUniformFloat2(SHADER_UV_OFFSET, newBox.x / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, + newBox.y / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); + shader->setUniformFloat2(SHADER_UV_SIZE, newBox.width / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, + newBox.height / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); glActiveTexture(GL_TEXTURE0 + 1); data.blurredBG->bind(); } if (data.discardActive) { - shader->setUniformInt(SHADER_DISCARD_OPAQUE, !!(m_renderData.discardMode & DISCARD_OPAQUE)); - shader->setUniformInt(SHADER_DISCARD_ALPHA, !!(m_renderData.discardMode & DISCARD_ALPHA)); - shader->setUniformFloat(SHADER_DISCARD_ALPHA_VALUE, m_renderData.discardOpacity); + shader->setUniformInt(SHADER_DISCARD_OPAQUE, !!(g_pHyprRenderer->m_renderData.discardMode & DISCARD_OPAQUE)); + shader->setUniformInt(SHADER_DISCARD_ALPHA, !!(g_pHyprRenderer->m_renderData.discardMode & DISCARD_ALPHA)); + shader->setUniformFloat(SHADER_DISCARD_ALPHA_VALUE, g_pHyprRenderer->m_renderData.discardOpacity); } else { shader->setUniformInt(SHADER_DISCARD_OPAQUE, 0); shader->setUniformInt(SHADER_DISCARD_ALPHA, 0); } CBox transformedBox = newBox; - transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)), m_renderData.pMonitor->m_transformedSize.x, - m_renderData.pMonitor->m_transformedSize.y); + transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)), + g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); const auto TOPLEFT = Vector2D(transformedBox.x, transformedBox.y); const auto FULLSIZE = Vector2D(transformedBox.width, transformedBox.height); @@ -1454,14 +1466,14 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, shader->setUniformFloat(SHADER_RADIUS, data.round); shader->setUniformFloat(SHADER_ROUNDING_POWER, data.roundingPower); - if (data.allowDim && m_renderData.currentWindow) { - if (m_renderData.currentWindow->m_notRespondingTint->value() > 0) { - const auto DIM = m_renderData.currentWindow->m_notRespondingTint->value(); + if (data.allowDim && g_pHyprRenderer->m_renderData.currentWindow) { + if (g_pHyprRenderer->m_renderData.currentWindow->m_notRespondingTint->value() > 0) { + const auto DIM = g_pHyprRenderer->m_renderData.currentWindow->m_notRespondingTint->value(); shader->setUniformInt(SHADER_APPLY_TINT, 1); shader->setUniformFloat3(SHADER_TINT, 1.f - DIM, 1.f - DIM, 1.f - DIM); - } else if (m_renderData.currentWindow->m_dimPercent->value() > 0) { + } else if (g_pHyprRenderer->m_renderData.currentWindow->m_dimPercent->value() > 0) { shader->setUniformInt(SHADER_APPLY_TINT, 1); - const auto DIM = m_renderData.currentWindow->m_dimPercent->value(); + const auto DIM = g_pHyprRenderer->m_renderData.currentWindow->m_dimPercent->value(); shader->setUniformFloat3(SHADER_TINT, 1.f - DIM, 1.f - DIM, 1.f - DIM); } else shader->setUniformInt(SHADER_APPLY_TINT, 0); @@ -1472,7 +1484,7 @@ WP<CShader> CHyprOpenGLImpl::renderToFBInternal(const STextureRenderData& data, } void CHyprOpenGLImpl::renderTextureInternal(SP<ITexture> tex, const CBox& box, const STextureRenderData& data) { - RASSERT(m_renderData.pMonitor, "Tried to render texture without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render texture without begin()!"); RASSERT((tex->ok()), "Attempted to draw nullptr texture!"); TRACY_GPU_ZONE("RenderTextureInternalWithDamage"); @@ -1481,19 +1493,19 @@ void CHyprOpenGLImpl::renderTextureInternal(SP<ITexture> tex, const CBox& box, c return; CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); // get the needed transform for this texture - const auto MONITOR_INVERTED = Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)); + const auto MONITOR_INVERTED = Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)); Hyprutils::Math::eTransform TRANSFORM = tex->m_transform; if (g_pHyprRenderer->monitorTransformEnabled()) TRANSFORM = Math::composeTransform(MONITOR_INVERTED, TRANSFORM); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); - const bool renderToOutput = m_applyFinalShader && g_pHyprRenderer->workBufferImageDescription()->id() == m_renderData.pMonitor->m_imageDescription->id(); + const bool renderToOutput = m_applyFinalShader && g_pHyprRenderer->workBufferImageDescription()->id() == g_pHyprRenderer->m_renderData.pMonitor->m_imageDescription->id(); glActiveTexture(GL_TEXTURE0); tex->bind(); @@ -1501,7 +1513,7 @@ void CHyprOpenGLImpl::renderTextureInternal(SP<ITexture> tex, const CBox& box, c tex->setTexParameter(GL_TEXTURE_WRAP_S, data.wrapX); tex->setTexParameter(GL_TEXTURE_WRAP_T, data.wrapY); - if (m_renderData.useNearestNeighbor) { + if (g_pHyprRenderer->m_renderData.useNearestNeighbor) { tex->setTexParameter(GL_TEXTURE_MAG_FILTER, GL_NEAREST); tex->setTexParameter(GL_TEXTURE_MIN_FILTER, GL_NEAREST); } else { @@ -1523,11 +1535,11 @@ void CHyprOpenGLImpl::renderTextureInternal(SP<ITexture> tex, const CBox& box, c auto verts = fullVerts; - if (data.allowCustomUV && m_renderData.primarySurfaceUVTopLeft != Vector2D(-1, -1)) { - const float u0 = m_renderData.primarySurfaceUVTopLeft.x; - const float v0 = m_renderData.primarySurfaceUVTopLeft.y; - const float u1 = m_renderData.primarySurfaceUVBottomRight.x; - const float v1 = m_renderData.primarySurfaceUVBottomRight.y; + if (data.allowCustomUV && g_pHyprRenderer->m_renderData.primarySurfaceUVTopLeft != Vector2D(-1, -1)) { + const float u0 = g_pHyprRenderer->m_renderData.primarySurfaceUVTopLeft.x; + const float v0 = g_pHyprRenderer->m_renderData.primarySurfaceUVTopLeft.y; + const float u1 = g_pHyprRenderer->m_renderData.primarySurfaceUVBottomRight.x; + const float v1 = g_pHyprRenderer->m_renderData.primarySurfaceUVBottomRight.y; verts[0].u = u0; verts[0].v = v0; @@ -1541,25 +1553,25 @@ void CHyprOpenGLImpl::renderTextureInternal(SP<ITexture> tex, const CBox& box, c glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verts), verts.data()); - if (!m_renderData.clipBox.empty() || !m_renderData.clipRegion.empty()) { - CRegion damageClip = m_renderData.clipBox; + if (!g_pHyprRenderer->m_renderData.clipBox.empty() || !g_pHyprRenderer->m_renderData.clipRegion.empty()) { + CRegion damageClip = g_pHyprRenderer->m_renderData.clipBox; - if (!m_renderData.clipRegion.empty()) { - if (m_renderData.clipBox.empty()) - damageClip = m_renderData.clipRegion; + if (!g_pHyprRenderer->m_renderData.clipRegion.empty()) { + if (g_pHyprRenderer->m_renderData.clipBox.empty()) + damageClip = g_pHyprRenderer->m_renderData.clipRegion; else - damageClip.intersect(m_renderData.clipRegion); + damageClip.intersect(g_pHyprRenderer->m_renderData.clipRegion); } if (!damageClip.empty()) { damageClip.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } } else { data.damage->forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } @@ -1570,29 +1582,29 @@ void CHyprOpenGLImpl::renderTextureInternal(SP<ITexture> tex, const CBox& box, c } void CHyprOpenGLImpl::renderTexturePrimitive(SP<ITexture> tex, const CBox& box) { - RASSERT(m_renderData.pMonitor, "Tried to render texture without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render texture without begin()!"); RASSERT((tex->ok()), "Attempted to draw nullptr texture!"); TRACY_GPU_ZONE("RenderTexturePrimitive"); - if (m_renderData.damage.empty()) + if (g_pHyprRenderer->m_renderData.damage.empty()) return; CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); // get transform - const auto TRANSFORM = - Math::wlTransformToHyprutils(Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + const auto TRANSFORM = Math::wlTransformToHyprutils( + Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : g_pHyprRenderer->m_renderData.pMonitor->m_transform)); + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); glActiveTexture(GL_TEXTURE0); tex->bind(); // ensure the final blit uses the desired sampling filter // when cursor zoom is active we want nearest-neighbor (no anti-aliasing) - if (m_renderData.useNearestNeighbor) { + if (g_pHyprRenderer->m_renderData.useNearestNeighbor) { tex->setTexParameter(GL_TEXTURE_MAG_FILTER, GL_NEAREST); tex->setTexParameter(GL_TEXTURE_MIN_FILTER, GL_NEAREST); } else { @@ -1605,8 +1617,8 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP<ITexture> tex, const CBox& box) shader->setUniformInt(SHADER_TEX, 0); glBindVertexArray(shader->getUniformLocation(SHADER_SHADER_VAO)); - m_renderData.damage.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + g_pHyprRenderer->m_renderData.damage.forEachRect([this](const auto& RECT) { + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); @@ -1616,22 +1628,22 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP<ITexture> tex, const CBox& box) } void CHyprOpenGLImpl::renderTextureMatte(SP<ITexture> tex, const CBox& box, SP<IFramebuffer> matte) { - RASSERT(m_renderData.pMonitor, "Tried to render texture without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render texture without begin()!"); RASSERT((tex->ok()), "Attempted to draw nullptr texture!"); TRACY_GPU_ZONE("RenderTextureMatte"); - if (m_renderData.damage.empty()) + if (g_pHyprRenderer->m_renderData.damage.empty()) return; CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); // get transform - const auto TRANSFORM = - Math::wlTransformToHyprutils(Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + const auto TRANSFORM = Math::wlTransformToHyprutils( + Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : g_pHyprRenderer->m_renderData.pMonitor->m_transform)); + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox(newBox, TRANSFORM, newBox.rot); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); auto shader = useShader(getShaderVariant(SH_FRAG_MATTE)); shader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); @@ -1647,8 +1659,8 @@ void CHyprOpenGLImpl::renderTextureMatte(SP<ITexture> tex, const CBox& box, SP<I glBindVertexArray(shader->getUniformLocation(SHADER_SHADER_VAO)); - m_renderData.damage.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + g_pHyprRenderer->m_renderData.damage.forEachRect([this](const auto& RECT) { + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); @@ -1662,12 +1674,12 @@ void CHyprOpenGLImpl::renderTextureMatte(SP<ITexture> tex, const CBox& box, SP<I // // Dual (or more) kawase blur SP<IFramebuffer> CHyprOpenGLImpl::blurMainFramebufferWithDamage(float a, CRegion* originalDamage) { - if (!m_renderData.currentFB->getTexture()) { + if (!g_pHyprRenderer->m_renderData.currentFB->getTexture()) { Log::logger->log(Log::ERR, "BUG THIS: null fb texture while attempting to blur main fb?! (introspection off?!)"); - return m_renderData.pMonitor->m_mirrorFB; // return something to sample from at least + return g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB; // return something to sample from at least } - return blurFramebufferWithDamage(a, originalDamage, *GLFB(m_renderData.currentFB)); + return blurFramebufferWithDamage(a, originalDamage, *GLFB(g_pHyprRenderer->m_renderData.currentFB)); } SP<IFramebuffer> CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* originalDamage, CGLFramebuffer& source) { @@ -1678,10 +1690,10 @@ SP<IFramebuffer> CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* or setCapStatus(GL_STENCIL_TEST, false); // get transforms for the full monitor - const auto TRANSFORM = Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)); - CBox MONITORBOX = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; - Mat3x3 matrix = m_renderData.monitorProjection.projectBox(MONITORBOX, TRANSFORM); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + const auto TRANSFORM = Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)); + CBox MONITORBOX = {0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox(MONITORBOX, TRANSFORM); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); // get the config settings static auto PBLURSIZE = CConfigValue<Hyprlang::INT>("decoration:blur:size"); @@ -1693,13 +1705,13 @@ SP<IFramebuffer> CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* or // prep damage CRegion damage{*originalDamage}; - damage.transform(Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)), m_renderData.pMonitor->m_transformedSize.x, - m_renderData.pMonitor->m_transformedSize.y); + damage.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)), + g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); damage.expand(std::clamp(*PBLURSIZE, sc<int64_t>(1), sc<int64_t>(40)) * pow(2, BLUR_PASSES)); // helper - const auto PMIRRORFB = m_renderData.pMonitor->m_mirrorFB; - const auto PMIRRORSWAPFB = m_renderData.pMonitor->m_mirrorSwapFB; + const auto PMIRRORFB = g_pHyprRenderer->m_renderData.pMonitor->m_mirrorFB; + const auto PMIRRORSWAPFB = g_pHyprRenderer->m_renderData.pMonitor->m_mirrorSwapFB; auto currentRenderToFB = PMIRRORFB; @@ -1725,22 +1737,24 @@ SP<IFramebuffer> CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* or const bool skipCM = !m_cmSupported || g_pHyprRenderer->workBufferImageDescription()->id() == DEFAULT_IMAGE_DESCRIPTION->id(); if (!skipCM) { shader = useShader(getShaderVariant(SH_FRAG_BLURPREPARE, SH_FEAT_CM)); - passCMUniforms(shader, m_renderData.pMonitor->m_imageDescription, DEFAULT_IMAGE_DESCRIPTION); + passCMUniforms(shader, g_pHyprRenderer->m_renderData.pMonitor->m_imageDescription, DEFAULT_IMAGE_DESCRIPTION); shader->setUniformFloat(SHADER_SDR_SATURATION, - m_renderData.pMonitor->m_sdrSaturation > 0 && - m_renderData.pMonitor->m_imageDescription->value().transferFunction == NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ ? - m_renderData.pMonitor->m_sdrSaturation : + g_pHyprRenderer->m_renderData.pMonitor->m_sdrSaturation > 0 && + g_pHyprRenderer->m_renderData.pMonitor->m_imageDescription->value().transferFunction == + NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ ? + g_pHyprRenderer->m_renderData.pMonitor->m_sdrSaturation : 1.0f); shader->setUniformFloat(SHADER_SDR_BRIGHTNESS, - m_renderData.pMonitor->m_sdrBrightness > 0 && - m_renderData.pMonitor->m_imageDescription->value().transferFunction == NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ ? - m_renderData.pMonitor->m_sdrBrightness : + g_pHyprRenderer->m_renderData.pMonitor->m_sdrBrightness > 0 && + g_pHyprRenderer->m_renderData.pMonitor->m_imageDescription->value().transferFunction == + NColorManagement::CM_TRANSFER_FUNCTION_ST2084_PQ ? + g_pHyprRenderer->m_renderData.pMonitor->m_sdrBrightness : 1.0f); } else shader = useShader(getShaderVariant(SH_FRAG_BLURPREPARE)); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox(MONITORBOX, *PBLEND ? HYPRUTILS_TRANSFORM_NORMAL : TRANSFORM); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox(MONITORBOX, *PBLEND ? HYPRUTILS_TRANSFORM_NORMAL : TRANSFORM); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); shader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); shader->setUniformFloat(SHADER_CONTRAST, *PBLURCONTRAST); shader->setUniformFloat(SHADER_BRIGHTNESS, *PBLURBRIGHTNESS); @@ -1778,12 +1792,14 @@ SP<IFramebuffer> CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* or shader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); shader->setUniformFloat(SHADER_RADIUS, *PBLURSIZE * a); // this makes the blursize change with a if (frag == SH_FRAG_BLUR1) { - shader->setUniformFloat2(SHADER_HALFPIXEL, 0.5f / (m_renderData.pMonitor->m_pixelSize.x / 2.f), 0.5f / (m_renderData.pMonitor->m_pixelSize.y / 2.f)); + shader->setUniformFloat2(SHADER_HALFPIXEL, 0.5f / (g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x / 2.f), + 0.5f / (g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y / 2.f)); shader->setUniformInt(SHADER_PASSES, BLUR_PASSES); shader->setUniformFloat(SHADER_VIBRANCY, *PBLURVIBRANCY); shader->setUniformFloat(SHADER_VIBRANCY_DARKNESS, *PBLURVIBRANCYDARKNESS); } else - shader->setUniformFloat2(SHADER_HALFPIXEL, 0.5f / (m_renderData.pMonitor->m_pixelSize.x * 2.f), 0.5f / (m_renderData.pMonitor->m_pixelSize.y * 2.f)); + shader->setUniformFloat2(SHADER_HALFPIXEL, 0.5f / (g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x * 2.f), + 0.5f / (g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y * 2.f)); shader->setUniformInt(SHADER_TEX, 0); glBindVertexArray(shader->getUniformLocation(SHADER_SHADER_VAO)); @@ -1961,34 +1977,36 @@ void CHyprOpenGLImpl::preBlurForCurrentMonitor() { TRACY_GPU_ZONE("RenderPreBlurForCurrentMonitor"); - const auto SAVEDRENDERMODIF = m_renderData.renderModif; - m_renderData.renderModif = {}; // fix shit + const auto SAVEDRENDERMODIF = g_pHyprRenderer->m_renderData.renderModif; + g_pHyprRenderer->m_renderData.renderModif = {}; // fix shit // make the fake dmg - CRegion fakeDamage{0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; + CRegion fakeDamage{0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; const auto POUTFB = blurMainFramebufferWithDamage(1, &fakeDamage); // render onto blurFB - if (!m_renderData.pMonitor->m_blurFB) - m_renderData.pMonitor->m_blurFB = g_pHyprRenderer->createFB(); + if (!g_pHyprRenderer->m_renderData.pMonitor->m_blurFB) + g_pHyprRenderer->m_renderData.pMonitor->m_blurFB = g_pHyprRenderer->createFB(); - m_renderData.pMonitor->m_blurFB->alloc(m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y, m_renderData.pMonitor->m_output->state->state().drmFormat); - m_renderData.pMonitor->m_blurFB->bind(); + g_pHyprRenderer->m_renderData.pMonitor->m_blurFB->alloc(g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y, + g_pHyprRenderer->m_renderData.pMonitor->m_output->state->state().drmFormat); + g_pHyprRenderer->m_renderData.pMonitor->m_blurFB->bind(); clear(CHyprColor(0, 0, 0, 0)); g_pHyprRenderer->pushMonitorTransformEnabled(true); - renderTextureInternal(POUTFB->getTexture(), CBox{0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}, + renderTextureInternal(POUTFB->getTexture(), + CBox{0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}, STextureRenderData{.damage = &fakeDamage, .a = 1, .round = 0, .roundingPower = 2.F, .discardActive = false, .allowCustomUV = false, .noAA = true}); g_pHyprRenderer->popMonitorTransformEnabled(); - m_renderData.currentFB->bind(); + g_pHyprRenderer->m_renderData.currentFB->bind(); - m_renderData.pMonitor->m_blurFBDirty = false; + g_pHyprRenderer->m_renderData.pMonitor->m_blurFBDirty = false; - m_renderData.renderModif = SAVEDRENDERMODIF; + g_pHyprRenderer->m_renderData.renderModif = SAVEDRENDERMODIF; - m_renderData.pMonitor->m_blurFBShouldRender = false; + g_pHyprRenderer->m_renderData.pMonitor->m_blurFBShouldRender = false; } void CHyprOpenGLImpl::preWindowPass() { @@ -2002,34 +2020,34 @@ bool CHyprOpenGLImpl::preBlurQueued() { static auto PBLURNEWOPTIMIZE = CConfigValue<Hyprlang::INT>("decoration:blur:new_optimizations"); static auto PBLUR = CConfigValue<Hyprlang::INT>("decoration:blur:enabled"); - return m_renderData.pMonitor->m_blurFBDirty && *PBLURNEWOPTIMIZE && *PBLUR && m_renderData.pMonitor->m_blurFBShouldRender; + return g_pHyprRenderer->m_renderData.pMonitor->m_blurFBDirty && *PBLURNEWOPTIMIZE && *PBLUR && g_pHyprRenderer->m_renderData.pMonitor->m_blurFBShouldRender; } void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP<ITexture> tex, const CBox& box, const STextureRenderData& data) { - RASSERT(m_renderData.pMonitor, "Tried to render texture with blur without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render texture with blur without begin()!"); TRACY_GPU_ZONE("RenderTextureWithBlur"); static auto PBLEND = CConfigValue<Hyprlang::INT>("render:use_shader_blur_blend"); // make a damage region for this window - CRegion texDamage{m_renderData.damage}; + CRegion texDamage{g_pHyprRenderer->m_renderData.damage}; texDamage.intersect(box.x, box.y, box.width, box.height); // While renderTextureInternalWithDamage will clip the blur as well, // clipping texDamage here allows blur generation to be optimized. - if (!m_renderData.clipRegion.empty()) - texDamage.intersect(m_renderData.clipRegion); + if (!g_pHyprRenderer->m_renderData.clipRegion.empty()) + texDamage.intersect(g_pHyprRenderer->m_renderData.clipRegion); if (texDamage.empty()) return; - m_renderData.renderModif.applyToRegion(texDamage); + g_pHyprRenderer->m_renderData.renderModif.applyToRegion(texDamage); // amazing hack: the surface has an opaque region! CRegion inverseOpaque; - if (data.a >= 1.f && data.surface && std::round(data.surface->m_current.size.x * m_renderData.pMonitor->m_scale) == box.w && - std::round(data.surface->m_current.size.y * m_renderData.pMonitor->m_scale) == box.h) { + if (data.a >= 1.f && data.surface && std::round(data.surface->m_current.size.x * g_pHyprRenderer->m_renderData.pMonitor->m_scale) == box.w && + std::round(data.surface->m_current.size.y * g_pHyprRenderer->m_renderData.pMonitor->m_scale) == box.h) { pixman_box32_t surfbox = {0, 0, data.surface->m_current.size.x * data.surface->m_current.scale, data.surface->m_current.size.y * data.surface->m_current.scale}; inverseOpaque = data.surface->m_current.opaque; inverseOpaque.invert(&surfbox).intersect(0, 0, data.surface->m_current.size.x * data.surface->m_current.scale, @@ -2042,25 +2060,27 @@ void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP<ITexture> tex, const CBox } else inverseOpaque = {0, 0, box.width, box.height}; - inverseOpaque.scale(m_renderData.pMonitor->m_scale); + inverseOpaque.scale(g_pHyprRenderer->m_renderData.pMonitor->m_scale); // vvv TODO: layered blur fbs? - const bool USENEWOPTIMIZE = g_pHyprRenderer->shouldUseNewBlurOptimizations(m_renderData.currentLS.lock(), m_renderData.currentWindow.lock()) && !data.blockBlurOptimization; + const bool USENEWOPTIMIZE = + g_pHyprRenderer->shouldUseNewBlurOptimizations(g_pHyprRenderer->m_renderData.currentLS.lock(), g_pHyprRenderer->m_renderData.currentWindow.lock()) && + !data.blockBlurOptimization; SP<IFramebuffer> POUTFB = nullptr; if (!USENEWOPTIMIZE) { inverseOpaque.translate(box.pos()); - m_renderData.renderModif.applyToRegion(inverseOpaque); + g_pHyprRenderer->m_renderData.renderModif.applyToRegion(inverseOpaque); inverseOpaque.intersect(texDamage); POUTFB = blurMainFramebufferWithDamage(data.a, &inverseOpaque); } else - POUTFB = m_renderData.pMonitor->m_blurFB; + POUTFB = g_pHyprRenderer->m_renderData.pMonitor->m_blurFB; - m_renderData.currentFB->bind(); + g_pHyprRenderer->m_renderData.currentFB->bind(); auto blurredBG = POUTFB->getTexture(); - const auto NEEDS_STENCIL = m_renderData.discardMode != 0 && (!data.blockBlurOptimization || (m_renderData.discardMode & DISCARD_ALPHA)); + const auto NEEDS_STENCIL = g_pHyprRenderer->m_renderData.discardMode != 0 && (!data.blockBlurOptimization || (g_pHyprRenderer->m_renderData.discardMode & DISCARD_ALPHA)); if (!*PBLEND) { if (NEEDS_STENCIL) { @@ -2090,24 +2110,24 @@ void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP<ITexture> tex, const CBox } // stencil done. Render everything. - const auto LASTTL = m_renderData.primarySurfaceUVTopLeft; - const auto LASTBR = m_renderData.primarySurfaceUVBottomRight; + const auto LASTTL = g_pHyprRenderer->m_renderData.primarySurfaceUVTopLeft; + const auto LASTBR = g_pHyprRenderer->m_renderData.primarySurfaceUVBottomRight; CBox transformedBox = box; - transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)), m_renderData.pMonitor->m_transformedSize.x, - m_renderData.pMonitor->m_transformedSize.y); + transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)), + g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); - CBox monitorSpaceBox = {transformedBox.pos().x / m_renderData.pMonitor->m_pixelSize.x * m_renderData.pMonitor->m_transformedSize.x, - transformedBox.pos().y / m_renderData.pMonitor->m_pixelSize.y * m_renderData.pMonitor->m_transformedSize.y, - transformedBox.width / m_renderData.pMonitor->m_pixelSize.x * m_renderData.pMonitor->m_transformedSize.x, - transformedBox.height / m_renderData.pMonitor->m_pixelSize.y * m_renderData.pMonitor->m_transformedSize.y}; + CBox monitorSpaceBox = {transformedBox.pos().x / g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x * g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, + transformedBox.pos().y / g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y * g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y, + transformedBox.width / g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x * g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, + transformedBox.height / g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y * g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; - m_renderData.primarySurfaceUVTopLeft = monitorSpaceBox.pos() / m_renderData.pMonitor->m_transformedSize; - m_renderData.primarySurfaceUVBottomRight = (monitorSpaceBox.pos() + monitorSpaceBox.size()) / m_renderData.pMonitor->m_transformedSize; + g_pHyprRenderer->m_renderData.primarySurfaceUVTopLeft = monitorSpaceBox.pos() / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize; + g_pHyprRenderer->m_renderData.primarySurfaceUVBottomRight = (monitorSpaceBox.pos() + monitorSpaceBox.size()) / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize; static auto PBLURIGNOREOPACITY = CConfigValue<Hyprlang::INT>("decoration:blur:ignore_opacity"); g_pHyprRenderer->pushMonitorTransformEnabled(true); - bool renderModif = m_renderData.renderModif.enabled; + bool renderModif = g_pHyprRenderer->m_renderData.renderModif.enabled; if (!USENEWOPTIMIZE) setRenderModifEnabled(false); renderTextureInternal(blurredBG, box, @@ -2129,8 +2149,8 @@ void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP<ITexture> tex, const CBox if (NEEDS_STENCIL) setCapStatus(GL_STENCIL_TEST, false); - m_renderData.primarySurfaceUVTopLeft = LASTTL; - m_renderData.primarySurfaceUVBottomRight = LASTBR; + g_pHyprRenderer->m_renderData.primarySurfaceUVTopLeft = LASTTL; + g_pHyprRenderer->m_renderData.primarySurfaceUVBottomRight = LASTBR; } // draw window @@ -2150,27 +2170,27 @@ void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP<ITexture> tex, const CBox .blurredBG = blurredBG, }); - GLFB(m_renderData.currentFB)->invalidate({GL_STENCIL_ATTACHMENT}); + GLFB(g_pHyprRenderer->m_renderData.currentFB)->invalidate({GL_STENCIL_ATTACHMENT}); scissor(nullptr); } void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& grad, SBorderRenderData data) { RASSERT((box.width > 0 && box.height > 0), "Tried to render rect with width/height < 0!"); - RASSERT(m_renderData.pMonitor, "Tried to render rect without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render rect without begin()!"); TRACY_GPU_ZONE("RenderBorder"); - if (m_renderData.damage.empty()) + if (g_pHyprRenderer->m_renderData.damage.empty()) return; CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); if (data.borderSize < 1) return; - int scaledBorderSize = std::round(data.borderSize * m_renderData.pMonitor->m_scale); - scaledBorderSize = std::round(scaledBorderSize * m_renderData.renderModif.combinedScale()); + int scaledBorderSize = std::round(data.borderSize * g_pHyprRenderer->m_renderData.pMonitor->m_scale); + scaledBorderSize = std::round(scaledBorderSize * g_pHyprRenderer->m_renderData.renderModif.combinedScale()); // adjust box newBox.x -= scaledBorderSize; @@ -2180,10 +2200,12 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr float round = data.round + (data.round == 0 ? 0 : scaledBorderSize); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, Math::wlTransformToHyprutils(Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox( + newBox, + Math::wlTransformToHyprutils( + Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : g_pHyprRenderer->m_renderData.pMonitor->m_transform)), newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); const auto BLEND = m_blend; blend(true); @@ -2206,8 +2228,8 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr shader->setUniformInt(SHADER_GRADIENT2_LENGTH, 0); CBox transformedBox = newBox; - transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)), m_renderData.pMonitor->m_transformedSize.x, - m_renderData.pMonitor->m_transformedSize.y); + transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)), + g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); const auto TOPLEFT = Vector2D(transformedBox.x, transformedBox.y); const auto FULLSIZE = Vector2D(transformedBox.width, transformedBox.height); @@ -2224,15 +2246,15 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr // calculate the border's region, which we need to render over. No need to run the shader on // things outside there - CRegion borderRegion = m_renderData.damage.copy().intersect(newBox); + CRegion borderRegion = g_pHyprRenderer->m_renderData.damage.copy().intersect(newBox); borderRegion.subtract(box.copy().expand(-scaledBorderSize - round)); - if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) - borderRegion.intersect(m_renderData.clipBox); + if (g_pHyprRenderer->m_renderData.clipBox.width != 0 && g_pHyprRenderer->m_renderData.clipBox.height != 0) + borderRegion.intersect(g_pHyprRenderer->m_renderData.clipBox); if (!borderRegion.empty()) { borderRegion.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } @@ -2244,21 +2266,21 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& grad1, const CGradientValueData& grad2, float lerp, SBorderRenderData data) { RASSERT((box.width > 0 && box.height > 0), "Tried to render rect with width/height < 0!"); - RASSERT(m_renderData.pMonitor, "Tried to render rect without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render rect without begin()!"); TRACY_GPU_ZONE("RenderBorder2"); - if (m_renderData.damage.empty()) + if (g_pHyprRenderer->m_renderData.damage.empty()) return; CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); if (data.borderSize < 1) return; - int scaledBorderSize = std::round(data.borderSize * m_renderData.pMonitor->m_scale); - scaledBorderSize = std::round(scaledBorderSize * m_renderData.renderModif.combinedScale()); + int scaledBorderSize = std::round(data.borderSize * g_pHyprRenderer->m_renderData.pMonitor->m_scale); + scaledBorderSize = std::round(scaledBorderSize * g_pHyprRenderer->m_renderData.renderModif.combinedScale()); // adjust box newBox.x -= scaledBorderSize; @@ -2268,10 +2290,12 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr float round = data.round + (data.round == 0 ? 0 : scaledBorderSize); - Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, Math::wlTransformToHyprutils(Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox( + newBox, + Math::wlTransformToHyprutils( + Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : g_pHyprRenderer->m_renderData.pMonitor->m_transform)), newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); const auto BLEND = m_blend; blend(true); @@ -2297,8 +2321,8 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr shader->setUniformFloat(SHADER_GRADIENT_LERP, lerp); CBox transformedBox = newBox; - transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(m_renderData.pMonitor->m_transform)), m_renderData.pMonitor->m_transformedSize.x, - m_renderData.pMonitor->m_transformedSize.y); + transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(g_pHyprRenderer->m_renderData.pMonitor->m_transform)), + g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y); const auto TOPLEFT = Vector2D(transformedBox.x, transformedBox.y); const auto FULLSIZE = Vector2D(transformedBox.width, transformedBox.height); @@ -2315,15 +2339,15 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr // calculate the border's region, which we need to render over. No need to run the shader on // things outside there - CRegion borderRegion = m_renderData.damage.copy().intersect(newBox); + CRegion borderRegion = g_pHyprRenderer->m_renderData.damage.copy().intersect(newBox); borderRegion.subtract(box.copy().expand(-scaledBorderSize - round)); - if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) - borderRegion.intersect(m_renderData.clipBox); + if (g_pHyprRenderer->m_renderData.clipBox.width != 0 && g_pHyprRenderer->m_renderData.clipBox.height != 0) + borderRegion.intersect(g_pHyprRenderer->m_renderData.clipBox); if (!borderRegion.empty()) { borderRegion.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } @@ -2333,16 +2357,16 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr } void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roundingPower, int range, const CHyprColor& color, float a) { - RASSERT(m_renderData.pMonitor, "Tried to render shadow without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render shadow without begin()!"); RASSERT((box.width > 0 && box.height > 0), "Tried to render shadow with width/height < 0!"); - if (m_renderData.damage.empty()) + if (g_pHyprRenderer->m_renderData.damage.empty()) return; TRACY_GPU_ZONE("RenderShadow"); CBox newBox = box; - m_renderData.renderModif.applyToBox(newBox); + g_pHyprRenderer->m_renderData.renderModif.applyToBox(newBox); static auto PSHADOWPOWER = CConfigValue<Hyprlang::INT>("decoration:shadow:render_power"); @@ -2350,10 +2374,12 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun const auto col = color; - Mat3x3 matrix = m_renderData.monitorProjection.projectBox( - newBox, Math::wlTransformToHyprutils(Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), + Mat3x3 matrix = g_pHyprRenderer->m_renderData.monitorProjection.projectBox( + newBox, + Math::wlTransformToHyprutils( + Math::invertTransform(!g_pHyprRenderer->m_monitorTransformEnabled ? WL_OUTPUT_TRANSFORM_NORMAL : g_pHyprRenderer->m_renderData.pMonitor->m_transform)), newBox.rot); - Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); + Mat3x3 glMatrix = g_pHyprRenderer->m_renderData.projection.copy().multiply(matrix); blend(true); @@ -2381,19 +2407,20 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun glBindVertexArray(shader->getUniformLocation(SHADER_SHADER_VAO)); - if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { - CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; - damageClip.intersect(m_renderData.damage); + if (g_pHyprRenderer->m_renderData.clipBox.width != 0 && g_pHyprRenderer->m_renderData.clipBox.height != 0) { + CRegion damageClip{g_pHyprRenderer->m_renderData.clipBox.x, g_pHyprRenderer->m_renderData.clipBox.y, g_pHyprRenderer->m_renderData.clipBox.width, + g_pHyprRenderer->m_renderData.clipBox.height}; + damageClip.intersect(g_pHyprRenderer->m_renderData.damage); if (!damageClip.empty()) { damageClip.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } } else { - m_renderData.damage.forEachRect([this](const auto& RECT) { - scissor(&RECT, m_renderData.transformDamage); + g_pHyprRenderer->m_renderData.damage.forEachRect([this](const auto& RECT) { + scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); } @@ -2402,20 +2429,21 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun } void CHyprOpenGLImpl::saveBufferForMirror(const CBox& box) { - if (!m_renderData.pMonitor->m_monitorMirrorFB) - m_renderData.pMonitor->m_monitorMirrorFB = g_pHyprRenderer->createFB(); + if (!g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB) + g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB = g_pHyprRenderer->createFB(); - if (!m_renderData.pMonitor->m_monitorMirrorFB->isAllocated()) - m_renderData.pMonitor->m_monitorMirrorFB->alloc(m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y, - m_renderData.pMonitor->m_output->state->state().drmFormat); + if (!g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB->isAllocated()) + g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB->alloc(g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x, + g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y, + g_pHyprRenderer->m_renderData.pMonitor->m_output->state->state().drmFormat); - m_renderData.pMonitor->m_monitorMirrorFB->bind(); + g_pHyprRenderer->m_renderData.pMonitor->m_monitorMirrorFB->bind(); blend(false); - renderTexture(m_renderData.currentFB->getTexture(), box, + renderTexture(g_pHyprRenderer->m_renderData.currentFB->getTexture(), box, STextureRenderData{ - .damage = &m_renderData.finalDamage, + .damage = &g_pHyprRenderer->m_renderData.finalDamage, .a = 1.F, .round = 0, .discardActive = false, @@ -2425,12 +2453,12 @@ void CHyprOpenGLImpl::saveBufferForMirror(const CBox& box) { blend(true); - m_renderData.currentFB->bind(); + g_pHyprRenderer->m_renderData.currentFB->bind(); } void CHyprOpenGLImpl::renderMirrored() { - auto monitor = m_renderData.pMonitor; + auto monitor = g_pHyprRenderer->m_renderData.pMonitor; auto mirrored = monitor->m_mirrorOf; const double scale = std::min(monitor->m_transformedSize.x / mirrored->m_transformedSize.x, monitor->m_transformedSize.y / mirrored->m_transformedSize.y); @@ -2531,7 +2559,7 @@ WP<CShader> CHyprOpenGLImpl::useShader(WP<CShader> prog) { } void CHyprOpenGLImpl::createBGTextureForMonitor(PHLMONITOR pMonitor) { - RASSERT(m_renderData.pMonitor, "Tried to createBGTex without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to createBGTex without begin()!"); Log::logger->log(Log::DEBUG, "Creating a texture for BGTex"); @@ -2608,17 +2636,17 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(PHLMONITOR pMonitor) { // first render the background if (backgroundTexture) { - const double MONRATIO = m_renderData.pMonitor->m_transformedSize.x / m_renderData.pMonitor->m_transformedSize.y; + const double MONRATIO = g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x / g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y; const double WPRATIO = backgroundTexture->m_size.x / backgroundTexture->m_size.y; Vector2D origin; double scale = 1.0; if (MONRATIO > WPRATIO) { - scale = m_renderData.pMonitor->m_transformedSize.x / backgroundTexture->m_size.x; - origin.y = (m_renderData.pMonitor->m_transformedSize.y - backgroundTexture->m_size.y * scale) / 2.0; + scale = g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x / backgroundTexture->m_size.x; + origin.y = (g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y - backgroundTexture->m_size.y * scale) / 2.0; } else { - scale = m_renderData.pMonitor->m_transformedSize.y / backgroundTexture->m_size.y; - origin.x = (m_renderData.pMonitor->m_transformedSize.x - backgroundTexture->m_size.x * scale) / 2.0; + scale = g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y / backgroundTexture->m_size.y; + origin.x = (g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x - backgroundTexture->m_size.x * scale) / 2.0; } CBox texbox = CBox{origin, backgroundTexture->m_size * scale}; @@ -2629,8 +2657,8 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(PHLMONITOR pMonitor) { renderTextureInternal(tex, monbox, {.damage = &fakeDamage, .a = 1.0}); // bind back - if (m_renderData.currentFB) - m_renderData.currentFB->bind(); + if (g_pHyprRenderer->m_renderData.currentFB) + g_pHyprRenderer->m_renderData.currentFB->bind(); Log::logger->log(Log::DEBUG, "Background created for monitor {}", pMonitor->m_name); @@ -2643,21 +2671,21 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(PHLMONITOR pMonitor) { } void CHyprOpenGLImpl::clearWithTex() { - RASSERT(m_renderData.pMonitor, "Tried to render BGtex without begin()!"); + RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render BGtex without begin()!"); static auto PBACKGROUNDCOLOR = CConfigValue<Hyprlang::INT>("misc:background_color"); - auto TEXIT = m_monitorBGFBs.find(m_renderData.pMonitor); + auto TEXIT = m_monitorBGFBs.find(g_pHyprRenderer->m_renderData.pMonitor); if (TEXIT == m_monitorBGFBs.end()) { - createBGTextureForMonitor(m_renderData.pMonitor.lock()); + createBGTextureForMonitor(g_pHyprRenderer->m_renderData.pMonitor.lock()); g_pHyprRenderer->m_renderPass.add(makeUnique<CClearPassElement>(CClearPassElement::SClearData{CHyprColor(*PBACKGROUNDCOLOR)})); } if (TEXIT != m_monitorBGFBs.end()) { CTexPassElement::SRenderData data; - data.box = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; - data.a = m_renderData.pMonitor->m_backgroundOpacity->value(); + data.box = {0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; + data.a = g_pHyprRenderer->m_renderData.pMonitor->m_backgroundOpacity->value(); data.flipEndFrame = true; data.tex = TEXIT->second->getTexture(); g_pHyprRenderer->m_renderPass.add(makeUnique<CTexPassElement>(std::move(data))); @@ -2681,44 +2709,44 @@ void CHyprOpenGLImpl::destroyMonitorResources(PHLMONITORREF pMonitor) { } void CHyprOpenGLImpl::saveMatrix() { - m_renderData.savedProjection = m_renderData.projection; + g_pHyprRenderer->m_renderData.savedProjection = g_pHyprRenderer->m_renderData.projection; } void CHyprOpenGLImpl::setMatrixScaleTranslate(const Vector2D& translate, const float& scale) { - m_renderData.projection.scale(scale).translate(translate); + g_pHyprRenderer->m_renderData.projection.scale(scale).translate(translate); } void CHyprOpenGLImpl::restoreMatrix() { - m_renderData.projection = m_renderData.savedProjection; + g_pHyprRenderer->m_renderData.projection = g_pHyprRenderer->m_renderData.savedProjection; } void CHyprOpenGLImpl::bindOffMain() { - if (!m_renderData.pMonitor->m_offMainFB) - m_renderData.pMonitor->m_offMainFB = g_pHyprRenderer->createFB(); + if (!g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB) + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB = g_pHyprRenderer->createFB(); - if (!m_renderData.pMonitor->m_offMainFB->isAllocated()) { - m_renderData.pMonitor->m_offMainFB->addStencil(m_renderData.pMonitor->m_stencilTex); - m_renderData.pMonitor->m_offMainFB->alloc(m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y, - m_renderData.pMonitor->m_output->state->state().drmFormat); + if (!g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->isAllocated()) { + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->addStencil(g_pHyprRenderer->m_renderData.pMonitor->m_stencilTex); + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->alloc(g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_pixelSize.y, + g_pHyprRenderer->m_renderData.pMonitor->m_output->state->state().drmFormat); } - m_renderData.pMonitor->m_offMainFB->bind(); + g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB->bind(); clear(CHyprColor(0, 0, 0, 0)); - m_renderData.currentFB = m_renderData.pMonitor->m_offMainFB; + g_pHyprRenderer->m_renderData.currentFB = g_pHyprRenderer->m_renderData.pMonitor->m_offMainFB; } void CHyprOpenGLImpl::renderOffToMain(CGLFramebuffer* off) { - CBox monbox = {0, 0, m_renderData.pMonitor->m_transformedSize.x, m_renderData.pMonitor->m_transformedSize.y}; + CBox monbox = {0, 0, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.x, g_pHyprRenderer->m_renderData.pMonitor->m_transformedSize.y}; renderTexturePrimitive(off->getTexture(), monbox); } void CHyprOpenGLImpl::bindBackOnMain() { - m_renderData.mainFB->bind(); - m_renderData.currentFB = m_renderData.mainFB; + g_pHyprRenderer->m_renderData.mainFB->bind(); + g_pHyprRenderer->m_renderData.currentFB = g_pHyprRenderer->m_renderData.mainFB; } void CHyprOpenGLImpl::setRenderModifEnabled(bool enabled) { - m_renderData.renderModif.enabled = enabled; + g_pHyprRenderer->m_renderData.renderModif.enabled = enabled; } void CHyprOpenGLImpl::setViewport(GLint x, GLint y, GLsizei width, GLsizei height) { |
