Made first major changes; missing integration and optimization

This commit is contained in:
Eric-Paul I 2023-03-09 18:04:47 +01:00
parent ed98984164
commit a4b246095a
11 changed files with 243 additions and 0 deletions

View File

@ -0,0 +1,12 @@
#ifndef NOX_GRAPHICS_COMMAND_QUEUE_H
#define NOX_GRAPHICS_COMMAND_QUEUE_H
#include <utils/math.h>
#include <utils/memory.h>
#include <utils/stdtypes.h>
// TODO
#endif

View File

@ -0,0 +1,12 @@
#ifndef NOX_GRAPHICS_DEFAULT_IMPLEMENTATION_H
#define NOX_GRAPHICS_DEFAULT_IMPLEMENTATION_H
#include <utils/math.h>
#include <utils/memory.h>
#include <utils/stdtypes.h>
// TODO
#endif

View File

@ -0,0 +1,35 @@
#ifndef NOX_GRAPHICS_DRIVER_H
#define NOX_GRAPHICS_DRIVER_H
#include <boot/boot_info.h>
#include <utils/math.h>
#include <utils/memory.h>
#include <utils/stdtypes.h>
#include <drivers/gfx/pixelbuffer.h>
typedef struct framebuffer_t {
uint32_t pixel_width;
uint32_t pixel_height;
uint8_t pixel_stride;
void *memory_mapping;
pixelbuffer_T *root_pixelbuffer;
} framebuffer_T;
typedef struct graphics_driver_t {
uint32_t num_framebuffers;
framebuffer_T *framebuffers;
} graphics_driver_T;
graphics_driver_T * create_graphics_driver_from_boot_info(boot_info_T *boot_info);
void delete_graphics_driver(graphics_driver_T *driver);
#endif

View File

@ -0,0 +1,51 @@
#ifndef NOX_PIXELBUFFER_H
#define NOX_PIXELBUFFER_H
#include <utils/math.h>
#include <utils/memory.h>
#include <utils/stdtypes.h>
#include <drivers/gfx/utility.h>
typedef struct pixelbuffer_t pixelbuffer_T;
struct pixelbuffer_t {
//
// Other relevant state
//
pixelbuffer_T *parent;
// root_pixelbuffer: The first pixelbuffer for a screen, it represents the whole screen
// from a drawing perspective. In the root pixelbuffers themselves, this is NULL.
pixelbuffer_T *root_pixelbuffer;
//
// Dimensions of the pixelbuffers' area
//
uint32_t relative_start_x;
uint32_t relative_start_y;
uint32_t absolute_start_x;
uint32_t absolute_start_y;
uint32_t pixel_width;
uint32_t pixel_height;
//
// Information necessary for drawing
//
// pixel_stride: The distance between pixels in 'mapped_region', in bytes.
uint8_t pixel_stride;
void *memory_mapping;
};
pixelbuffer_T * create_pixelbuffer (pixelbuffer_T *parent);
void delete_pixelbuffer (pixelbuffer_T *pixelbuffer);
void graphics_set_pixel (pixelbuffer_T *pixelbuffer,
uint32_t relative_x, uint32_t relative_y, pixel_T pixel);
#endif

View File

@ -0,0 +1,12 @@
#ifndef NOX_GRAPHICS_STRINGIFY_ENUMS_H
#define NOX_GRAPHICS_STRINGIFY_ENUMS_H
#include <utils/math.h>
#include <utils/memory.h>
#include <utils/stdtypes.h>
// TODO
#endif

View File

@ -0,0 +1,19 @@
#ifndef NOX_GRAPHICS_UTILITY_H
#define NOX_GRAPHICS_UTILITY_H
#include <utils/math.h>
#include <utils/memory.h>
#include <utils/stdtypes.h>
typedef struct
{
uint16_t red;
uint16_t green;
uint16_t blue;
uint16_t alpha;
} pixel_T;
#endif

View File

@ -0,0 +1,2 @@
// TODO

View File

@ -0,0 +1,2 @@
// TODO

View File

