video: Implement fb_clear()
diff --git a/stage23/drivers/gop.c b/stage23/drivers/gop.c
index d42d72e8..42f6f129 100644
--- a/stage23/drivers/gop.c
+++ b/stage23/drivers/gop.c
@@ -119,13 +119,7 @@ static bool try_mode(struct fb_info *ret, size_t mode, int width, int height, in
ret->framebuffer_width = gop->Mode->Info->HorizontalResolution;
ret->framebuffer_height = gop->Mode->Info->VerticalResolution;
- // Clear framebuffer
- for (size_t y = 0; y < ret->framebuffer_height; y++) {
- for (size_t x = 0; x < ret->framebuffer_pitch; x++) {
- uint8_t *fbp = (uint8_t *)(uintptr_t)ret->framebuffer_addr;
- fbp[y * ret->framebuffer_pitch + x] = 0;
- }
- }
+ fb_clear(ret);
return true;
}
diff --git a/stage23/drivers/vbe.c b/stage23/drivers/vbe.c
index 489db752..24702532 100644
--- a/stage23/drivers/vbe.c
+++ b/stage23/drivers/vbe.c
@@ -209,13 +209,7 @@ retry:
ret->blue_mask_shift = vbe_mode_info.lin_blue_mask_shift;
}
- // Clear framebuffer
- for (size_t y = 0; y < ret->framebuffer_height; y++) {
- for (size_t x = 0; x < ret->framebuffer_pitch; x++) {
- uint8_t *fbp = (uint8_t *)(uintptr_t)ret->framebuffer_addr;
- fbp[y * ret->framebuffer_pitch + x] = 0;
- }
- }
+ fb_clear(ret);
return true;
}
diff --git a/stage23/lib/fb.c b/stage23/lib/fb.c
index 82ba9280..c51107cf 100644
--- a/stage23/lib/fb.c
+++ b/stage23/lib/fb.c
@@ -1,3 +1,4 @@
+#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <lib/fb.h>
@@ -12,3 +13,34 @@ bool fb_init(struct fb_info *ret,
return init_gop(ret, target_width, target_height, target_bpp);
#endif
}
+
+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;
+ }
+ }
+ }
+}
diff --git a/stage23/lib/fb.h b/stage23/lib/fb.h
index 3c60b896..efce5576 100644
--- a/stage23/lib/fb.h
+++ b/stage23/lib/fb.h
@@ -27,4 +27,6 @@ struct fb_info {
bool fb_init(struct fb_info *ret,
uint16_t target_width, uint16_t target_height, uint16_t target_bpp);
+void fb_clear(struct fb_info *fb);
+
#endif
