summaryrefslogtreecommitdiff
path: root/sway/desktop/fx_renderer/fx_renderer.c
diff options
context:
space:
mode:
authorozwaldorf <[email protected]>2024-01-03 12:38:44 -0500
committerGitHub <[email protected]>2024-01-03 12:38:44 -0500
commit04b657b58cf54ac611f73723ec44f51feba16b15 (patch)
treee8c310f8957ded3304503dc1d908b8a233bbae20 /sway/desktop/fx_renderer/fx_renderer.c
parent1c5c60d9280eb0b13d9884366bdeaf3748b04308 (diff)
feat: blur tweaks (#258)
Diffstat (limited to 'sway/desktop/fx_renderer/fx_renderer.c')
-rw-r--r--sway/desktop/fx_renderer/fx_renderer.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/sway/desktop/fx_renderer/fx_renderer.c b/sway/desktop/fx_renderer/fx_renderer.c
index 7196bb0e..089e1693 100644
--- a/sway/desktop/fx_renderer/fx_renderer.c
+++ b/sway/desktop/fx_renderer/fx_renderer.c
@@ -23,6 +23,7 @@
// shaders
#include "blur1_frag_src.h"
#include "blur2_frag_src.h"
+#include "blur_effects_frag_src.h"
#include "box_shadow_frag_src.h"
#include "common_vert_src.h"
#include "corner_frag_src.h"
@@ -107,6 +108,25 @@ static bool link_blur_program(struct blur_shader *shader, const char *shader_pro
return true;
}
+static bool link_blur_effects_program(struct effects_shader *shader, const char *shader_program) {
+ GLuint prog;
+ shader->program = prog = link_program(shader_program);
+ if (!shader->program) {
+ return false;
+ }
+ shader->proj = glGetUniformLocation(prog, "proj");
+ shader->tex = glGetUniformLocation(prog, "tex");
+ shader->pos_attrib = glGetAttribLocation(prog, "pos");
+ shader->tex_attrib = glGetAttribLocation(prog, "texcoord");
+ shader->noise = glGetUniformLocation(prog, "noise");
+ shader->brightness = glGetUniformLocation(prog, "brightness");
+ shader->contrast = glGetUniformLocation(prog, "contrast");
+ shader->saturation = glGetUniformLocation(prog, "saturation");
+
+ return true;
+
+}
+
static bool link_box_shadow_program(struct box_shadow_shader *shader) {
GLuint prog;
shader->program = prog = link_program(box_shadow_frag_src);
@@ -305,6 +325,10 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl, struct wlr_output *w
if (!link_blur_program(&renderer->shaders.blur2, blur2_frag_src)) {
goto error;
}
+ // effects shader
+ if (!link_blur_effects_program(&renderer->shaders.blur_effects, blur_effects_frag_src)) {
+ goto error;
+ }
// box shadow shader
if (!link_box_shadow_program(&renderer->shaders.box_shadow)) {
goto error;
@@ -365,6 +389,7 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl, struct wlr_output *w
error:
glDeleteProgram(renderer->shaders.blur1.program);
glDeleteProgram(renderer->shaders.blur2.program);
+ glDeleteProgram(renderer->shaders.blur_effects.program);
glDeleteProgram(renderer->shaders.box_shadow.program);
glDeleteProgram(renderer->shaders.corner.program);
glDeleteProgram(renderer->shaders.quad.program);
@@ -899,3 +924,39 @@ void fx_render_blur(struct fx_renderer *renderer, const float matrix[static 9],
glDisableVertexAttribArray(shader->tex_attrib);
}
+
+void fx_render_blur_effects(struct fx_renderer *renderer, const float matrix[static 9],
+ struct fx_framebuffer **buffer, float blur_noise, float blur_brightness,
+ float blur_contrast, float blur_saturation) {
+ struct effects_shader shader = renderer->shaders.blur_effects;
+
+ glEnable(GL_BLEND);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture((*buffer)->texture.target, (*buffer)->texture.id);
+ glTexParameteri((*buffer)->texture.target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ glUseProgram(shader.program);
+
+ // OpenGL ES 2 requires the glUniformMatrix3fv transpose parameter to be set
+ // to GL_FALSE
+ float gl_matrix[9];
+ wlr_matrix_transpose(gl_matrix, matrix);
+ glUniformMatrix3fv(shader.proj, 1, GL_FALSE, gl_matrix);
+
+ glUniform1i(shader.tex, 0);
+ glUniform1f(shader.noise, blur_noise);
+ glUniform1f(shader.brightness, blur_brightness);
+ glUniform1f(shader.contrast, blur_contrast);
+ glUniform1f(shader.saturation, blur_saturation);
+
+ glVertexAttribPointer(shader.pos_attrib, 2, GL_FLOAT, GL_FALSE, 0, verts);
+ glVertexAttribPointer(shader.tex_attrib, 2, GL_FLOAT, GL_FALSE, 0, verts);
+
+ glEnableVertexAttribArray(shader.pos_attrib);
+ glEnableVertexAttribArray(shader.tex_attrib);
+
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+ glDisableVertexAttribArray(shader.pos_attrib);
+ glDisableVertexAttribArray(shader.tex_attrib);
+}