Avoid unneccessary roundtrip through python to create VAOs
This commit is contained in:
parent
625798220a
commit
598f08e222
@ -171,7 +171,7 @@ init_cell_program() {
|
|||||||
|
|
||||||
#define CELL_BUFFERS enum { cell_data_buffer, selection_buffer, uniform_buffer };
|
#define CELL_BUFFERS enum { cell_data_buffer, selection_buffer, uniform_buffer };
|
||||||
|
|
||||||
static ssize_t
|
ssize_t
|
||||||
create_cell_vao() {
|
create_cell_vao() {
|
||||||
ssize_t vao_idx = create_vao();
|
ssize_t vao_idx = create_vao();
|
||||||
#define A(name, size, dtype, offset, stride) \
|
#define A(name, size, dtype, offset, stride) \
|
||||||
@ -194,7 +194,7 @@ create_cell_vao() {
|
|||||||
#undef A1
|
#undef A1
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
ssize_t
|
||||||
create_graphics_vao() {
|
create_graphics_vao() {
|
||||||
ssize_t vao_idx = create_vao();
|
ssize_t vao_idx = create_vao();
|
||||||
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
add_buffer_to_vao(vao_idx, GL_ARRAY_BUFFER);
|
||||||
@ -514,8 +514,6 @@ NO_ARG(init_cursor_program)
|
|||||||
NO_ARG(init_borders_program)
|
NO_ARG(init_borders_program)
|
||||||
|
|
||||||
NO_ARG(init_cell_program)
|
NO_ARG(init_cell_program)
|
||||||
NO_ARG_INT(create_cell_vao)
|
|
||||||
NO_ARG_INT(create_graphics_vao)
|
|
||||||
NO_ARG(destroy_sprite_map)
|
NO_ARG(destroy_sprite_map)
|
||||||
PYWRAP1(layout_sprite_map) {
|
PYWRAP1(layout_sprite_map) {
|
||||||
unsigned int cell_width, cell_height;
|
unsigned int cell_width, cell_height;
|
||||||
@ -537,8 +535,6 @@ static PyMethodDef module_methods[] = {
|
|||||||
MW(init_cursor_program, METH_NOARGS),
|
MW(init_cursor_program, METH_NOARGS),
|
||||||
MW(init_borders_program, METH_NOARGS),
|
MW(init_borders_program, METH_NOARGS),
|
||||||
MW(init_cell_program, METH_NOARGS),
|
MW(init_cell_program, METH_NOARGS),
|
||||||
MW(create_cell_vao, METH_NOARGS),
|
|
||||||
MW(create_graphics_vao, METH_NOARGS),
|
|
||||||
MW(layout_sprite_map, METH_VARARGS),
|
MW(layout_sprite_map, METH_VARARGS),
|
||||||
MW(destroy_sprite_map, METH_NOARGS),
|
MW(destroy_sprite_map, METH_NOARGS),
|
||||||
|
|
||||||
|
|||||||
@ -60,6 +60,7 @@ add_os_window() {
|
|||||||
ensure_space_for(&global_state, os_windows, OSWindow, global_state.num_os_windows + 1, capacity, 1, true);
|
ensure_space_for(&global_state, os_windows, OSWindow, global_state.num_os_windows + 1, capacity, 1, true);
|
||||||
OSWindow *ans = global_state.os_windows + global_state.num_os_windows++;
|
OSWindow *ans = global_state.os_windows + global_state.num_os_windows++;
|
||||||
memset(ans, 0, sizeof(OSWindow));
|
memset(ans, 0, sizeof(OSWindow));
|
||||||
|
ans->tab_bar_render_data.vao_idx = create_cell_vao();
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,6 +84,8 @@ add_window(id_type os_window_id, id_type tab_id, PyObject *title) {
|
|||||||
tab->windows[tab->num_windows].id = ++global_state.window_id_counter;
|
tab->windows[tab->num_windows].id = ++global_state.window_id_counter;
|
||||||
tab->windows[tab->num_windows].visible = true;
|
tab->windows[tab->num_windows].visible = true;
|
||||||
tab->windows[tab->num_windows].title = title;
|
tab->windows[tab->num_windows].title = title;
|
||||||
|
tab->windows[tab->num_windows].render_data.vao_idx = create_cell_vao();
|
||||||
|
tab->windows[tab->num_windows].render_data.gvao_idx = create_graphics_vao();
|
||||||
Py_INCREF(tab->windows[tab->num_windows].title);
|
Py_INCREF(tab->windows[tab->num_windows].title);
|
||||||
return tab->windows[tab->num_windows++].id;
|
return tab->windows[tab->num_windows++].id;
|
||||||
END_WITH_TAB;
|
END_WITH_TAB;
|
||||||
@ -316,9 +319,10 @@ PYWRAP1(set_tab_bar_render_data) {
|
|||||||
#define A(name) &(d.name)
|
#define A(name) &(d.name)
|
||||||
ScreenRenderData d = {0};
|
ScreenRenderData d = {0};
|
||||||
id_type os_window_id;
|
id_type os_window_id;
|
||||||
PA("KiffffO", &os_window_id, A(vao_idx), A(xstart), A(ystart), A(dx), A(dy), A(screen));
|
PA("KffffO", &os_window_id, A(xstart), A(ystart), A(dx), A(dy), A(screen));
|
||||||
WITH_OS_WINDOW(os_window_id)
|
WITH_OS_WINDOW(os_window_id)
|
||||||
Py_CLEAR(os_window->tab_bar_render_data.screen);
|
Py_CLEAR(os_window->tab_bar_render_data.screen);
|
||||||
|
d.vao_idx = os_window->tab_bar_render_data.vao_idx;
|
||||||
os_window->tab_bar_render_data = d;
|
os_window->tab_bar_render_data = d;
|
||||||
Py_INCREF(os_window->tab_bar_render_data.screen);
|
Py_INCREF(os_window->tab_bar_render_data.screen);
|
||||||
END_WITH_OS_WINDOW
|
END_WITH_OS_WINDOW
|
||||||
@ -343,10 +347,12 @@ PYWRAP1(set_window_render_data) {
|
|||||||
unsigned int window_idx;
|
unsigned int window_idx;
|
||||||
ScreenRenderData d = {0};
|
ScreenRenderData d = {0};
|
||||||
WindowGeometry g = {0};
|
WindowGeometry g = {0};
|
||||||
PA("KIiiffffOIIII", &os_window_id, &tab_id, &window_idx, A(vao_idx), A(gvao_idx), A(xstart), A(ystart), A(dx), A(dy), A(screen), B(left), B(top), B(right), B(bottom));
|
PA("KKI ffff OIIII", &os_window_id, &tab_id, &window_idx, A(xstart), A(ystart), A(dx), A(dy), A(screen), B(left), B(top), B(right), B(bottom));
|
||||||
|
|
||||||
WITH_TAB(os_window_id, tab_id);
|
WITH_TAB(os_window_id, tab_id);
|
||||||
Py_CLEAR(tab->windows[window_idx].render_data.screen);
|
Py_CLEAR(tab->windows[window_idx].render_data.screen);
|
||||||
|
d.vao_idx = tab->windows[window_idx].render_data.vao_idx;
|
||||||
|
d.gvao_idx = tab->windows[window_idx].render_data.gvao_idx;
|
||||||
tab->windows[window_idx].render_data = d;
|
tab->windows[window_idx].render_data = d;
|
||||||
tab->windows[window_idx].geometry = g;
|
tab->windows[window_idx].geometry = g;
|
||||||
Py_INCREF(tab->windows[window_idx].render_data.screen);
|
Py_INCREF(tab->windows[window_idx].render_data.screen);
|
||||||
|
|||||||
@ -143,6 +143,8 @@ OSWindow* add_os_window();
|
|||||||
OSWindow* current_os_window();
|
OSWindow* current_os_window();
|
||||||
bool drag_scroll(Window *, OSWindow*);
|
bool drag_scroll(Window *, OSWindow*);
|
||||||
void draw_borders(ssize_t vao_idx, unsigned int num_border_rects, BorderRect *rect_buf, bool rect_data_is_dirty, uint32_t viewport_width, uint32_t viewport_height);
|
void draw_borders(ssize_t vao_idx, unsigned int num_border_rects, BorderRect *rect_buf, bool rect_data_is_dirty, uint32_t viewport_width, uint32_t viewport_height);
|
||||||
|
ssize_t create_cell_vao();
|
||||||
|
ssize_t create_graphics_vao();
|
||||||
ssize_t create_border_vao();
|
ssize_t create_border_vao();
|
||||||
bool draw_cells(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *);
|
bool draw_cells(ssize_t, ssize_t, float, float, float, float, Screen *, OSWindow *);
|
||||||
void draw_cursor(CursorRenderInfo *, bool);
|
void draw_cursor(CursorRenderInfo *, bool);
|
||||||
|
|||||||
@ -10,9 +10,9 @@ from .child import Child
|
|||||||
from .config import build_ansi_color_table
|
from .config import build_ansi_color_table
|
||||||
from .constants import WindowGeometry, appname, cell_size, get_boss, shell_path
|
from .constants import WindowGeometry, appname, cell_size, get_boss, shell_path
|
||||||
from .fast_data_types import (
|
from .fast_data_types import (
|
||||||
DECAWM, Screen, add_tab, create_cell_vao, glfw_post_empty_event,
|
DECAWM, Screen, add_tab, glfw_post_empty_event, remove_tab, remove_window,
|
||||||
remove_tab, remove_window, set_active_tab, set_active_window,
|
set_active_tab, set_active_window, set_tab_bar_render_data, swap_tabs,
|
||||||
set_tab_bar_render_data, swap_tabs, swap_windows, viewport_for_window
|
swap_windows, viewport_for_window
|
||||||
)
|
)
|
||||||
from .layout import Rect, all_layouts
|
from .layout import Rect, all_layouts
|
||||||
from .utils import color_as_int
|
from .utils import color_as_int
|
||||||
@ -212,7 +212,6 @@ class TabBar: # {{{
|
|||||||
self.num_tabs = 1
|
self.num_tabs = 1
|
||||||
self.cell_width = 1
|
self.cell_width = 1
|
||||||
self.data_buffer_size = 0
|
self.data_buffer_size = 0
|
||||||
self.vao_id = create_cell_vao()
|
|
||||||
self.layout_changed = None
|
self.layout_changed = None
|
||||||
self.dirty = True
|
self.dirty = True
|
||||||
self.screen = s = Screen(None, 1, 10)
|
self.screen = s = Screen(None, 1, 10)
|
||||||
@ -244,7 +243,7 @@ class TabBar: # {{{
|
|||||||
else:
|
else:
|
||||||
self.tab_bar_blank_rects = ()
|
self.tab_bar_blank_rects = ()
|
||||||
self.screen_geometry = sg = calculate_gl_geometry(g, viewport_width, viewport_height, cell_width, cell_height)
|
self.screen_geometry = sg = calculate_gl_geometry(g, viewport_width, viewport_height, cell_width, cell_height)
|
||||||
set_tab_bar_render_data(self.os_window_id, self.vao_id, sg.xstart, sg.ystart, sg.dx, sg.dy, self.screen)
|
set_tab_bar_render_data(self.os_window_id, sg.xstart, sg.ystart, sg.dx, sg.dy, self.screen)
|
||||||
|
|
||||||
def update(self, data):
|
def update(self, data):
|
||||||
if self.layout_changed is None:
|
if self.layout_changed is None:
|
||||||
|
|||||||
@ -15,10 +15,10 @@ 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, GRAPHICS_PROGRAM, SCROLL_FULL, SCROLL_LINE, SCROLL_PAGE,
|
CURSOR_PROGRAM, GRAPHICS_PROGRAM, SCROLL_FULL, SCROLL_LINE, SCROLL_PAGE,
|
||||||
Screen, add_window, compile_program, create_cell_vao, create_graphics_vao,
|
Screen, add_window, compile_program, glfw_post_empty_event,
|
||||||
glfw_post_empty_event, init_cell_program, init_cursor_program,
|
init_cell_program, init_cursor_program, set_clipboard_string,
|
||||||
set_clipboard_string, set_window_render_data, update_window_title,
|
set_window_render_data, update_window_title, update_window_visibility,
|
||||||
update_window_visibility, viewport_for_window
|
viewport_for_window
|
||||||
)
|
)
|
||||||
from .keys import keyboard_mode_name
|
from .keys import keyboard_mode_name
|
||||||
from .rgb import to_color
|
from .rgb import to_color
|
||||||
@ -80,8 +80,6 @@ class Window:
|
|||||||
self.id = add_window(tab.os_window_id, tab.id, self.title)
|
self.id = add_window(tab.os_window_id, tab.id, self.title)
|
||||||
if not self.id:
|
if not self.id:
|
||||||
raise Exception('No tab with id: {} in OS Window: {} was found, or the window counter wrapped'.format(tab.id, tab.os_window_id))
|
raise Exception('No tab with id: {} in OS Window: {} was found, or the window counter wrapped'.format(tab.id, tab.os_window_id))
|
||||||
self.vao_id = create_cell_vao()
|
|
||||||
self.gvao_id = create_graphics_vao()
|
|
||||||
self.tab_id = tab.id
|
self.tab_id = tab.id
|
||||||
self.os_window_id = tab.os_window_id
|
self.os_window_id = tab.os_window_id
|
||||||
self.tabref = weakref.ref(tab)
|
self.tabref = weakref.ref(tab)
|
||||||
@ -128,7 +126,7 @@ class Window:
|
|||||||
else:
|
else:
|
||||||
sg = self.update_position(new_geometry)
|
sg = self.update_position(new_geometry)
|
||||||
self.geometry = g = new_geometry
|
self.geometry = g = new_geometry
|
||||||
set_window_render_data(self.os_window_id, self.tab_id, window_idx, self.vao_id, self.gvao_id, sg.xstart, sg.ystart, sg.dx, sg.dy, self.screen, *g[:4])
|
set_window_render_data(self.os_window_id, self.tab_id, window_idx, sg.xstart, sg.ystart, sg.dx, sg.dy, self.screen, *g[:4])
|
||||||
|
|
||||||
def contains(self, x, y):
|
def contains(self, x, y):
|
||||||
g = self.geometry
|
g = self.geometry
|
||||||
@ -247,8 +245,7 @@ class Window:
|
|||||||
return ''.join(self.screen.text_for_selection())
|
return ''.join(self.screen.text_for_selection())
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
if self.vao_id is not None:
|
pass
|
||||||
self.vao_id = self.gvao_id = None
|
|
||||||
|
|
||||||
def buffer_as_ansi(self):
|
def buffer_as_ansi(self):
|
||||||
data = []
|
data = []
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user