summaryrefslogtreecommitdiff
path: root/kernel/drivers/gpu.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-19 16:36:51 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-19 16:37:54 -0400
commit472ec944d2ed81d0304cc6cac80946a6a44776be (patch)
treef6cae641c143a0b45bb289d9d9fc6145706025b0 /kernel/drivers/gpu.c
parentset mmap limit (diff)
downloadcomus-472ec944d2ed81d0304cc6cac80946a6a44776be.tar.gz
comus-472ec944d2ed81d0304cc6cac80946a6a44776be.tar.bz2
comus-472ec944d2ed81d0304cc6cac80946a6a44776be.zip
UEFI and republicans
Diffstat (limited to 'kernel/drivers/gpu.c')
-rw-r--r--kernel/drivers/gpu.c95
1 files changed, 24 insertions, 71 deletions
diff --git a/kernel/drivers/gpu.c b/kernel/drivers/gpu.c
index 730fa42..17e7e18 100644
--- a/kernel/drivers/gpu.c
+++ b/kernel/drivers/gpu.c
@@ -1,91 +1,44 @@
#include <lib.h>
#include <comus/drivers/gpu.h>
+#include <comus/drivers/gpu/gop.h>
#include <comus/drivers/gpu/bochs.h>
+#include <comus/drivers/gpu/vga_text.h>
#include <comus/error.h>
#include <comus/term.h>
#include <comus/asm.h>
-enum gpu_type {
- GPU_UNSET = 0,
- GPU_BOCHS = 1,
- N_GPU_TYPE,
-};
-
-static enum gpu_type type = GPU_UNSET;
-
-static const char *gpu_type_str[N_GPU_TYPE] = { "Unknown", "Bochs" };
-
-struct psf2_font {
- uint8_t magic[4];
- uint32_t version;
- uint32_t header_size;
- uint32_t flags;
- uint32_t length;
- uint32_t glyph_size;
- uint32_t height;
- uint32_t width;
- uint8_t data[];
-};
-
-extern struct psf2_font en_font;
+struct gpu *gpu_dev = NULL;
int gpu_init(void)
{
- if (bochs_init() == SUCCESS)
- type = GPU_BOCHS;
-
- if (type != GPU_UNSET) {
- uint16_t width = gpu_width() / en_font.width;
- uint16_t height = gpu_height() / en_font.height;
- term_switch_handler(width, height, gpu_draw_char);
+ // try to get a gpu device
+ if (!gpu_dev && gop_init(&gpu_dev) == SUCCESS) {
}
-
- return type != GPU_UNSET;
-}
-
-uint32_t gpu_width(void)
-{
- switch (type) {
- case GPU_BOCHS:
- return bochs_width();
- default:
- return 0;
+ if (!gpu_dev && bochs_init(&gpu_dev) == SUCCESS) {
}
-}
-uint32_t gpu_height(void)
-{
- switch (type) {
- case GPU_BOCHS:
- return bochs_height();
- default:
- return 0;
- }
-}
+ // if we did (yay!) resize terminal
+ if (gpu_dev)
+ term_resize(gpu_dev->width, gpu_dev->height);
-uint8_t gpu_bit_depth(void)
-{
- switch (type) {
- case GPU_BOCHS:
- return bochs_bit_depth();
- default:
- return 0;
- }
+ return gpu_dev != NULL;
}
void gpu_set_pixel(uint32_t x, uint32_t y, uint32_t r, uint32_t g, uint32_t b)
{
- switch (type) {
- case GPU_BOCHS:
- bochs_set_pixel(x, y, r, g, b);
- break;
- default:
- break;
- }
+ // TODO: handle other bpp
+ volatile uint32_t *fb = (volatile uint32_t *)gpu_dev->framebuffer;
+ int offset = y * gpu_dev->width + x;
+ fb[offset] = (b << 0) | (g << 8) | (r << 16);
}
void gpu_draw_char(char c, uint16_t cx, uint16_t cy)
{
+ if (gpu_dev == NULL) {
+ vga_text_draw_char(c, cx, cy);
+ return;
+ }
+
uint32_t sx = en_font.width * cx;
uint32_t sy = en_font.height * cy;
@@ -107,11 +60,11 @@ void gpu_draw_char(char c, uint16_t cx, uint16_t cy)
void gpu_report(void)
{
- if (type == GPU_UNSET)
+ if (gpu_dev == NULL)
return;
- kprintf("GPU (%s)\n", gpu_type_str[type]);
- kprintf("Width: %d\n", gpu_width());
- kprintf("Height: %d\n", gpu_height());
- kprintf("Bit depth: %d\n\n", gpu_bit_depth());
+ kprintf("GPU (%s)\n", gpu_dev->name);
+ kprintf("Width: %d\n", gpu_dev->width);
+ kprintf("Height: %d\n", gpu_dev->height);
+ kprintf("Bit depth: %d\n\n", gpu_dev->bit_depth);
}