mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-23 05:45:58 +01:00
fixed borders on no blur
This commit is contained in:
parent
146b189d54
commit
464c4aa395
1 changed files with 46 additions and 8 deletions
|
@ -356,6 +356,17 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b
|
||||||
glEnableVertexAttribArray(shader->posAttrib);
|
glEnableVertexAttribArray(shader->posAttrib);
|
||||||
glEnableVertexAttribArray(shader->texAttrib);
|
glEnableVertexAttribArray(shader->texAttrib);
|
||||||
|
|
||||||
|
// stencil for when we want a border
|
||||||
|
if (border) {
|
||||||
|
glClearStencil(0);
|
||||||
|
glClear(GL_STENCIL_BUFFER_BIT);
|
||||||
|
|
||||||
|
glEnable(GL_STENCIL_TEST);
|
||||||
|
|
||||||
|
glStencilFunc(GL_ALWAYS, 1, -1);
|
||||||
|
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
||||||
|
}
|
||||||
|
|
||||||
if (pixman_region32_not_empty(m_RenderData.pDamage)) {
|
if (pixman_region32_not_empty(m_RenderData.pDamage)) {
|
||||||
PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) {
|
PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) {
|
||||||
const auto RECT = RECTSARR[i];
|
const auto RECT = RECTSARR[i];
|
||||||
|
@ -364,10 +375,27 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (border) {
|
||||||
|
glStencilFunc(GL_EQUAL, 1, -1);
|
||||||
|
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||||
|
}
|
||||||
|
|
||||||
glDisableVertexAttribArray(shader->posAttrib);
|
glDisableVertexAttribArray(shader->posAttrib);
|
||||||
glDisableVertexAttribArray(shader->texAttrib);
|
glDisableVertexAttribArray(shader->texAttrib);
|
||||||
|
|
||||||
glBindTexture(tex.m_iTarget, 0);
|
glBindTexture(tex.m_iTarget, 0);
|
||||||
|
|
||||||
|
// if border draw
|
||||||
|
// we dont disable stencil here if we havent touched it.
|
||||||
|
// some other func might be using it.
|
||||||
|
if (border) {
|
||||||
|
auto BORDERCOL = m_pCurrentWindow->m_cRealBorderColor.col();
|
||||||
|
BORDERCOL.a *= alpha / 255.f;
|
||||||
|
renderBorder(pBox, BORDERCOL, g_pConfigManager->getInt("general:border_size"), round);
|
||||||
|
glStencilMask(-1);
|
||||||
|
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This probably isn't the fastest
|
// This probably isn't the fastest
|
||||||
|
@ -621,14 +649,6 @@ void CHyprOpenGLImpl::makeWindowSnapshot(CWindow* pWindow) {
|
||||||
|
|
||||||
pixman_region32_fini(&fakeDamage);
|
pixman_region32_fini(&fakeDamage);
|
||||||
|
|
||||||
const auto PFRAMEBUFFER = &m_mWindowFramebuffers[pWindow];
|
|
||||||
|
|
||||||
glViewport(0, 0, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.x, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.y);
|
|
||||||
|
|
||||||
PFRAMEBUFFER->alloc(PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y);
|
|
||||||
|
|
||||||
PFRAMEBUFFER->bind();
|
|
||||||
|
|
||||||
clear(CColor(0,0,0,0)); // JIC
|
clear(CColor(0,0,0,0)); // JIC
|
||||||
|
|
||||||
timespec now;
|
timespec now;
|
||||||
|
@ -646,6 +666,21 @@ void CHyprOpenGLImpl::makeWindowSnapshot(CWindow* pWindow) {
|
||||||
|
|
||||||
g_pConfigManager->setInt("decoration:blur", BLURVAL);
|
g_pConfigManager->setInt("decoration:blur", BLURVAL);
|
||||||
|
|
||||||
|
// render onto the window fb
|
||||||
|
// we rendered onto the primary because it has a stencil, which we need for the borders etc
|
||||||
|
const auto PFRAMEBUFFER = &m_mWindowFramebuffers[pWindow];
|
||||||
|
|
||||||
|
glViewport(0, 0, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.x, g_pHyprOpenGL->m_RenderData.pMonitor->vecPixelSize.y);
|
||||||
|
|
||||||
|
PFRAMEBUFFER->alloc(PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y);
|
||||||
|
|
||||||
|
PFRAMEBUFFER->bind();
|
||||||
|
|
||||||
|
clear(CColor(0, 0, 0, 0)); // JIC
|
||||||
|
|
||||||
|
wlr_box fullMonBox = {0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y};
|
||||||
|
renderTexture(m_mMonitorRenderResources[m_RenderData.pMonitor].primaryFB.m_cTex, &fullMonBox, 255.f, 0);
|
||||||
|
|
||||||
// restore original fb
|
// restore original fb
|
||||||
#ifndef GLES2
|
#ifndef GLES2
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_iCurrentOutputFb);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_iCurrentOutputFb);
|
||||||
|
@ -690,6 +725,9 @@ void CHyprOpenGLImpl::makeLayerSnapshot(SLayerSurface* pLayer) {
|
||||||
// draw the layer
|
// draw the layer
|
||||||
g_pHyprRenderer->renderLayer(pLayer, PMONITOR, &now);
|
g_pHyprRenderer->renderLayer(pLayer, PMONITOR, &now);
|
||||||
|
|
||||||
|
// TODO: WARN:
|
||||||
|
// revise if any stencil-requiring rendering is done to the layers.
|
||||||
|
|
||||||
// restore original fb
|
// restore original fb
|
||||||
#ifndef GLES2
|
#ifndef GLES2
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_iCurrentOutputFb);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_iCurrentOutputFb);
|
||||||
|
|
Loading…
Reference in a new issue