From 8e0e70e2d6465fc848278efb5f435167cda444c5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 4 Dec 2022 16:08:32 +0530 Subject: [PATCH] Simplify passing colors to the borders shader --- kitty/border_vertex.glsl | 29 ++++++++++++++++------------- kitty/borders.py | 4 ++-- kitty/shaders.c | 25 +++++++++---------------- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/kitty/border_vertex.glsl b/kitty/border_vertex.glsl index 0084b1c12..69762df95 100644 --- a/kitty/border_vertex.glsl +++ b/kitty/border_vertex.glsl @@ -1,11 +1,6 @@ #version GLSL_VERSION uniform uvec2 viewport; -uniform vec3 default_bg; -uniform vec3 active_border_color; -uniform vec3 inactive_border_color; -uniform vec3 bell_border_color; -uniform vec3 tab_bar_bg; -uniform vec3 tab_bar_margin_color; +uniform uint colors[9]; uniform float background_opacity; uniform float tint_opacity, tint_premult; in vec4 rect; // left, top, right, bottom @@ -30,16 +25,24 @@ float to_color(uint c) { return float(c & FF) / 255.0; } -#define W(bit_number, which_color) ((float(((1 << bit_number) & rc) >> bit_number)) * which_color) +float is_integer_value(uint c, float x) { + return 1. - step(0.5, abs(float(c) - x)); +} + +vec3 as_color_vector(uint c, int shift) { + return vec3(to_color(c >> shift), to_color(c >> (shift - 8)), to_color(c >> (shift - 16))); +} void main() { uvec2 pos = pos_map[gl_VertexID]; gl_Position = vec4(rect[pos.x], rect[pos.y], 0, 1); - int rc = int(rect_color); - vec3 window_bg = vec3(to_color(rect_color >> 24), to_color(rect_color >> 16), to_color(rect_color >> 8)); - vec3 color3 = W(0, default_bg) + W(1, active_border_color) + W(2, inactive_border_color) + W(3, window_bg) + W(4, bell_border_color) + W(5, tab_bar_bg) + W(6, tab_bar_margin_color); - float is_default_bg = float(rc & 1); - float final_opacity = is_default_bg * tint_opacity + (1 - is_default_bg) * background_opacity; - float final_premult_opacity = is_default_bg * tint_premult + (1 - is_default_bg) * background_opacity; + vec3 window_bg = as_color_vector(rect_color, 24); + uint rc = rect_color & FF; + vec3 color3 = as_color_vector(colors[rc], 16); + float is_window_bg = is_integer_value(rc, 3.); + float is_default_bg = is_integer_value(rc, 0.); + color3 = is_window_bg * window_bg + (1. - is_window_bg) * color3; + float final_opacity = is_default_bg * tint_opacity + (1. - is_default_bg) * background_opacity; + float final_premult_opacity = is_default_bg * tint_premult + (1. - is_default_bg) * background_opacity; color = vec4(color3 * final_premult_opacity, final_opacity); } diff --git a/kitty/borders.py b/kitty/borders.py index 8ac61b415..8732626e2 100644 --- a/kitty/borders.py +++ b/kitty/borders.py @@ -14,8 +14,8 @@ from .window_list import WindowGroup, WindowList class BorderColor(IntFlag): - # See the border vertex shader for how these flags become actual colors - default_bg, active, inactive, window_bg, bell, tab_bar_bg, tab_bar_margin_color = ((1 << i) for i in range(7)) + # These are indices into the array of colors in the border vertex shader + default_bg, active, inactive, window_bg, bell, tab_bar_bg, tab_bar_margin_color, tab_bar_left_edge_color, tab_bar_right_edge_color = range(9) class Border(NamedTuple): diff --git a/kitty/shaders.c b/kitty/shaders.c index 90a7f9b53..ce9495a0e 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -937,7 +937,7 @@ draw_cells(ssize_t vao_idx, ssize_t gvao_idx, const ScreenRenderData *srd, float // }}} // Borders {{{ -enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_tint_opacity, BORDER_tint_premult, BORDER_default_bg, BORDER_active_border_color, BORDER_inactive_border_color, BORDER_bell_border_color, BORDER_tab_bar_bg, BORDER_tab_bar_margin_color, NUM_BORDER_UNIFORMS }; +enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_tint_opacity, BORDER_tint_premult, BORDER_colors, NUM_BORDER_UNIFORMS }; static GLint border_uniform_locations[NUM_BORDER_UNIFORMS] = {0}; static void @@ -947,12 +947,7 @@ init_borders_program(void) { SET_LOC(background_opacity) SET_LOC(tint_opacity) SET_LOC(tint_premult) - SET_LOC(default_bg) - SET_LOC(active_border_color) - SET_LOC(inactive_border_color) - SET_LOC(bell_border_color) - SET_LOC(tab_bar_bg) - SET_LOC(tab_bar_margin_color) + SET_LOC(colors) #undef SET_LOC } @@ -993,19 +988,17 @@ draw_borders(ssize_t vao_idx, unsigned int num_border_rects, BorderRect *rect_bu if (borders_buf_address) memcpy(borders_buf_address, rect_buf, sz); unmap_vao_buffer(vao_idx, 0); } -#define CV3(x) (((float)((x >> 16) & 0xff))/255.f), (((float)((x >> 8) & 0xff))/255.f), (((float)(x & 0xff))/255.f) + color_type default_bg = (num_visible_windows > 1 && !all_windows_have_same_bg) ? OPT(background) : active_window_bg; + GLuint colors[9] = { + default_bg, OPT(active_border_color), OPT(inactive_border_color), 0, + OPT(bell_border_color), OPT(tab_bar_background), OPT(tab_bar_margin_color), + w->tab_bar_edge_color.left, w->tab_bar_edge_color.right + }; + glUniform1uiv(border_uniform_locations[BORDER_colors], arraysz(colors), colors); glUniform1f(border_uniform_locations[BORDER_background_opacity], background_opacity); glUniform1f(border_uniform_locations[BORDER_tint_opacity], tint_opacity); glUniform1f(border_uniform_locations[BORDER_tint_premult], tint_premult); - glUniform3f(border_uniform_locations[BORDER_active_border_color], CV3(OPT(active_border_color))); - glUniform3f(border_uniform_locations[BORDER_inactive_border_color], CV3(OPT(inactive_border_color))); - glUniform3f(border_uniform_locations[BORDER_bell_border_color], CV3(OPT(bell_border_color))); - glUniform3f(border_uniform_locations[BORDER_tab_bar_bg], CV3(OPT(tab_bar_background))); - glUniform3f(border_uniform_locations[BORDER_tab_bar_margin_color], CV3(OPT(tab_bar_margin_color))); glUniform2ui(border_uniform_locations[BORDER_viewport], viewport_width, viewport_height); - color_type default_bg = (num_visible_windows > 1 && !all_windows_have_same_bg) ? OPT(background) : active_window_bg; - glUniform3f(border_uniform_locations[BORDER_default_bg], CV3(default_bg)); -#undef CV3 if (has_bgimage(w)) { if (w->is_semi_transparent) { BLEND_PREMULT; } else { BLEND_ONTO_OPAQUE_WITH_OPAQUE_OUTPUT; }