Allow re-using VAO objects between different types of cell program
This commit is contained in:
parent
ad040271b9
commit
bd09e2ebf1
@ -12,10 +12,10 @@ layout(std140) uniform CellRenderData {
|
|||||||
uint color_table[256];
|
uint color_table[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
in uvec3 colors;
|
layout(location=0) in uvec3 colors;
|
||||||
in uvec4 sprite_coords;
|
layout(location=1) in uvec4 sprite_coords;
|
||||||
|
layout(location=2) in float is_selected;
|
||||||
#if defined(FOREGROUND) || defined(ALL)
|
#if defined(FOREGROUND) || defined(ALL)
|
||||||
in float is_selected;
|
|
||||||
|
|
||||||
out vec3 sprite_pos;
|
out vec3 sprite_pos;
|
||||||
out vec3 underline_pos;
|
out vec3 underline_pos;
|
||||||
@ -23,9 +23,6 @@ out vec3 strike_pos;
|
|||||||
out vec3 foreground;
|
out vec3 foreground;
|
||||||
out vec3 decoration_fg;
|
out vec3 decoration_fg;
|
||||||
#endif
|
#endif
|
||||||
#if defined SPECIAL
|
|
||||||
in float is_selected;
|
|
||||||
#endif
|
|
||||||
out vec3 background;
|
out vec3 background;
|
||||||
|
|
||||||
const uvec2 pos_map[] = uvec2[4](
|
const uvec2 pos_map[] = uvec2[4](
|
||||||
|
|||||||
@ -175,6 +175,8 @@ destroy_sprite_map() {
|
|||||||
|
|
||||||
// Cell {{{
|
// Cell {{{
|
||||||
|
|
||||||
|
#define CELL_BUFFERS enum { cell_data_buffer, selection_buffer, uniform_buffer };
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UniformBlock render_data;
|
UniformBlock render_data;
|
||||||
ArrayInformation color_table;
|
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;
|
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) {
|
cell_prepare_to_render(ssize_t vao_idx, Screen *screen, GLfloat xstart, GLfloat ystart, GLfloat dx, GLfloat dy, CursorRenderInfo *cursor) {
|
||||||
size_t sz;
|
size_t sz;
|
||||||
|
CELL_BUFFERS;
|
||||||
void *address;
|
void *address;
|
||||||
enum { cell_data_buffer, selection_buffer, uniform_buffer };
|
|
||||||
if (screen->scroll_changed || screen->is_dirty) {
|
if (screen->scroll_changed || screen->is_dirty) {
|
||||||
sz = sizeof(Cell) * screen->lines * screen->columns;
|
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);
|
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);
|
cell_update_uniform_block(vao_idx, screen, uniform_buffer, xstart, ystart, dx, dy, cursor);
|
||||||
ensure_sprite_map();
|
ensure_sprite_map();
|
||||||
render_dirty_sprites(render_and_send_dirty_sprites);
|
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
|
static void
|
||||||
draw_cells_impl(ssize_t vao_idx, GLfloat xstart, GLfloat ystart, GLfloat dx, GLfloat dy, Screen *screen, CursorRenderInfo *cursor) {
|
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);
|
bind_program(CELL_PROGRAM);
|
||||||
static bool cell_constants_set = false;
|
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();
|
glUniform1i(glGetUniformLocation(program_id(CELL_PROGRAM), "sprites"), SPRITE_MAP_UNIT); check_gl();
|
||||||
cell_constants_set = true;
|
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();
|
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user