From 2c27316c4acb5589e6d334bb399cea7c0fedd0b6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 19 Jul 2018 12:20:11 +0530 Subject: [PATCH] Get rid of the cursor program Cursors will now be drawn in the cell program using a sprite --- kitty/child-monitor.c | 28 -------------------------- kitty/cursor_fragment.glsl | 7 ------- kitty/cursor_vertex.glsl | 18 ----------------- kitty/data-types.h | 1 - kitty/shaders.c | 41 ++++---------------------------------- kitty/state.h | 1 - kitty/window.py | 10 ++++------ 7 files changed, 8 insertions(+), 98 deletions(-) delete mode 100644 kitty/cursor_fragment.glsl delete mode 100644 kitty/cursor_vertex.glsl diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index 3a5f9e911..8282d7611 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -491,14 +491,6 @@ pyset_iutf8(ChildMonitor *self, PyObject *args) { static double last_render_at = -DBL_MAX; -static inline double -cursor_width(double w, bool vert, OSWindow *os_window) { - double dpi = vert ? os_window->fonts_data->logical_dpi_x : os_window->fonts_data->logical_dpi_y; - double ans = w * dpi / 72.0; // as pixels - double factor = 2.0 / (vert ? os_window->viewport_width : os_window->viewport_height); - return ans * factor; -} - extern void cocoa_update_title(PyObject*); static inline void @@ -526,23 +518,6 @@ collect_cursor_info(CursorRenderInfo *ans, Window *w, double now, OSWindow *os_w ans->shape = cursor->shape ? cursor->shape : OPT(cursor_shape); ans->color = colorprofile_to_color(cp, cp->overridden.cursor_color, cp->configured.cursor_color); ans->is_focused = os_window->is_focused; - if (ans->shape == CURSOR_BLOCK && ans->is_focused) return; - double left = rd->xstart + cursor->x * rd->dx; - double top = rd->ystart - cursor->y * rd->dy; - unsigned long mult = MAX(1, screen_current_char_width(rd->screen)); - double right = left + (ans->shape == CURSOR_BEAM ? cursor_width(1.5, true, os_window) : rd->dx * mult); - double bottom = top - rd->dy; - switch (ans->shape) { - case CURSOR_UNDERLINE: - top = bottom + cursor_width(2.0, false, os_window); - break; - case CURSOR_BLOCK: - top -= 2.0 / os_window->viewport_height; // 1px adjustment for width of line - break; - default: - break; - } - ans->left = left; ans->right = right; ans->top = top; ans->bottom = bottom; } static inline bool @@ -614,9 +589,6 @@ render_os_window(OSWindow *os_window, double now, unsigned int active_window_id, if (w->visible && WD.screen) { bool is_active_window = i == tab->active_window; draw_cells(WD.vao_idx, WD.gvao_idx, WD.xstart, WD.ystart, WD.dx, WD.dy, WD.screen, os_window, is_active_window, true); - if (is_active_window && WD.screen->cursor_render_info.is_visible && (!WD.screen->cursor_render_info.is_focused || WD.screen->cursor_render_info.shape != CURSOR_BLOCK)) { - draw_cursor(&WD.screen->cursor_render_info, os_window->is_focused); - } if (WD.screen->start_visual_bell_at != 0) { double bell_left = global_state.opts.visual_bell_duration - (now - WD.screen->start_visual_bell_at); set_maximum_wait(bell_left); diff --git a/kitty/cursor_fragment.glsl b/kitty/cursor_fragment.glsl deleted file mode 100644 index a07f9f498..000000000 --- a/kitty/cursor_fragment.glsl +++ /dev/null @@ -1,7 +0,0 @@ -#version GLSL_VERSION -uniform vec3 color; -out vec4 final_color; - -void main() { - final_color = vec4(color, 1); -} diff --git a/kitty/cursor_vertex.glsl b/kitty/cursor_vertex.glsl deleted file mode 100644 index 3329f2063..000000000 --- a/kitty/cursor_vertex.glsl +++ /dev/null @@ -1,18 +0,0 @@ -#version GLSL_VERSION -uniform vec4 pos; - -const uvec2 pos_map[] = uvec2[4]( - uvec2(1, 0), // right, top - uvec2(1, 1), // right, bottom - uvec2(0, 1), // left, bottom - uvec2(0, 0) // left, top -); - -void main() { - vec2 xpos = vec2(pos[0], pos[2]); - vec2 ypos = vec2(pos[1], pos[3]); - uvec2 pos = pos_map[gl_VertexID]; - gl_Position = vec4(xpos[pos[0]], ypos[pos[1]], 0, 1); -} - - diff --git a/kitty/data-types.h b/kitty/data-types.h index a6b5609b7..3ebd684f5 100644 --- a/kitty/data-types.h +++ b/kitty/data-types.h @@ -197,7 +197,6 @@ typedef struct { bool is_visible, is_focused; CursorShape shape; unsigned int x, y; - double left, right, top, bottom; color_type color; } CursorRenderInfo; diff --git a/kitty/shaders.c b/kitty/shaders.c index 360ae9402..d0d66d6cd 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -8,7 +8,7 @@ #include "fonts.h" #include "gl.h" -enum { CELL_PROGRAM, CELL_BG_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FG_PROGRAM, CURSOR_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, GRAPHICS_PREMULT_PROGRAM, BLIT_PROGRAM, NUM_PROGRAMS }; +enum { CELL_PROGRAM, CELL_BG_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FG_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, GRAPHICS_PREMULT_PROGRAM, BLIT_PROGRAM, NUM_PROGRAMS }; enum { SPRITE_MAP_UNIT, GRAPHICS_UNIT, BLIT_UNIT }; // Sprites {{{ @@ -158,7 +158,7 @@ static ssize_t blit_vertex_array; static void init_cell_program() { - for (int i = CELL_PROGRAM; i < CURSOR_PROGRAM; i++) { + for (int i = CELL_PROGRAM; i < BORDERS_PROGRAM; i++) { cell_program_layouts[i].render_data.index = block_index(i, "CellRenderData"); cell_program_layouts[i].render_data.size = block_size(i, cell_program_layouts[i].render_data.index); cell_program_layouts[i].color_table.size = get_uniform_information(i, "color_table[0]", GL_UNIFORM_SIZE); @@ -167,7 +167,7 @@ init_cell_program() { } // Sanity check to ensure the attribute location binding worked #define C(p, name, expected) { int aloc = attrib_location(p, #name); if (aloc != expected && aloc != -1) fatal("The attribute location for %s is %d != %d in program: %d", #name, aloc, expected, p); } - for (int p = CELL_PROGRAM; p < CURSOR_PROGRAM; p++) { + for (int p = CELL_PROGRAM; p < BORDERS_PROGRAM; p++) { C(p, colors, 0); C(p, sprite_coords, 1); C(p, is_selected, 2); } #undef C @@ -468,36 +468,6 @@ draw_cells(ssize_t vao_idx, ssize_t gvao_idx, GLfloat xstart, GLfloat ystart, GL } // }}} -// Cursor {{{ -enum CursorUniforms { CURSOR_color, CURSOR_pos, NUM_CURSOR_UNIFORMS }; -static GLint cursor_uniform_locations[NUM_CURSOR_UNIFORMS] = {0}; -static ssize_t cursor_vertex_array; - -static void -init_cursor_program() { - Program *p = programs + CURSOR_PROGRAM; - int left = NUM_CURSOR_UNIFORMS; - cursor_vertex_array = create_vao(); - for (int i = 0; i < p->num_of_uniforms; i++, left--) { -#define SET_LOC(which) if (strcmp(p->uniforms[i].name, #which) == 0) cursor_uniform_locations[CURSOR_##which] = p->uniforms[i].location - SET_LOC(color); - else SET_LOC(pos); - else { fatal("Unknown uniform in cursor program: %s", p->uniforms[i].name); } - } - if (left) { fatal("Left over uniforms in cursor program"); } -#undef SET_LOC -} - -void -draw_cursor(CursorRenderInfo *cursor, bool is_focused) { - bind_program(CURSOR_PROGRAM); bind_vertex_array(cursor_vertex_array); - glUniform3f(cursor_uniform_locations[CURSOR_color], ((cursor->color >> 16) & 0xff) / 255.0, ((cursor->color >> 8) & 0xff) / 255.0, (cursor->color & 0xff) / 255.0); - glUniform4f(cursor_uniform_locations[CURSOR_pos], cursor->left, cursor->top, cursor->right, cursor->bottom); - glDrawArrays(is_focused ? GL_TRIANGLE_FAN : GL_LINE_LOOP, 0, 4); - unbind_vertex_array(); unbind_program(); -} -// }}} - // Borders {{{ enum BorderUniforms { BORDER_viewport, BORDER_background_opacity, BORDER_default_bg, BORDER_active_border_color, BORDER_inactive_border_color, BORDER_bell_border_color, NUM_BORDER_UNIFORMS }; static GLint border_uniform_locations[NUM_BORDER_UNIFORMS] = {0}; @@ -623,8 +593,6 @@ ONE_INT(bind_vertex_array) NO_ARG(unbind_vertex_array) TWO_INT(unmap_vao_buffer) -NO_ARG(init_cursor_program) - NO_ARG(init_borders_program) NO_ARG(init_cell_program) @@ -651,7 +619,6 @@ static PyMethodDef module_methods[] = { MW(unmap_vao_buffer, METH_VARARGS), MW(bind_program, METH_O), MW(unbind_program, METH_NOARGS), - MW(init_cursor_program, METH_NOARGS), MW(init_borders_program, METH_NOARGS), MW(init_cell_program, METH_NOARGS), @@ -661,7 +628,7 @@ static PyMethodDef module_methods[] = { bool init_shaders(PyObject *module) { #define C(x) if (PyModule_AddIntConstant(module, #x, x) != 0) { PyErr_NoMemory(); return false; } - C(CELL_PROGRAM); C(CELL_BG_PROGRAM); C(CELL_SPECIAL_PROGRAM); C(CELL_FG_PROGRAM); C(CURSOR_PROGRAM); C(BORDERS_PROGRAM); C(GRAPHICS_PROGRAM); C(GRAPHICS_PREMULT_PROGRAM); C(BLIT_PROGRAM); + C(CELL_PROGRAM); C(CELL_BG_PROGRAM); C(CELL_SPECIAL_PROGRAM); C(CELL_FG_PROGRAM); C(BORDERS_PROGRAM); C(GRAPHICS_PROGRAM); C(GRAPHICS_PREMULT_PROGRAM); C(BLIT_PROGRAM); C(GLSL_VERSION); C(GL_VERSION); C(GL_VENDOR); diff --git a/kitty/state.h b/kitty/state.h index e962c0b26..9ae170f48 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -181,7 +181,6 @@ ssize_t create_graphics_vao(); ssize_t create_border_vao(); bool send_cell_data_to_gpu(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *); void draw_cells(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *, bool, bool); -void draw_cursor(CursorRenderInfo *, bool); void update_surface_size(int, int, uint32_t); void free_texture(uint32_t*); void send_image_to_gpu(uint32_t*, const void*, int32_t, int32_t, bool, bool); diff --git a/kitty/window.py b/kitty/window.py index 7cb051364..920175f4a 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -16,13 +16,13 @@ from .constants import ( ) from .fast_data_types import ( BLIT_PROGRAM, CELL_BG_PROGRAM, CELL_FG_PROGRAM, CELL_PROGRAM, - CELL_SPECIAL_PROGRAM, CSI, CURSOR_PROGRAM, DCS, DECORATION, DIM, + CELL_SPECIAL_PROGRAM, CSI, DCS, DECORATION, DIM, GRAPHICS_PREMULT_PROGRAM, GRAPHICS_PROGRAM, OSC, REVERSE, SCROLL_FULL, SCROLL_LINE, SCROLL_PAGE, STRIKETHROUGH, Screen, add_window, cell_size_for_window, compile_program, get_clipboard_string, - glfw_post_empty_event, init_cell_program, init_cursor_program, - set_clipboard_string, set_titlebar_color, set_window_render_data, - update_window_title, update_window_visibility, viewport_for_window + glfw_post_empty_event, init_cell_program, set_clipboard_string, + set_titlebar_color, set_window_render_data, update_window_title, + update_window_visibility, viewport_for_window ) from .keys import keyboard_mode_name from .rgb import to_color @@ -91,8 +91,6 @@ def load_shader_programs(semi_transparent=0, cursor_text_color=None): ff = f.replace('ALPHA_TYPE', which) compile_program(p, v, ff) init_cell_program() - compile_program(CURSOR_PROGRAM, *load_shaders('cursor')) - init_cursor_program() def setup_colors(screen, opts):