diff --git a/kitty/cell_vertex.glsl b/kitty/cell_vertex.glsl index d6cc1f019..9bde0289e 100644 --- a/kitty/cell_vertex.glsl +++ b/kitty/cell_vertex.glsl @@ -12,10 +12,10 @@ layout(std140) uniform CellRenderData { uint color_table[256]; }; -in uvec3 colors; -in uvec4 sprite_coords; +layout(location=0) in uvec3 colors; +layout(location=1) in uvec4 sprite_coords; +layout(location=2) in float is_selected; #if defined(FOREGROUND) || defined(ALL) -in float is_selected; out vec3 sprite_pos; out vec3 underline_pos; @@ -23,9 +23,6 @@ out vec3 strike_pos; out vec3 foreground; out vec3 decoration_fg; #endif -#if defined SPECIAL -in float is_selected; -#endif out vec3 background; const uvec2 pos_map[] = uvec2[4]( diff --git a/kitty/shaders.c b/kitty/shaders.c index 66fa286c9..3f0d9f92c 100644 --- a/kitty/shaders.c +++ b/kitty/shaders.c @@ -175,6 +175,8 @@ destroy_sprite_map() { // Cell {{{ +#define CELL_BUFFERS enum { cell_data_buffer, selection_buffer, uniform_buffer }; + typedef struct { UniformBlock render_data; ArrayInformation color_table; @@ -257,11 +259,11 @@ cell_update_uniform_block(ssize_t vao_idx, Screen *screen, int uniform_buffer, G unmap_vao_buffer(vao_idx, uniform_buffer); rd = NULL; } -static inline int +static inline void cell_prepare_to_render(ssize_t vao_idx, Screen *screen, GLfloat xstart, GLfloat ystart, GLfloat dx, GLfloat dy, CursorRenderInfo *cursor) { size_t sz; + CELL_BUFFERS; void *address; - enum { cell_data_buffer, selection_buffer, uniform_buffer }; if (screen->scroll_changed || screen->is_dirty) { sz = sizeof(Cell) * screen->lines * screen->columns; address = alloc_and_map_vao_buffer(vao_idx, sz, cell_data_buffer, GL_STREAM_DRAW, GL_WRITE_ONLY); @@ -279,12 +281,13 @@ cell_prepare_to_render(ssize_t vao_idx, Screen *screen, GLfloat xstart, GLfloat cell_update_uniform_block(vao_idx, screen, uniform_buffer, xstart, ystart, dx, dy, cursor); ensure_sprite_map(); render_dirty_sprites(render_and_send_dirty_sprites); - return uniform_buffer; + bind_vao_uniform_buffer(vao_idx, uniform_buffer, cell_program_layouts[CELL_PROGRAM].render_data.index); + bind_vertex_array(vao_idx); } static void draw_cells_impl(ssize_t vao_idx, GLfloat xstart, GLfloat ystart, GLfloat dx, GLfloat dy, Screen *screen, CursorRenderInfo *cursor) { - int uniform_buffer = cell_prepare_to_render(vao_idx, screen, xstart, ystart, dx, dy, cursor); + cell_prepare_to_render(vao_idx, screen, xstart, ystart, dx, dy, cursor); bind_program(CELL_PROGRAM); static bool cell_constants_set = false; @@ -292,8 +295,6 @@ draw_cells_impl(ssize_t vao_idx, GLfloat xstart, GLfloat ystart, GLfloat dx, GLf glUniform1i(glGetUniformLocation(program_id(CELL_PROGRAM), "sprites"), SPRITE_MAP_UNIT); check_gl(); cell_constants_set = true; } - bind_vao_uniform_buffer(vao_idx, uniform_buffer, cell_program_layouts[CELL_PROGRAM].render_data.index); - bind_vertex_array(vao_idx); glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl(); } // }}}