Simple framebuffer abstraction

This commit is contained in:
2024-04-14 21:53:14 +02:00
parent 4ec8ed93cb
commit 796ca15fb0
8 changed files with 91 additions and 94 deletions

View File

@@ -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})

View File

@@ -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];
}

View File

@@ -0,0 +1,31 @@
//
// Created by Stepan Usatiuk on 14.04.2024.
//
#ifndef LIMINEFRAMEBUFFER_HPP
#define LIMINEFRAMEBUFFER_HPP
#include <Framebuffer.hpp>
#include <cstddef>
#include <cstdint>
#include <limine.h>
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

View File

@@ -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<uint32_t *>(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<uint32_t *>(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<int> 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 <LimineFramebuffer.hpp>
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();

View File

@@ -14,6 +14,7 @@ target_sources(kernel.elf PRIVATE
BytesFormatter.cpp
string.c
TestTemplates.cpp
Framebuffer.cpp
)
add_subdirectory(templates)

View File

@@ -0,0 +1,5 @@
//
// Created by Stepan Usatiuk on 14.04.2024.
//
#include "Framebuffer.hpp"

View File

@@ -0,0 +1,31 @@
//
// Created by Stepan Usatiuk on 14.04.2024.
//
#ifndef FRAMEBUFFER_HPP
#define FRAMEBUFFER_HPP
#include <utility>
#include <cstddef>
#include <cstdint>
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

View File

@@ -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;
};