diff options
author | ozwaldorf <[email protected]> | 2024-01-03 12:38:44 -0500 |
---|---|---|
committer | GitHub <[email protected]> | 2024-01-03 12:38:44 -0500 |
commit | 04b657b58cf54ac611f73723ec44f51feba16b15 (patch) | |
tree | e8c310f8957ded3304503dc1d908b8a233bbae20 /sway/desktop/fx_renderer/fx_renderer.c | |
parent | 1c5c60d9280eb0b13d9884366bdeaf3748b04308 (diff) |
feat: blur tweaks (#258)
Diffstat (limited to 'sway/desktop/fx_renderer/fx_renderer.c')
-rw-r--r-- | sway/desktop/fx_renderer/fx_renderer.c | 61 |
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); +} |