summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-05 17:01:44 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-05 17:01:44 +0200
commitdcb6fc269a1360f6d46836d34db4964779ce5879 (patch)
tree431323fbd5a8a789c86780715e0ea7e791da2851 /src/render
parent3385269dcadf286aaab0f8e23147a956c13d7699 (diff)
support all shaders rounded and fix RGBX borders
Diffstat (limited to 'src/render')
-rw-r--r--src/render/OpenGL.cpp6
-rw-r--r--src/render/Renderer.cpp8
-rw-r--r--src/render/Shaders.hpp82
3 files changed, 88 insertions, 8 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 335e9f9a..1e5ec07d 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -181,19 +181,17 @@ void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float
CShader* shader = nullptr;
+ glEnable(GL_BLEND);
+
switch (tex.m_iType) {
case TEXTURE_RGBA:
shader = &m_shRGBA;
- glEnable(GL_BLEND);
break;
case TEXTURE_RGBX:
shader = &m_shRGBX;
- if (alpha == 255.f)
- glDisable(GL_BLEND);
break;
case TEXTURE_EXTERNAL:
shader = &m_shEXT;
- glEnable(GL_BLEND);
break;
default:
RASSERT(false, "tex.m_iTarget unsupported!");
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index c3ec7994..8ba7a933 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -82,10 +82,6 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(SMonitor* pMonitor, SWor
}
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;
SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y};
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);
+ // border
+ if (decorate && !pWindow->m_bX11DoesntWantBorders)
+ drawBorderForWindow(pWindow, pMonitor);
+
if (pWindow->m_bIsX11) {
if (pWindow->m_uSurface.xwayland->surface) {
wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata);
diff --git a/src/render/Shaders.hpp b/src/render/Shaders.hpp
index 78892d5f..b8239c57 100644
--- a/src/render/Shaders.hpp
+++ b/src/render/Shaders.hpp
@@ -93,7 +93,48 @@ varying vec2 v_texcoord;
uniform sampler2D tex;
uniform float alpha;
+uniform vec2 topLeft;
+uniform vec2 bottomRight;
+uniform vec2 fullSize;
+uniform float radius;
+
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;
})#";
@@ -105,6 +146,47 @@ varying vec2 v_texcoord;
uniform samplerExternalOES texture0;
uniform float alpha;
+uniform vec2 topLeft;
+uniform vec2 bottomRight;
+uniform vec2 fullSize;
+uniform float radius;
+
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;
})#"; \ No newline at end of file