@ -0,0 +1,52 @@
#include <drivers/gfx/graphics_driver.h>
pixelbuffer_T * create_root_pixelbuffer(graphics_driver_T *driver, framebuffer_T *framebuffer) {
pixelbuffer_T *pixelbuffer = memory_allocate(sizeof(pixelbuffer_T));
pixelbuffer->parent = NULL;
pixelbuffer->root_pixelbuffer = NULL;
pixelbuffer->relative_start_x = 0;
pixelbuffer->relative_start_y = 0;
pixelbuffer->absolute_start_x = 0;
pixelbuffer->absolute_start_y = 0;
pixelbuffer->pixel_width = framebuffer->pixel_width;
pixelbuffer->pixel_height = framebuffer->pixel_height;
pixelbuffer->pixel_stride = framebuffer->pixel_stride;
pixelbuffer->memory_mapping = framebuffer->memory_mapping;
return pixelbuffer;
}
framebuffer_T convert_limine_framebuffer_to_noxos_framebuffer(graphics_driver_T *driver, struct limine_framebuffer *limine_framebuffer) {
framebuffer_T noxos_framebuffer;
noxos_framebuffer.pixel_width = limine_framebuffer->width;
noxos_framebuffer.pixel_height = limine_framebuffer->height;
noxos_framebuffer.pixel_stride = limine_framebuffer->bpp / 8; // TODO: Check: Is this right?
noxos_framebuffer.memory_mapping = limine_framebuffer->address;
noxos_framebuffer.root_pixelbuffer = create_root_pixelbuffer(driver, &noxos_framebuffer);
return noxos_framebuffer;
}
graphics_driver_T * create_graphics_driver_from_boot_info(boot_info_T *boot_info) {
graphics_driver_T *driver = memory_allocate(sizeof(graphics_driver_T));
driver->num_framebuffers = boot_info->framebuffer->framebuffer_count;
driver->framebuffers = memory_allocate(sizeof(framebuffer_T) * driver->num_framebuffers);
uint32_t framebuffer_index = 0;
while(framebuffer_index > boot_info->framebuffer->framebuffer_count)
{
driver->framebuffers[framebuffer_index] = convert_limine_framebuffer_to_noxos_framebuffer(
driver, &boot_info->framebuffer->framebuffers[framebuffer_index]);
++framebuffer_index;
}
return driver;
}
void delete_graphics_driver(graphics_driver_T *driver) {
// TODO
}

View File

@ -0,0 +1,44 @@
#include <drivers/gfx/pixelbuffer.h>
pixelbuffer_T * find_root_pixelbuffer(pixelbuffer_T *current) {
if(current->parent == NULL) return current;
return find_root_pixelbuffer(current->parent);
}
pixelbuffer_T * create_pixelbuffer(pixelbuffer_T *parent) {
pixelbuffer_T *pixelbuffer = memory_allocate(sizeof(pixelbuffer_T));
pixelbuffer->parent = parent;
pixelbuffer->root_pixelbuffer = find_root_pixelbuffer(parent);
pixelbuffer->memory_mapping = parent->memory_mapping;
pixelbuffer->absolute_start_x = parent->absolute_start_x;
pixelbuffer->absolute_start_y = parent->absolute_start_y;
pixelbuffer->relative_start_x = 0;
pixelbuffer->relative_start_y = 0;
pixelbuffer->pixel_width = 1;
pixelbuffer->pixel_height = 1;
pixelbuffer->pixel_stride = pixelbuffer->root_pixelbuffer->pixel_stride;
return pixelbuffer;
}
void delete_pixelbuffer(pixelbuffer_T *pixelbuffer) {
// TODO
}
void graphics_set_pixel(pixelbuffer_T *pixelbuffer,
uint32_t relative_x, uint32_t relative_y, pixel_T pixel)
{
// TODO: Check if these values are inside the pixelbuffers' range!
uint8_t *output_address = pixelbuffer->memory_mapping
+ ((relative_y * pixelbuffer->pixel_width + relative_x) + pixelbuffer->pixel_stride);
output_address[0] = pixel.red;
output_address[1] = pixel.green;
output_address[2] = pixel.blue;
}

View File

@ -0,0 +1,2 @@
// TODO