support all shaders rounded and fix RGBX borders

This commit is contained in:
vaxerski 2022-04-05 17:01:44 +02:00
parent 3385269dca
commit dcb6fc269a
3 changed files with 88 additions and 8 deletions

View file

@ -181,19 +181,17 @@ void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float
CShader* shader = nullptr; CShader* shader = nullptr;
glEnable(GL_BLEND);
switch (tex.m_iType) { switch (tex.m_iType) {
case TEXTURE_RGBA: case TEXTURE_RGBA:
shader = &m_shRGBA; shader = &m_shRGBA;
glEnable(GL_BLEND);
break; break;
case TEXTURE_RGBX: case TEXTURE_RGBX:
shader = &m_shRGBX; shader = &m_shRGBX;
if (alpha == 255.f)
glDisable(GL_BLEND);
break; break;
case TEXTURE_EXTERNAL: case TEXTURE_EXTERNAL:
shader = &m_shEXT; shader = &m_shEXT;
glEnable(GL_BLEND);
break; break;
default: default:
RASSERT(false, "tex.m_iTarget unsupported!"); RASSERT(false, "tex.m_iTarget unsupported!");

View file

@ -82,10 +82,6 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(SMonitor* pMonitor, SWor
} }
void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* time, bool decorate) { void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* time, bool decorate) {
// border
if (decorate && !pWindow->m_bX11DoesntWantBorders)
drawBorderForWindow(pWindow, pMonitor);
const auto REALPOS = pWindow->m_vRealPosition; const auto REALPOS = pWindow->m_vRealPosition;
SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y}; SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y};
renderdata.surface = g_pXWaylandManager->getWindowSurface(pWindow); renderdata.surface = g_pXWaylandManager->getWindowSurface(pWindow);
@ -94,6 +90,10 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec*
wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(pWindow), renderSurface, &renderdata); wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(pWindow), renderSurface, &renderdata);
// border
if (decorate && !pWindow->m_bX11DoesntWantBorders)
drawBorderForWindow(pWindow, pMonitor);
if (pWindow->m_bIsX11) { if (pWindow->m_bIsX11) {
if (pWindow->m_uSurface.xwayland->surface) { if (pWindow->m_uSurface.xwayland->surface) {
wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata); wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata);

View file

@ -93,7 +93,48 @@ varying vec2 v_texcoord;
uniform sampler2D tex; uniform sampler2D tex;
uniform float alpha; uniform float alpha;
uniform vec2 topLeft;
uniform vec2 bottomRight;
uniform vec2 fullSize;
uniform float radius;
void main() { void main() {
vec2 pixCoord = fullSize * v_texcoord;
if (pixCoord[0] < topLeft[0]) {
// we're close left
if (pixCoord[1] < topLeft[1]) {
// top
if (distance(topLeft, pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
} else if (pixCoord[1] > bottomRight[1]) {
// bottom
if (distance(vec2(topLeft[0], bottomRight[1]), pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
}
}
else if (pixCoord[0] > bottomRight[0]) {
// we're close right
if (pixCoord[1] < topLeft[1]) {
// top
if (distance(vec2(bottomRight[0], topLeft[1]), pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
} else if (pixCoord[1] > bottomRight[1]) {
// bottom
if (distance(bottomRight, pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
}
}
gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0) * alpha; gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0) * alpha;
})#"; })#";
@ -105,6 +146,47 @@ varying vec2 v_texcoord;
uniform samplerExternalOES texture0; uniform samplerExternalOES texture0;
uniform float alpha; uniform float alpha;
uniform vec2 topLeft;
uniform vec2 bottomRight;
uniform vec2 fullSize;
uniform float radius;
void main() { void main() {
vec2 pixCoord = fullSize * v_texcoord;
if (pixCoord[0] < topLeft[0]) {
// we're close left
if (pixCoord[1] < topLeft[1]) {
// top
if (distance(topLeft, pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
} else if (pixCoord[1] > bottomRight[1]) {
// bottom
if (distance(vec2(topLeft[0], bottomRight[1]), pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
}
}
else if (pixCoord[0] > bottomRight[0]) {
// we're close right
if (pixCoord[1] < topLeft[1]) {
// top
if (distance(vec2(bottomRight[0], topLeft[1]), pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
} else if (pixCoord[1] > bottomRight[1]) {
// bottom
if (distance(bottomRight, pixCoord) > radius) {
gl_FragColor = vec4(0,0,0,0);
return;
}
}
}
gl_FragColor = texture2D(texture0, v_texcoord) * alpha; gl_FragColor = texture2D(texture0, v_texcoord) * alpha;
})#"; })#";