:: commit 49ac7572d1c9c5fb8fdd045424f3e725ec1ba40d

mintsuki <mintsuki@protonmail.com> — 2021-04-04 02:02

parents: 1ffb45ac9c

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
tab: 248 wrap: offon