Kernel: Optimize VTTY cursor rendering

cursor is now only updated once after all consecutive `putchar`s are
handled.
This commit is contained in:
Bananymous 2025-04-18 03:55:56 +03:00
parent 6858546ce9
commit 9258c73484
4 changed files with 23 additions and 3 deletions

View File

@ -41,7 +41,6 @@ namespace Kernel
virtual uint32_t height() const = 0; virtual uint32_t height() const = 0;
virtual uint32_t width() const = 0; virtual uint32_t width() const = 0;
void putchar(uint8_t ch);
virtual dev_t rdev() const final override { return m_rdev; } virtual dev_t rdev() const final override { return m_rdev; }
@ -60,10 +59,13 @@ namespace Kernel
TTY(mode_t mode, uid_t uid, gid_t gid); TTY(mode_t mode, uid_t uid, gid_t gid);
virtual void putchar_impl(uint8_t ch) = 0; virtual void putchar_impl(uint8_t ch) = 0;
virtual void update_cursor() {}
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override;
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override; virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override;
private: private:
void putchar(uint8_t ch);
void do_backspace(); void do_backspace();
protected: protected:

View File

@ -24,6 +24,7 @@ namespace Kernel
protected: protected:
virtual BAN::StringView name() const override { return m_name; } virtual BAN::StringView name() const override { return m_name; }
virtual void putchar_impl(uint8_t ch) override; virtual void putchar_impl(uint8_t ch) override;
void update_cursor() override;
private: private:
VirtualTTY(BAN::RefPtr<TerminalDriver>); VirtualTTY(BAN::RefPtr<TerminalDriver>);
@ -78,6 +79,7 @@ namespace Kernel
uint32_t m_saved_row { 0 }; uint32_t m_saved_row { 0 };
uint32_t m_saved_column { 0 }; uint32_t m_saved_column { 0 };
bool m_cursor_shown { true };
uint32_t m_row { 0 }; uint32_t m_row { 0 };
uint32_t m_column { 0 }; uint32_t m_column { 0 };
Cell* m_buffer { nullptr }; Cell* m_buffer { nullptr };

View File

@ -215,6 +215,7 @@ namespace Kernel
auto* ptr = reinterpret_cast<const uint8_t*>(ansi_c_str); auto* ptr = reinterpret_cast<const uint8_t*>(ansi_c_str);
while (*ptr) while (*ptr)
handle_input_byte(*ptr++); handle_input_byte(*ptr++);
update_cursor();
} }
} }
@ -358,6 +359,7 @@ namespace Kernel
SpinLockGuard _(m_write_lock); SpinLockGuard _(m_write_lock);
for (size_t i = 0; i < buffer.size(); i++) for (size_t i = 0; i < buffer.size(); i++)
putchar(buffer[i]); putchar(buffer[i]);
update_cursor();
return buffer.size(); return buffer.size();
} }
@ -366,6 +368,7 @@ namespace Kernel
ASSERT(s_tty); ASSERT(s_tty);
SpinLockGuard _(s_tty->m_write_lock); SpinLockGuard _(s_tty->m_write_lock);
s_tty->putchar(ch); s_tty->putchar(ch);
s_tty->update_cursor();
} }
bool TTY::is_initialized() bool TTY::is_initialized()

View File

@ -357,7 +357,7 @@ namespace Kernel
case 'l': case 'l':
if (m_ansi_state.question && m_ansi_state.nums[0] == 25) if (m_ansi_state.question && m_ansi_state.nums[0] == 25)
{ {
m_terminal_driver->set_cursor_shown(ch == 'h'); m_cursor_shown = (ch == 'h');
return reset_ansi(); return reset_ansi();
} }
reset_ansi(); reset_ansi();
@ -518,8 +518,21 @@ namespace Kernel
} }
putcodepoint(codepoint); putcodepoint(codepoint);
}
void VirtualTTY::update_cursor()
{
static bool last_shown = !m_cursor_shown;
if (m_cursor_shown != last_shown)
m_terminal_driver->set_cursor_shown(m_cursor_shown);
last_shown = m_cursor_shown;
static uint32_t last_column = -1;
static uint32_t last_row = -1;
if (last_column != m_column || last_row != m_row)
m_terminal_driver->set_cursor_position(m_column, m_row); m_terminal_driver->set_cursor_position(m_column, m_row);
last_column = m_column;
last_row = m_row;
} }
} }