diff options
Diffstat (limited to 'kernel/drivers/gpu.c')
-rw-r--r-- | kernel/drivers/gpu.c | 95 |
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); } |