mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-27 10:41:58 +02:00
Start work on the graphics program
This commit is contained in:
15
kitty/gl.h
15
kitty/gl.h
@@ -338,11 +338,9 @@ add_buffer_to_vao(ssize_t vao_idx, GLenum usage) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_attribute_to_vao(int p, ssize_t vao_idx, const char *name, GLint size, GLenum data_type, GLsizei stride, void *offset, GLuint divisor) {
|
add_located_attribute_to_vao(ssize_t vao_idx, GLint aloc, GLint size, GLenum data_type, GLsizei stride, void *offset, GLuint divisor) {
|
||||||
VAO *vao = vaos + vao_idx;
|
VAO *vao = vaos + vao_idx;
|
||||||
if (!vao->num_buffers) { fatal("You must create a buffer for this attribute first"); return; }
|
if (!vao->num_buffers) fatal("You must create a buffer for this attribute first");
|
||||||
GLint aloc = attrib_location(p, name);
|
|
||||||
if (aloc == -1) { fatal("No attribute named: %s found in this program", name); return; }
|
|
||||||
ssize_t buf = vao->buffers[vao->num_buffers - 1];
|
ssize_t buf = vao->buffers[vao->num_buffers - 1];
|
||||||
bind_buffer(buf);
|
bind_buffer(buf);
|
||||||
glEnableVertexAttribArray(aloc);
|
glEnableVertexAttribArray(aloc);
|
||||||
@@ -366,7 +364,14 @@ add_attribute_to_vao(int p, ssize_t vao_idx, const char *name, GLint size, GLenu
|
|||||||
check_gl();
|
check_gl();
|
||||||
}
|
}
|
||||||
unbind_buffer(buf);
|
unbind_buffer(buf);
|
||||||
return;
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
add_attribute_to_vao(int p, ssize_t vao_idx, const char *name, GLint size, GLenum data_type, GLsizei stride, void *offset, GLuint divisor) {
|
||||||
|
GLint aloc = attrib_location(p, name);
|
||||||
|
if (aloc == -1) fatal("No attribute named: %s found in this program", name);
|
||||||
|
add_located_attribute_to_vao(vao_idx, aloc, size, data_type, stride, offset, divisor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
10
kitty/graphics_fragment.glsl
Normal file
10
kitty/graphics_fragment.glsl
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#version 330
|
||||||
|
|
||||||
|
uniform sampler2D image;
|
||||||
|
|
||||||
|
in vec2 texcoord;
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
color = texture2D(image, texcoord);
|
||||||
|
}
|
||||||
19
kitty/graphics_vertex.glsl
Normal file
19
kitty/graphics_vertex.glsl
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#version 330
|
||||||
|
|
||||||
|
layout(location=8) in vec4 src;
|
||||||
|
layout(location=9) in vec4 position;
|
||||||
|
out vec2 texcoord;
|
||||||
|
|
||||||
|
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
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
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)]);
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "gl.h"
|
#include "gl.h"
|
||||||
|
|
||||||
enum { CELL_PROGRAM, CELL_BACKGROUND_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FOREGROUND_PROGRAM, CURSOR_PROGRAM, BORDERS_PROGRAM, NUM_PROGRAMS };
|
enum { CELL_PROGRAM, CELL_BACKGROUND_PROGRAM, CELL_SPECIAL_PROGRAM, CELL_FOREGROUND_PROGRAM, CURSOR_PROGRAM, BORDERS_PROGRAM, GRAPHICS_PROGRAM, NUM_PROGRAMS };
|
||||||
|
|
||||||
// Sprites {{{
|
// Sprites {{{
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -175,8 +175,6 @@ 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;
|
||||||
@@ -195,6 +193,8 @@ init_cell_program() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CELL_BUFFERS enum { cell_data_buffer, selection_buffer, uniform_buffer, graphics_buffer };
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
create_cell_vao() {
|
create_cell_vao() {
|
||||||
ssize_t vao_idx = create_vao();
|
ssize_t vao_idx = create_vao();
|
||||||
@@ -202,17 +202,26 @@ create_cell_vao() {
|
|||||||
add_attribute_to_vao(CELL_PROGRAM, vao_idx, #name, \
|
add_attribute_to_vao(CELL_PROGRAM, vao_idx, #name, \
|
||||||
/*size=*/size, /*dtype=*/dtype, /*stride=*/stride, /*offset=*/offset, /*divisor=*/1);
|
/*size=*/size, /*dtype=*/dtype, /*stride=*/stride, /*offset=*/offset, /*divisor=*/1);
|
||||||
#define A1(name, size, dtype, offset) A(name, size, dtype, (void*)(offsetof(Cell, offset)), sizeof(Cell))
|
#define A1(name, size, dtype, offset) A(name, size, dtype, (void*)(offsetof(Cell, offset)), sizeof(Cell))
|
||||||
|
#define AL(p, name, size, dtype, offset, stride) { GLint aloc = attrib_location(p, name); if (aloc == -1 ) fatal("No attribute named: %s found in this program", name); add_located_attribute_to_vao(vao_idx, aloc, size, dtype, stride, (void*)offset, 1); }
|
||||||
|
|
||||||
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
||||||
A1(sprite_coords, 4, GL_UNSIGNED_SHORT, sprite_x);
|
A1(sprite_coords, 4, GL_UNSIGNED_SHORT, sprite_x);
|
||||||
A1(colors, 3, GL_UNSIGNED_INT, fg);
|
A1(colors, 3, GL_UNSIGNED_INT, fg);
|
||||||
|
|
||||||
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
||||||
A(is_selected, 1, GL_FLOAT, NULL, 0);
|
A(is_selected, 1, GL_FLOAT, NULL, 0);
|
||||||
|
|
||||||
size_t bufnum = add_buffer_to_vao(vao_idx, GL_UNIFORM_BUFFER);
|
size_t bufnum = add_buffer_to_vao(vao_idx, GL_UNIFORM_BUFFER);
|
||||||
alloc_vao_buffer(vao_idx, cell_program_layouts[CELL_PROGRAM].render_data.size, bufnum, GL_STREAM_DRAW);
|
alloc_vao_buffer(vao_idx, cell_program_layouts[CELL_PROGRAM].render_data.size, bufnum, GL_STREAM_DRAW);
|
||||||
|
|
||||||
|
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
||||||
|
AL(GRAPHICS_PROGRAM, "src", 4, GL_FLOAT, 0, sizeof(ImageRenderData));
|
||||||
|
AL(GRAPHICS_PROGRAM, "position", 4, GL_FLOAT, offsetof(ImageRenderData, dest_rect), sizeof(ImageRenderData));
|
||||||
|
|
||||||
return vao_idx;
|
return vao_idx;
|
||||||
#undef A
|
#undef A
|
||||||
#undef A1
|
#undef A1
|
||||||
|
#undef AL
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@@ -560,7 +569,7 @@ init_shaders_debug(PyObject *module) {
|
|||||||
init_shaders(PyObject *module) {
|
init_shaders(PyObject *module) {
|
||||||
#endif
|
#endif
|
||||||
#define C(x) if (PyModule_AddIntConstant(module, #x, x) != 0) { PyErr_NoMemory(); return false; }
|
#define C(x) if (PyModule_AddIntConstant(module, #x, x) != 0) { PyErr_NoMemory(); return false; }
|
||||||
C(CELL_PROGRAM); C(CELL_BACKGROUND_PROGRAM); C(CELL_SPECIAL_PROGRAM); C(CELL_FOREGROUND_PROGRAM); C(CURSOR_PROGRAM); C(BORDERS_PROGRAM);
|
C(CELL_PROGRAM); C(CELL_BACKGROUND_PROGRAM); C(CELL_SPECIAL_PROGRAM); C(CELL_FOREGROUND_PROGRAM); C(CURSOR_PROGRAM); C(BORDERS_PROGRAM); C(GRAPHICS_PROGRAM);
|
||||||
C(GLSL_VERSION);
|
C(GLSL_VERSION);
|
||||||
C(GL_VERSION);
|
C(GL_VERSION);
|
||||||
C(GL_VENDOR);
|
C(GL_VENDOR);
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ from .constants import (
|
|||||||
from .fast_data_types import (
|
from .fast_data_types import (
|
||||||
BRACKETED_PASTE_END, BRACKETED_PASTE_START, CELL_BACKGROUND_PROGRAM,
|
BRACKETED_PASTE_END, BRACKETED_PASTE_START, CELL_BACKGROUND_PROGRAM,
|
||||||
CELL_FOREGROUND_PROGRAM, CELL_PROGRAM, CELL_SPECIAL_PROGRAM,
|
CELL_FOREGROUND_PROGRAM, CELL_PROGRAM, CELL_SPECIAL_PROGRAM,
|
||||||
CURSOR_PROGRAM, SCROLL_FULL, SCROLL_LINE, SCROLL_PAGE, Screen,
|
CURSOR_PROGRAM, GRAPHICS_PROGRAM, SCROLL_FULL, SCROLL_LINE, SCROLL_PAGE,
|
||||||
compile_program, create_cell_vao, glfw_post_empty_event, init_cell_program,
|
Screen, compile_program, create_cell_vao, glfw_post_empty_event,
|
||||||
init_cursor_program, remove_vao, set_window_render_data,
|
init_cell_program, init_cursor_program, remove_vao, set_window_render_data,
|
||||||
update_window_title, update_window_visibility
|
update_window_title, update_window_visibility
|
||||||
)
|
)
|
||||||
from .rgb import to_color
|
from .rgb import to_color
|
||||||
@@ -62,6 +62,7 @@ def load_shader_programs():
|
|||||||
init_cell_program()
|
init_cell_program()
|
||||||
compile_program(CURSOR_PROGRAM, *load_shaders('cursor'))
|
compile_program(CURSOR_PROGRAM, *load_shaders('cursor'))
|
||||||
init_cursor_program()
|
init_cursor_program()
|
||||||
|
compile_program(GRAPHICS_PROGRAM, *load_shaders('graphics'))
|
||||||
|
|
||||||
|
|
||||||
class Window:
|
class Window:
|
||||||
|
|||||||
Reference in New Issue
Block a user