From 796ca15fb07ace942c6846c41814f1ab0f27e87f Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Sun, 14 Apr 2024 21:53:14 +0200 Subject: [PATCH] Simple framebuffer abstraction --- src/arch/x86/CMakeLists.txt | 1 + src/arch/x86/LimineFramebuffer.cpp | 19 ++++++ src/arch/x86/LimineFramebuffer.hpp | 31 ++++++++++ src/arch/x86/kmain.cpp | 95 +----------------------------- src/kernel/CMakeLists.txt | 1 + src/kernel/Framebuffer.cpp | 5 ++ src/kernel/Framebuffer.hpp | 31 ++++++++++ src/kernel/cppsupport.cpp | 2 +- 8 files changed, 91 insertions(+), 94 deletions(-) create mode 100644 src/arch/x86/LimineFramebuffer.cpp create mode 100644 src/arch/x86/LimineFramebuffer.hpp create mode 100644 src/kernel/Framebuffer.cpp create mode 100644 src/kernel/Framebuffer.hpp diff --git a/src/arch/x86/CMakeLists.txt b/src/arch/x86/CMakeLists.txt index 52e995136..4a4378615 100644 --- a/src/arch/x86/CMakeLists.txt +++ b/src/arch/x86/CMakeLists.txt @@ -26,6 +26,7 @@ target_sources(kernel.elf PRIVATE syscalls.asm limine_modules.cpp handle_exception.cpp + LimineFramebuffer.cpp ) target_include_directories(kernel.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/arch/x86/LimineFramebuffer.cpp b/src/arch/x86/LimineFramebuffer.cpp new file mode 100644 index 000000000..a0008448d --- /dev/null +++ b/src/arch/x86/LimineFramebuffer.cpp @@ -0,0 +1,19 @@ +// +// Created by Stepan Usatiuk on 14.04.2024. +// + +#include "LimineFramebuffer.hpp" + + +LimineFramebuffer::LimineFramebuffer(limine_framebuffer *limine_framebuffer) : _backing(limine_framebuffer) { + _dimensions = {.x = limine_framebuffer->width, .y = limine_framebuffer->height}; +} +void LimineFramebuffer::set(size_t x, size_t y, uint32_t color) { + *coord_to_ptr(x, y) = color; +} +int LimineFramebuffer::get(size_t x, size_t y) { + return *coord_to_ptr(x, y); +} +uint32_t *LimineFramebuffer::coord_to_ptr(size_t x, size_t y) { + return &((uint32_t *) _backing->address)[x * (_backing->pitch / 4) + y]; +} diff --git a/src/arch/x86/LimineFramebuffer.hpp b/src/arch/x86/LimineFramebuffer.hpp new file mode 100644 index 000000000..7bb52af80 --- /dev/null +++ b/src/arch/x86/LimineFramebuffer.hpp @@ -0,0 +1,31 @@ +// +// Created by Stepan Usatiuk on 14.04.2024. +// + +#ifndef LIMINEFRAMEBUFFER_HPP +#define LIMINEFRAMEBUFFER_HPP + + +#include + +#include +#include + +#include + +class LimineFramebuffer : public Framebuffer { +public: + LimineFramebuffer(limine_framebuffer *limine_framebuffer); + + void set(size_t x, size_t y, uint32_t color) override; + int get(size_t x, size_t y) override; + +private: + + uint32_t* coord_to_ptr(size_t x, size_t y); + + limine_framebuffer *_backing; +}; + + +#endif //LIMINEFRAMEBUFFER_HPP diff --git a/src/arch/x86/kmain.cpp b/src/arch/x86/kmain.cpp index 2af1d2cd7..fe54babab 100644 --- a/src/arch/x86/kmain.cpp +++ b/src/arch/x86/kmain.cpp @@ -30,101 +30,15 @@ #include "task.hpp" #include "timer.hpp" -void ktask(); - -void ktask2() { - // Ensure we got a framebuffer. - assert2(framebuffer_count >= 1, "No framebuffer!"); - - struct limine_framebuffer *framebuffer = &framebuffers[0]; - - for (uint32_t c = 0; c < 2; c++) { - // Note: we assume the framebuffer model is RGB with 32-bit pixels. - for (size_t i = 0; i < 100; i++) { - Scheduler::sleep_self(25000); - uint32_t *fb_ptr = static_cast(framebuffer->address); - fb_ptr[i * (framebuffer->pitch / 4) + i + 100] = c ? 0 : 0xFFFFFF; - } - } - (new Task(Task::TaskMode::TASKMODE_KERN, ktask, "one"))->start(); -} - - -void ktask() { - // Ensure we got a framebuffer. - assert2(framebuffer_count >= 1, "No framebuffer!"); - - struct limine_framebuffer *framebuffer = &framebuffers[0]; - - for (uint32_t c = 0; c < 2; c++) { - // Note: we assume the framebuffer model is RGB with 32-bit pixels. - for (size_t i = 0; i < 100; i++) { - Scheduler::sleep_self(25000); - uint32_t *fb_ptr = static_cast(framebuffer->address); - fb_ptr[i * (framebuffer->pitch / 4) + i] = c ? 0 : 0xFFFFFF; - } - } - (new Task(Task::TaskMode::TASKMODE_KERN, ktask2, "two"))->start(); -} - -static Mutex testmutex; - -void mtest1() { - { - LockGuard l(testmutex); - GlobalTtyManager.all_tty_putstr("Locked1\n"); - Scheduler::sleep_self(100000); - } - GlobalTtyManager.all_tty_putstr("Unlocked1\n"); -} - -void mtest2() { - { - LockGuard l(testmutex); - GlobalTtyManager.all_tty_putstr("Locked2\n"); - Scheduler::sleep_self(100000); - } - GlobalTtyManager.all_tty_putstr("Unlocked2\n"); -} - -void mtest3() { - { - LockGuard l(testmutex); - GlobalTtyManager.all_tty_putstr("Locked3\n"); - Scheduler::sleep_self(100000); - } - GlobalTtyManager.all_tty_putstr("Unlocked3\n"); -} - -void stress() { - static std::atomic i = 0; - int curi = i++; - if (curi > 1500) return; - - Scheduler::sleep_self(100000 - curi * 10); - - char buf[69]; - itoa(curi, buf, 10); - // GlobalTtyManager.all_tty_putstr("stress "); - // GlobalTtyManager.all_tty_putstr(buf); - // GlobalTtyManager.all_tty_putstr("\n"); -} +#include void templates_tester() { GlobalTtyManager.all_tty_putstr("Testing templates\n"); - for (int i = 0; i < 100; i++) + for (int i = 0; i < 5; i++) test_templates(); GlobalTtyManager.all_tty_putstr("Testing templates OK\n"); } -void stress_tester() { - for (int i = 0; i < 100; i++) - (new Task(Task::TaskMode::TASKMODE_KERN, stress, "stress"))->start(); - - GlobalTtyManager.all_tty_putstr("Finished stress\n"); -} - - void vfs_tester() { VFSTester vfsTester; vfsTester.test(); @@ -133,13 +47,8 @@ void vfs_tester() { void ktask_main() { GlobalTtyManager.add_tty(new SerialTty()); - (new Task(Task::TaskMode::TASKMODE_KERN, ktask, "one"))->start(); - (new Task(Task::TaskMode::TASKMODE_KERN, mtest1, "mtest1"))->start(); - (new Task(Task::TaskMode::TASKMODE_KERN, mtest2, "mtest2"))->start(); - (new Task(Task::TaskMode::TASKMODE_KERN, mtest3, "mtest3"))->start(); (new Task(Task::TaskMode::TASKMODE_KERN, templates_tester, "templates_tester"))->start(); (new Task(Task::TaskMode::TASKMODE_KERN, templates_tester, "templates_tester2"))->start(); - (new Task(Task::TaskMode::TASKMODE_KERN, stress_tester, "stress_tester"))->start(); VFSGlobals::mounts.add_mount(new MemFs(&VFSGlobals::root)); (new Task(Task::TaskMode::TASKMODE_KERN, vfs_tester, "vfs_tester"))->start(); diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 0bbff2827..d3fc7097a 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -14,6 +14,7 @@ target_sources(kernel.elf PRIVATE BytesFormatter.cpp string.c TestTemplates.cpp + Framebuffer.cpp ) add_subdirectory(templates) diff --git a/src/kernel/Framebuffer.cpp b/src/kernel/Framebuffer.cpp new file mode 100644 index 000000000..8be99ec22 --- /dev/null +++ b/src/kernel/Framebuffer.cpp @@ -0,0 +1,5 @@ +// +// Created by Stepan Usatiuk on 14.04.2024. +// + +#include "Framebuffer.hpp" diff --git a/src/kernel/Framebuffer.hpp b/src/kernel/Framebuffer.hpp new file mode 100644 index 000000000..0d9fbf6d3 --- /dev/null +++ b/src/kernel/Framebuffer.hpp @@ -0,0 +1,31 @@ +// +// Created by Stepan Usatiuk on 14.04.2024. +// + +#ifndef FRAMEBUFFER_HPP +#define FRAMEBUFFER_HPP + + +#include +#include +#include + + +class Framebuffer { +public: + struct dimensions_t { + size_t x; + size_t y; + }; + + dimensions_t dimensions() { return _dimensions; } + + virtual void set(size_t x, size_t y, uint32_t color) = 0; + virtual int get(size_t x, size_t y) = 0; + +protected: + dimensions_t _dimensions; +}; + + +#endif //FRAMEBUFFER_HPP diff --git a/src/kernel/cppsupport.cpp b/src/kernel/cppsupport.cpp index 024149fe8..eff2deb03 100644 --- a/src/kernel/cppsupport.cpp +++ b/src/kernel/cppsupport.cpp @@ -79,7 +79,7 @@ void *__dso_handle = nullptr; // Do we really care about destructors at kernel exit? int __cxa_atexit(void (*f)(void *), void *objptr, void *dso) { - writestr_no_yield("Something registered\n"); + // writestr_no_yield("Something registered\n"); return 0; };