Code (not working) to draw graphics

This commit is contained in:
Kovid Goyal 2017-10-04 18:29:48 +05:30
parent 8f05f752af
commit e9bc64205e
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 39 additions and 9 deletions

View File

@ -4,16 +4,18 @@ layout(location=0) in vec4 src;
layout(location=1) in vec4 position;
out vec2 texcoord;
const uint LEFT = uint(0), TOP = uint(1), RIGHT = uint(2), BOTTOM = uint(3);
const uvec2 pos_map[] = uvec2[4](
uvec2(1, 0), // right, top
uvec2(1, 1), // right, bottom
uvec2(0, 1), // left, bottom
uvec2(0, 0) // left, top
uvec2(RIGHT, TOP),
uvec2(RIGHT, BOTTOM),
uvec2(LEFT, BOTTOM),
uvec2(LEFT, TOP)
);
void main() {
uvec2 pos = pos_map[gl_VertexID];
gl_Position = vec4(position[pos.x], position[pos.y + uint(2)], 0, 1);
texcoord = vec2(src[pos.x], src[pos.y + uint(2)]);
gl_Position = vec4(position[pos.x], position[pos.y], 0, 1);
texcoord = vec2(src[pos.x], src[pos.y]);
}

View File

@ -8,6 +8,8 @@
#include "gl.h"
enum { CELL_PROGRAM, CELL_BACKGROUND_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FOREGROUND_PROGRAM, CURSOR_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, NUM_PROGRAMS };
enum {SPRITE_MAP_UNIT, GRAPHICS_UNIT};
// Sprites {{{
typedef struct {
@ -89,8 +91,6 @@ render_cell(PyObject *text, bool bold, bool italic, unsigned int underline, bool
#undef B
}
enum {SPRITE_MAP_UNIT};
static inline void
ensure_sprite_map() {
static GLuint bound_texture_id = 0;
@ -303,6 +303,27 @@ cell_prepare_to_render(ssize_t vao_idx, Screen *screen, GLfloat xstart, GLfloat
bind_vertex_array(vao_idx);
}
static void
draw_graphics(ImageRenderData *data, GLuint start, GLuint count) {
bind_program(GRAPHICS_PROGRAM);
static bool graphics_constants_set = false;
if (!graphics_constants_set) {
glUniform1i(glGetUniformLocation(program_id(GRAPHICS_PROGRAM), "image"), GRAPHICS_UNIT); check_gl();
graphics_constants_set = true;
}
glActiveTexture(GL_TEXTURE0 + GRAPHICS_UNIT); check_gl();
GLuint base = start;
for (GLuint i=0; i < count;) {
ImageRenderData *rd = data + start + i;
glBindTexture(GL_TEXTURE_2D, rd->texture_id); check_gl();
glDrawArraysInstancedBaseInstance(GL_TRIANGLE_FAN, 0, 4, rd->group_count, base);
base += rd->group_count;
i += rd->group_count;
}
}
static void
draw_all_cells(Screen *screen) {
bind_program(CELL_PROGRAM);
@ -312,22 +333,29 @@ draw_all_cells(Screen *screen) {
cell_constants_set = true;
}
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
if (screen->grman->count) draw_graphics(screen->grman->render_data, 0, screen->grman->count);
}
static void
draw_cells_interleaved(Screen *screen) {
bind_program(CELL_BACKGROUND_PROGRAM);
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
draw_graphics(screen->grman->render_data, 0, screen->grman->num_of_negative_refs);
bind_program(CELL_SPECIAL_PROGRAM);
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
bind_program(CELL_FOREGROUND_PROGRAM);
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
if (screen->grman->num_of_positive_refs) draw_graphics(screen->grman->render_data, screen->grman->num_of_negative_refs, screen->grman->num_of_positive_refs);
}
static void
draw_cells_impl(ssize_t vao_idx, GLfloat xstart, GLfloat ystart, GLfloat dx, GLfloat dy, Screen *screen, CursorRenderInfo *cursor) {
cell_prepare_to_render(vao_idx, screen, xstart, ystart, dx, dy, cursor);
if (false) draw_cells_interleaved(screen);
if (screen->grman->num_of_negative_refs) draw_cells_interleaved(screen);
else draw_all_cells(screen);
}