mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-28 19:21:38 +02:00
Code (not working) to draw graphics
This commit is contained in:
@@ -4,16 +4,18 @@ layout(location=0) in vec4 src;
|
|||||||
layout(location=1) in vec4 position;
|
layout(location=1) in vec4 position;
|
||||||
out vec2 texcoord;
|
out vec2 texcoord;
|
||||||
|
|
||||||
|
const uint LEFT = uint(0), TOP = uint(1), RIGHT = uint(2), BOTTOM = uint(3);
|
||||||
|
|
||||||
const uvec2 pos_map[] = uvec2[4](
|
const uvec2 pos_map[] = uvec2[4](
|
||||||
uvec2(1, 0), // right, top
|
uvec2(RIGHT, TOP),
|
||||||
uvec2(1, 1), // right, bottom
|
uvec2(RIGHT, BOTTOM),
|
||||||
uvec2(0, 1), // left, bottom
|
uvec2(LEFT, BOTTOM),
|
||||||
uvec2(0, 0) // left, top
|
uvec2(LEFT, TOP)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
uvec2 pos = pos_map[gl_VertexID];
|
uvec2 pos = pos_map[gl_VertexID];
|
||||||
gl_Position = vec4(position[pos.x], position[pos.y + uint(2)], 0, 1);
|
gl_Position = vec4(position[pos.x], position[pos.y], 0, 1);
|
||||||
texcoord = vec2(src[pos.x], src[pos.y + uint(2)]);
|
texcoord = vec2(src[pos.x], src[pos.y]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
#include "gl.h"
|
#include "gl.h"
|
||||||
|
|
||||||
enum { CELL_PROGRAM, CELL_BACKGROUND_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FOREGROUND_PROGRAM, CURSOR_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, NUM_PROGRAMS };
|
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 {{{
|
// Sprites {{{
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -89,8 +91,6 @@ render_cell(PyObject *text, bool bold, bool italic, unsigned int underline, bool
|
|||||||
#undef B
|
#undef B
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {SPRITE_MAP_UNIT};
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
ensure_sprite_map() {
|
ensure_sprite_map() {
|
||||||
static GLuint bound_texture_id = 0;
|
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);
|
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
|
static void
|
||||||
draw_all_cells(Screen *screen) {
|
draw_all_cells(Screen *screen) {
|
||||||
bind_program(CELL_PROGRAM);
|
bind_program(CELL_PROGRAM);
|
||||||
@@ -312,22 +333,29 @@ draw_all_cells(Screen *screen) {
|
|||||||
cell_constants_set = true;
|
cell_constants_set = true;
|
||||||
}
|
}
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
|
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
|
static void
|
||||||
draw_cells_interleaved(Screen *screen) {
|
draw_cells_interleaved(Screen *screen) {
|
||||||
bind_program(CELL_BACKGROUND_PROGRAM);
|
bind_program(CELL_BACKGROUND_PROGRAM);
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
|
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);
|
bind_program(CELL_SPECIAL_PROGRAM);
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
|
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
|
||||||
|
|
||||||
bind_program(CELL_FOREGROUND_PROGRAM);
|
bind_program(CELL_FOREGROUND_PROGRAM);
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, screen->lines * screen->columns); check_gl();
|
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
|
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) {
|
||||||
cell_prepare_to_render(vao_idx, screen, xstart, ystart, dx, dy, 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);
|
else draw_all_cells(screen);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user