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
|
syscalls.asm
|
||||||
limine_modules.cpp
|
limine_modules.cpp
|
||||||
handle_exception.cpp
|
handle_exception.cpp
|
||||||
|
LimineFramebuffer.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(kernel.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
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 "task.hpp"
|
||||||
#include "timer.hpp"
|
#include "timer.hpp"
|
||||||
|
|
||||||
void ktask();
|
#include <LimineFramebuffer.hpp>
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
void templates_tester() {
|
void templates_tester() {
|
||||||
GlobalTtyManager.all_tty_putstr("Testing templates\n");
|
GlobalTtyManager.all_tty_putstr("Testing templates\n");
|
||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
test_templates();
|
test_templates();
|
||||||
GlobalTtyManager.all_tty_putstr("Testing templates OK\n");
|
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() {
|
void vfs_tester() {
|
||||||
VFSTester vfsTester;
|
VFSTester vfsTester;
|
||||||
vfsTester.test();
|
vfsTester.test();
|
||||||
@@ -133,13 +47,8 @@ void vfs_tester() {
|
|||||||
void ktask_main() {
|
void ktask_main() {
|
||||||
GlobalTtyManager.add_tty(new SerialTty());
|
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_tester"))->start();
|
||||||
(new Task(Task::TaskMode::TASKMODE_KERN, templates_tester, "templates_tester2"))->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));
|
VFSGlobals::mounts.add_mount(new MemFs(&VFSGlobals::root));
|
||||||
(new Task(Task::TaskMode::TASKMODE_KERN, vfs_tester, "vfs_tester"))->start();
|
(new Task(Task::TaskMode::TASKMODE_KERN, vfs_tester, "vfs_tester"))->start();
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ target_sources(kernel.elf PRIVATE
|
|||||||
BytesFormatter.cpp
|
BytesFormatter.cpp
|
||||||
string.c
|
string.c
|
||||||
TestTemplates.cpp
|
TestTemplates.cpp
|
||||||
|
Framebuffer.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(templates)
|
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?
|
// Do we really care about destructors at kernel exit?
|
||||||
int __cxa_atexit(void (*f)(void *), void *objptr, void *dso) {
|
int __cxa_atexit(void (*f)(void *), void *objptr, void *dso) {
|
||||||
writestr_no_yield("Something registered\n");
|
// writestr_no_yield("Something registered\n");
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user