Tighter data packing to send to GPU
This commit is contained in:
parent
5b3ce2e148
commit
e9bb1b3d46
5 changed files with 22 additions and 16 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue