Tighter data packing to send to GPU

This commit is contained in:
Kovid Goyal 2016-11-22 10:58:00 +05:30
parent 5b3ce2e148
commit e9bb1b3d46
5 changed files with 22 additions and 16 deletions

View file

@ -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()

View file

@ -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;

View file

@ -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

View file

@ -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):

View file

@ -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;
}