2021-04-04 05:02:05 +03:00
|
|
|
#include <stddef.h>
|
2021-03-02 08:21:05 +03:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <lib/fb.h>
|
|
|
|
#include <drivers/vbe.h>
|
2021-03-02 12:23:43 +03:00
|
|
|
#include <drivers/gop.h>
|
2021-04-07 03:10:28 +03:00
|
|
|
#include <mm/pmm.h>
|
2021-03-02 08:21:05 +03:00
|
|
|
|
|
|
|
bool fb_init(struct fb_info *ret,
|
2022-05-22 07:38:34 +03:00
|
|
|
uint64_t target_width, uint64_t target_height, uint16_t target_bpp) {
|
2021-04-07 03:10:28 +03:00
|
|
|
bool r;
|
|
|
|
|
2021-07-15 11:03:47 +03:00
|
|
|
#if bios == 1
|
2021-04-07 03:10:28 +03:00
|
|
|
r = init_vbe(ret, target_width, target_height, target_bpp);
|
2021-07-15 11:03:47 +03:00
|
|
|
#elif uefi == 1
|
2021-04-07 03:10:28 +03:00
|
|
|
r = init_gop(ret, target_width, target_height, target_bpp);
|
2021-03-02 12:23:43 +03:00
|
|
|
#endif
|
2021-04-07 03:10:28 +03:00
|
|
|
|
|
|
|
return r;
|
2021-03-02 08:21:05 +03:00
|
|
|
}
|
2021-04-04 05:02:05 +03:00
|
|
|
|
|
|
|
void fb_clear(struct fb_info *fb) {
|
|
|
|
for (size_t y = 0; y < fb->framebuffer_height; y++) {
|
|
|
|
switch (fb->framebuffer_bpp) {
|
|
|
|
case 32: {
|
|
|
|
uint32_t *fbp = (void *)(uintptr_t)fb->framebuffer_addr;
|
|
|
|
size_t row = (y * fb->framebuffer_pitch) / 4;
|
|
|
|
for (size_t x = 0; x < fb->framebuffer_width; x++) {
|
|
|
|
fbp[row + x] = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 16: {
|
|
|
|
uint16_t *fbp = (void *)(uintptr_t)fb->framebuffer_addr;
|
|
|
|
size_t row = (y * fb->framebuffer_pitch) / 2;
|
|
|
|
for (size_t x = 0; x < fb->framebuffer_width; x++) {
|
|
|
|
fbp[row + x] = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default: {
|
|
|
|
uint8_t *fbp = (void *)(uintptr_t)fb->framebuffer_addr;
|
|
|
|
size_t row = y * fb->framebuffer_pitch;
|
|
|
|
for (size_t x = 0; x < fb->framebuffer_width * fb->framebuffer_bpp; x++) {
|
|
|
|
fbp[row + x] = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|