Skip to content

Commit c1efba8

Browse files
committed
fix,chore: misc animation, move screen shaders to get_screen_shader_source backend-specific function
1 parent e37ff89 commit c1efba8

11 files changed

Lines changed: 136 additions & 19 deletions

File tree

include/effects_backend.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ typedef struct effects_backend_t {
154154
bool (*capture_readback)(struct wlr_buffer *capture_buffer, be_output_state_t *state,
155155
uint64_t dst_fbo, int dst_w, int dst_h, int src_w, int src_h, uint64_t *out_tex);
156156

157+
const char *(*get_screen_shader_source)(const char *name);
157158
bool (*compile_screen_shader)(const char *frag_src);
158159
void (*destroy_screen_shader)(void);
159160
} effects_backend_t;

src/animation.c

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -897,8 +897,6 @@ static void update_blur_for_slide_animation(output_t *output, animation_entry_t
897897
return;
898898
if (!tl->blur || !tl->blur->blur_node)
899899
return;
900-
if (!pixman_region32_empty(&tl->blur->blur_region))
901-
return;
902900
if (!tl->blur->blur_buf)
903901
return;
904902

@@ -908,6 +906,54 @@ static void update_blur_for_slide_animation(output_t *output, animation_entry_t
908906
int x = (int)(entry->from.x + (entry->to.x - entry->from.x) * e);
909907
int y = (int)(entry->from.y + (entry->to.y - entry->from.y) * e);
910908

909+
if (!pixman_region32_empty(&tl->blur->blur_region)) {
910+
int blur_r_x = tl->blur->blur_region.extents.x1;
911+
int blur_r_y = tl->blur->blur_region.extents.y1;
912+
int blur_r_w = tl->blur->blur_region.extents.x2 - blur_r_x;
913+
int blur_r_h = tl->blur->blur_region.extents.y2 - blur_r_y;
914+
915+
int r_x = x + blur_r_x, r_y = y + blur_r_y;
916+
917+
float bw = (float)output->width;
918+
float bh = (float)output->height;
919+
float sx = (float)(r_x - output->lx);
920+
float sy = (float)(r_y - output->ly);
921+
float sw = (float)blur_r_w, sh = (float)blur_r_h;
922+
923+
if (sx < 0.0f) {
924+
sw += sx;
925+
sx = 0.0f;
926+
}
927+
if (sy < 0.0f) {
928+
sh += sy;
929+
sy = 0.0f;
930+
}
931+
if (sx >= bw || sy >= bh || sw <= 0.0f || sh <= 0.0f)
932+
return;
933+
if (sx + sw > bw)
934+
sw = bw - sx;
935+
if (sy + sh > bh)
936+
sh = bh - sy;
937+
if (sw <= 0.0f || sh <= 0.0f)
938+
return;
939+
940+
struct wlr_fbox src = {
941+
.x = sx,
942+
.y = sy,
943+
.width = sw,
944+
.height = sh
945+
};
946+
int dw = (int)sw, dh = (int)sh;
947+
948+
int offset_x = (r_x < output->lx) ? (output->lx - r_x) : 0;
949+
int offset_y = (r_y < output->ly) ? (output->ly - r_y) : 0;
950+
951+
wlr_scene_node_set_position(&tl->blur->blur_node->node, blur_r_x + offset_x, blur_r_y + offset_y);
952+
wlr_scene_buffer_set_source_box(tl->blur->blur_node, &src);
953+
wlr_scene_buffer_set_dest_size(tl->blur->blur_node, dw, dh);
954+
return;
955+
}
956+
911957
struct wlr_box r;
912958
if (c->state == STATE_FULLSCREEN)
913959
r = output->rectangle;

src/effects.c

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
#include "animation.h"
22
#include "effects.h"
33
#include "effects_backend.h"
4-
#include "gl_grayscale_frag_src.h"
5-
#include "gl_invert_frag_src.h"
6-
#include "gl_nightlight_frag_src.h"
7-
#include "gl_sepia_frag_src.h"
84
#include "layer.h"
95
#include "output.h"
106
#include "server.h"
@@ -2179,16 +2175,7 @@ bool screen_shader_set(const char *name) {
21792175
return true;
21802176
}
21812177

2182-
const char *frag_src = NULL;
2183-
if (strcmp(name, "grayscale") == 0) {
2184-
frag_src = gl_grayscale_frag_src;
2185-
} else if (strcmp(name, "invert") == 0) {
2186-
frag_src = gl_invert_frag_src;
2187-
} else if (strcmp(name, "sepia") == 0) {
2188-
frag_src = gl_sepia_frag_src;
2189-
} else if (strcmp(name, "nightlight") == 0) {
2190-
frag_src = gl_nightlight_frag_src;
2191-
}
2178+
const char *frag_src = effects_backend->get_screen_shader_source(name);
21922179

21932180
if (!frag_src)
21942181
return false;

src/effects_gles2.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <GLES2/gl2ext.h>
77
#include <stdint.h>
88
#include <stdlib.h>
9+
#include <string.h>
910
#include <time.h>
1011
#include <wlr/config.h>
1112
#include <wlr/render/allocator.h>
@@ -16,6 +17,11 @@
1617
#include <wlr/types/wlr_buffer.h>
1718
#include <wlr/util/log.h>
1819

20+
#include "gl_grayscale_frag_src.h"
21+
#include "gl_invert_frag_src.h"
22+
#include "gl_nightlight_frag_src.h"
23+
#include "gl_sepia_frag_src.h"
24+
1925
#ifdef WLR_HAS_GLES2_RENDERER
2026
const struct wlr_drm_format_set *wlr_renderer_get_render_formats(struct wlr_renderer *renderer);
2127

@@ -1061,6 +1067,18 @@ static void gles2_destroy_screen_shader(void) {
10611067
g->screen_shader_u_time = -1;
10621068
}
10631069

1070+
static const char *gles2_get_screen_shader_source(const char *name) {
1071+
if (strcmp(name, "grayscale") == 0)
1072+
return gl_grayscale_frag_src;
1073+
if (strcmp(name, "invert") == 0)
1074+
return gl_invert_frag_src;
1075+
if (strcmp(name, "sepia") == 0)
1076+
return gl_sepia_frag_src;
1077+
if (strcmp(name, "nightlight") == 0)
1078+
return gl_nightlight_frag_src;
1079+
return NULL;
1080+
}
1081+
10641082
const effects_backend_t gles2_backend = {
10651083
.init = gles2_init,
10661084
.fini = gles2_fini,
@@ -1080,6 +1098,7 @@ const effects_backend_t gles2_backend = {
10801098
.apply_corner_mask = gles2_apply_corner_mask,
10811099
.apply_screen_shader = gles2_apply_screen_shader,
10821100
.capture_readback = gles2_capture_readback,
1101+
.get_screen_shader_source = gles2_get_screen_shader_source,
10831102
.compile_screen_shader = gles2_compile_screen_shader,
10841103
.destroy_screen_shader = gles2_destroy_screen_shader,
10851104
};

src/effects_vk.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
#include <wlr/render/wlr_texture.h>
1919
#include <wlr/types/wlr_buffer.h>
2020

21+
#include "vk_grayscale_frag_src.h"
22+
#include "vk_invert_frag_src.h"
23+
#include "vk_nightlight_frag_src.h"
24+
#include "vk_sepia_frag_src.h"
25+
2126
const struct wlr_drm_format_set *wlr_renderer_get_render_formats(struct wlr_renderer *renderer);
2227

2328
#include "vk_blit_frag_src.h"
@@ -2245,6 +2250,18 @@ static void vk_destroy_screen_shader(void) {
22452250
}
22462251
}
22472252

2253+
static const char *vk_get_screen_shader_source(const char *name) {
2254+
if (strcmp(name, "grayscale") == 0)
2255+
return vk_grayscale_frag_src;
2256+
if (strcmp(name, "invert") == 0)
2257+
return vk_invert_frag_src;
2258+
if (strcmp(name, "sepia") == 0)
2259+
return vk_sepia_frag_src;
2260+
if (strcmp(name, "nightlight") == 0)
2261+
return vk_nightlight_frag_src;
2262+
return NULL;
2263+
}
2264+
22482265
const effects_backend_t vk_backend = {
22492266
.init = vk_init,
22502267
.fini = vk_fini,
@@ -2264,6 +2281,7 @@ const effects_backend_t vk_backend = {
22642281
.apply_corner_mask = vk_apply_corner_mask,
22652282
.apply_screen_shader = vk_apply_screen_shader,
22662283
.capture_readback = vk_capture_readback,
2284+
.get_screen_shader_source = vk_get_screen_shader_source,
22672285
.compile_screen_shader = vk_compile_screen_shader,
22682286
.destroy_screen_shader = vk_destroy_screen_shader,
22692287
};

src/output.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,13 @@ static void output_repaint(output_t *output) {
227227
clock_gettime(CLOCK_MONOTONIC, &now);
228228
bool animating = animation_update_output(output, now);
229229

230-
if (effects_state.available && (fs_effects || !has_fs))
231-
effects_output_frame(output, scene_output);
232-
233230
// ensure blur nodes track animated window positions during workspace slide
234231
if (animating)
235232
animation_update_slide_blur(output);
236233

234+
if (effects_state.available && (fs_effects || !has_fs))
235+
effects_output_frame(output, scene_output);
236+
237237
if (has_fs && !fs_effects && output_try_direct_scanout(output)) {
238238
clock_gettime(CLOCK_MONOTONIC, &now);
239239
wlr_scene_output_send_frame_done(scene_output, &now);

src/shaders/meson.build

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ vk_shaders = [
6666

6767
# Shadows
6868
'shadow.frag',
69+
70+
# Fullscreen effects
71+
'grayscale.frag',
72+
'invert.frag',
73+
'nightlight.frag',
74+
'sepia.frag',
6975
]
7076

7177
foreach shader : vk_shaders

src/shaders/vulkan/grayscale.frag

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#version 450
2+
layout(binding = 0) uniform sampler2D tex;
3+
layout(location = 0) in vec2 v_uv;
4+
layout(location = 0) out vec4 fragColor;
5+
void main() {
6+
vec3 c = texture(tex, v_uv).rgb;
7+
float g = dot(c, vec3(0.2126, 0.7152, 0.0722));
8+
fragColor = vec4(g, g, g, 1.0);
9+
}

src/shaders/vulkan/invert.frag

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#version 450
2+
layout(binding = 0) uniform sampler2D tex;
3+
layout(location = 0) in vec2 v_uv;
4+
layout(location = 0) out vec4 fragColor;
5+
void main() {
6+
vec3 c = texture(tex, v_uv).rgb;
7+
fragColor = vec4(1.0 - c, 1.0);
8+
}

src/shaders/vulkan/nightlight.frag

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#version 450
2+
layout(binding = 0) uniform sampler2D tex;
3+
layout(location = 0) in vec2 v_uv;
4+
layout(location = 0) out vec4 fragColor;
5+
void main() {
6+
vec3 c = texture(tex, v_uv).rgb;
7+
c.r = min(c.r * 1.05, 1.0);
8+
c.g = c.g * 0.92;
9+
c.b = c.b * 0.75;
10+
fragColor = vec4(c, 1.0);
11+
}

0 commit comments

Comments
 (0)