Allow re-using VAO objects between different types of cell program

This commit is contained in:
Kovid Goyal 2017-10-04 15:33:15 +05:30
parent ad040271b9
commit bd09e2ebf1
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 10 additions and 12 deletions

View File

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

View File

@ -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();
} }
// }}} // }}}