From e9bb1b3d463bcc29fa71b2666d5c036399451865 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 22 Nov 2016 10:58:00 +0530 Subject: [PATCH] Tighter data packing to send to GPU --- kitty/char_grid.py | 17 +++++++++++++---- kitty/data-types.c | 1 + kitty/data-types.h | 1 + kitty/develop_gl.py | 4 ++-- kitty/sprites.c | 15 +++++---------- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/kitty/char_grid.py b/kitty/char_grid.py index a91cf3b66..b66eb485e 100644 --- a/kitty/char_grid.py +++ b/kitty/char_grid.py @@ -16,7 +16,7 @@ GL_COLOR_BUFFER_BIT, glClearColor, glViewport, glUniform2ui, glUniform4f, glUniform1i, glUniform2f, glDrawArraysInstanced, GL_TRIANGLE_FAN, glEnable, glDisable, GL_BLEND, glDrawArrays, ColorProfile, - CURSOR_BEAM, CURSOR_BLOCK, CURSOR_UNDERLINE + CURSOR_BEAM, CURSOR_BLOCK, CURSOR_UNDERLINE, DATA_CELL_SIZE ) Size = namedtuple('Size', 'width height') @@ -42,6 +42,14 @@ uvec2(0, 0) // left, top ); +vec4 to_color(uint c) { + uint r, g, b; + r = (c >> 16) & uint(255); + g = (c >> 8) & uint(255); + b = c & uint(255); + return vec4(r / 255.0, g / 255.0, b / 255.0, 1); +} + void main() { uint instance_id = uint(gl_InstanceID); uint r = instance_id / dimensions[0]; @@ -58,8 +66,9 @@ vec2 s_xpos = vec2(spos[0], spos[0] + 1.0) * sprite_layout[0]; vec2 s_ypos = vec2(spos[1], spos[1] + 1.0) * sprite_layout[1]; sprite_pos = vec3(s_xpos[pos[0]], s_ypos[pos[1]], spos[2]); - foreground = texelFetch(sprite_map, sprite_id + 1) / 255.0; - background = texelFetch(sprite_map, sprite_id + 2) / 255.0; + uvec4 colors = texelFetch(sprite_map, sprite_id + 1); + foreground = to_color(colors[0]); + background = to_color(colors[1]); } ''', @@ -195,7 +204,7 @@ def do_layout(self, w, h): self.width, self.height = w, h self.screen_geometry = sg = calculate_screen_geometry(self.cell_width, self.cell_height, self.width, self.height) self.screen.resize(sg.ynum, sg.xnum) - self.sprite_map_type = (c_uint * (sg.ynum * sg.xnum * 9)) + self.sprite_map_type = (c_uint * (sg.ynum * sg.xnum * DATA_CELL_SIZE)) self.main_sprite_map = self.sprite_map_type() self.scroll_sprite_map = self.sprite_map_type() self.render_buf = self.sprite_map_type() diff --git a/kitty/data-types.c b/kitty/data-types.c index bd1f65c9d..55b9870be 100644 --- a/kitty/data-types.c +++ b/kitty/data-types.c @@ -56,6 +56,7 @@ PyInit_fast_data_types(void) { PyModule_AddIntMacro(m, CURSOR_UNDERLINE); PyModule_AddIntMacro(m, DECAWM); PyModule_AddIntMacro(m, IRM); + PyModule_AddIntMacro(m, DATA_CELL_SIZE); } return m; diff --git a/kitty/data-types.h b/kitty/data-types.h index cd7034fc9..d6160973b 100644 --- a/kitty/data-types.h +++ b/kitty/data-types.h @@ -22,6 +22,7 @@ typedef uint32_t decoration_type; typedef uint32_t combining_type; typedef unsigned int index_type; #define CELL_SIZE (sizeof(char_type) + sizeof(color_type) + sizeof(decoration_type) + sizeof(combining_type)) +#define DATA_CELL_SIZE 9 #define CHAR_MASK 0xFFFFFF #define ATTRS_SHIFT 24 diff --git a/kitty/develop_gl.py b/kitty/develop_gl.py index f5d7d493c..1abe45777 100644 --- a/kitty/develop_gl.py +++ b/kitty/develop_gl.py @@ -15,7 +15,7 @@ glUniform2f, glUniform4f, glUniform2ui, glUniform1i, glewInit, glGetString, GL_VERSION as GL_VERSION_C, GL_VENDOR, GL_SHADING_LANGUAGE_VERSION, GL_RENDERER, glClear, GL_COLOR_BUFFER_BIT, GL_TRIANGLE_FAN, glDrawArraysInstanced, - Cursor, LineBuf, ColorProfile + Cursor, LineBuf, ColorProfile, DATA_CELL_SIZE ) @@ -56,7 +56,7 @@ def do_layout(self): self.sprites.do_layout(cell_width, cell_height) self.sprites.ensure_state() self.screen_geometry = sg = calculate_screen_geometry(cell_width, cell_height, self.w, self.h) - data = (ctypes.c_uint * (sg.xnum * sg.ynum * 9))() + data = (ctypes.c_uint * (sg.xnum * sg.ynum * DATA_CELL_SIZE))() lb = LineBuf(sg.ynum, sg.xnum) i = -1 for y in range(sg.ynum): diff --git a/kitty/sprites.c b/kitty/sprites.c index 002d23a1a..9e33bc86d 100644 --- a/kitty/sprites.c +++ b/kitty/sprites.c @@ -133,13 +133,11 @@ bool update_cell_range_data(SpriteMap *self, Line *line, unsigned int xstart, unsigned int xmax, ColorProfile *color_profile, const uint32_t default_bg, const uint32_t default_fg, unsigned int *data) { SpritePosition *sp; char_type previous_ch=0, ch; - color_type color; - uint32_t bg, fg; uint8_t previous_width = 0; int err = 0; - size_t base = line->ynum * line->xnum * 9; - for (size_t i = xstart, offset = base + xstart * 9; i <= xmax; i++, offset += 9) { + size_t base = line->ynum * line->xnum * DATA_CELL_SIZE; + for (size_t i = xstart, offset = base + xstart * DATA_CELL_SIZE; i <= xmax; i++, offset += DATA_CELL_SIZE) { ch = line->chars[i]; if (previous_width == 2) sp = sprite_position_for(self, previous_ch, 0, true, &err); else sp = sprite_position_for(self, ch, line->combining_chars[i], false, &err); @@ -147,13 +145,10 @@ update_cell_range_data(SpriteMap *self, Line *line, unsigned int xstart, unsigne data[offset] = sp->x; data[offset+1] = sp->y; data[offset+2] = sp->z; - color = line->colors[i]; - fg = to_color(color_profile, color & COL_MASK, default_fg); - bg = to_color(color_profile, color >> COL_SHIFT, default_bg); + data[offset+3] = to_color(color_profile, line->colors[i] & COL_MASK, default_fg); + data[offset+4] = to_color(color_profile, line->colors[i] >> COL_SHIFT, default_bg); + data[offset+5] = to_color(color_profile, line->decoration_fg[i] & COL_MASK, default_fg); previous_ch = ch; previous_width = (ch >> ATTRS_SHIFT) & WIDTH_MASK; -#define PACK_COL(b, col) data[b] = col >> 16; data[b + 1] = (col >> 8) & 0xff; data[b + 2] = col & 0xff; - PACK_COL(offset + 3, fg); - PACK_COL(offset + 6, bg); } return true; }