apps such as cacademo no longer appear to lag.master
@@ -272,8 +272,11 @@ size_t Term::ReadAnsi(void const *data, size_t size) | |||||
if (!m_init) | if (!m_init) | ||||
{ | { | ||||
m_dfg = CACA_LIGHTGRAY; | |||||
m_dbg = CACA_BLACK; | |||||
m_fg = m_dfg = CACA_LIGHTGRAY; | |||||
m_bg = m_dbg = CACA_BLACK; | |||||
m_bold = m_blink = m_italics = m_negative = m_concealed | |||||
= m_underline = m_faint = m_strike = m_proportional = 0; | |||||
caca_set_color_ansi(m_caca, m_dfg, m_dbg); | caca_set_color_ansi(m_caca, m_dfg, m_dbg); | ||||
m_clearattr = caca_get_attr(m_caca, -1, -1); | m_clearattr = caca_get_attr(m_caca, -1, -1); | ||||
@@ -46,7 +46,8 @@ Pty::Pty() | |||||
m_pid(-1), | m_pid(-1), | ||||
m_eof(false), | m_eof(false), | ||||
m_unread_data(0), | m_unread_data(0), | ||||
m_unread_len(0) | |||||
m_unread_len(0), | |||||
m_size(-1, -1) | |||||
{ | { | ||||
; | ; | ||||
} | } | ||||
@@ -110,6 +111,9 @@ bool Pty::IsEof() const | |||||
return m_eof; | return m_eof; | ||||
} | } | ||||
/* Read data from the PTY. We only perform one read() call so that the | |||||
* caller can decide whether to ask for more data or not. This lets us | |||||
* prioritise data in some way. */ | |||||
size_t Pty::ReadData(char *data, size_t maxlen) | size_t Pty::ReadData(char *data, size_t maxlen) | ||||
{ | { | ||||
#if defined HAVE_FORKPTY | #if defined HAVE_FORKPTY | ||||
@@ -30,6 +30,10 @@ Term::Term(ivec2 size) | |||||
m_caca(caca_create_canvas(size.x, size.y)), | m_caca(caca_create_canvas(size.x, size.y)), | ||||
m_size(size), | m_size(size), | ||||
m_title(0), | m_title(0), | ||||
m_bell(0), | |||||
m_init(0), | |||||
m_report_mouse(0), | |||||
m_changed(0), | |||||
m_time(0.f), | m_time(0.f), | ||||
m_debug(false) | m_debug(false) | ||||
{ | { | ||||
@@ -133,14 +137,22 @@ void Term::TickGame(float seconds) | |||||
size_t current = m_pty->ReadData(buf, BUFSIZ); | size_t current = m_pty->ReadData(buf, BUFSIZ); | ||||
if (current <= 0) | if (current <= 0) | ||||
break; | break; | ||||
total += current; | |||||
/* FIXME: by the time we're finished decoding the ANSI data, some | |||||
* new data may be available. We need to avoid reading it because | |||||
* it's time rendering the canvas isntead. */ | |||||
size_t processed = ReadAnsi(buf, current); | size_t processed = ReadAnsi(buf, current); | ||||
if (processed < current) | if (processed < current) | ||||
m_pty->UnreadData(buf + processed, current - processed); | m_pty->UnreadData(buf + processed, current - processed); | ||||
if (current < BUFSIZ) | |||||
total += processed; | |||||
if (processed == 0) | |||||
break; | |||||
/* FIXME: when do we know when to stop? If we read too much | |||||
* data, some of our frames will not be rendered because they'll | |||||
* be overwritten by new data. If we don't read enough, we will | |||||
* start rendering even if a frame isn't finished. */ | |||||
if (total > 12000) | |||||
break; | break; | ||||
// if (total > 10000) | |||||
// break; | |||||
} | } | ||||
/* Some fancy shit if we press F3 */ | /* Some fancy shit if we press F3 */ | ||||
@@ -256,4 +268,4 @@ void Term::DrawFancyShit() | |||||
caca_set_color_argb(m_caca, 0x777, bg_color); | caca_set_color_argb(m_caca, 0x777, bg_color); | ||||
caca_put_str(m_caca, 0, 0, "rez@lol:~/code/neercs/"); | caca_put_str(m_caca, 0, 0, "rez@lol:~/code/neercs/"); | ||||
} | |||||
} |
@@ -121,6 +121,7 @@ void TextRender::Render() | |||||
/* Upload libcaca canvas contents to the vertex buffers */ | /* Upload libcaca canvas contents to the vertex buffers */ | ||||
uint32_t *colors = (uint32_t *)m_vbo1->Lock(0, 0); | uint32_t *colors = (uint32_t *)m_vbo1->Lock(0, 0); | ||||
uint32_t savedattr = caca_get_attr(m_caca, -1, -1); | |||||
for (int j = 0; j < m_canvas_size.y; j++) | for (int j = 0; j < m_canvas_size.y; j++) | ||||
for (int i = 0; i < m_canvas_size.x; i++) | for (int i = 0; i < m_canvas_size.x; i++) | ||||
{ | { | ||||
@@ -131,6 +132,7 @@ void TextRender::Render() | |||||
attr = caca_get_attr(m_caca, -1, -1); | attr = caca_get_attr(m_caca, -1, -1); | ||||
caca_put_attr(m_caca, i, j, attr); | caca_put_attr(m_caca, i, j, attr); | ||||
} | } | ||||
caca_set_attr(m_caca, savedattr); | |||||
memcpy(colors, caca_get_canvas_attrs(m_caca), | memcpy(colors, caca_get_canvas_attrs(m_caca), | ||||
m_cells * sizeof(uint32_t)); | m_cells * sizeof(uint32_t)); | ||||
m_vbo1->Unlock(); | m_vbo1->Unlock(); | ||||