mirror of
https://github.com/usatiuk/ficus.git
synced 2025-10-28 16:17:51 +01:00
Simple framebuffer abstraction
This commit is contained in:
@@ -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})
|
||||
|
||||
19
src/arch/x86/LimineFramebuffer.cpp
Normal file
19
src/arch/x86/LimineFramebuffer.cpp
Normal 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];
|
||||
}
|
||||
31
src/arch/x86/LimineFramebuffer.hpp
Normal file
31
src/arch/x86/LimineFramebuffer.hpp
Normal 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
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ target_sources(kernel.elf PRIVATE
|
||||
BytesFormatter.cpp
|
||||
string.c
|
||||
TestTemplates.cpp
|
||||
Framebuffer.cpp
|
||||
)
|
||||
|
||||
add_subdirectory(templates)
|
||||
|
||||
5
src/kernel/Framebuffer.cpp
Normal file
5
src/kernel/Framebuffer.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 14.04.2024.
|
||||
//
|
||||
|
||||
#include "Framebuffer.hpp"
|
||||
31
src/kernel/Framebuffer.hpp
Normal file
31
src/kernel/Framebuffer.hpp
Normal 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
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user