diff options
author | Patrick Rudolph <siro@das-labor.org> | 2017-05-29 19:25:12 +0200 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-06-12 15:17:09 -0400 |
commit | 4902b8a703779ee2d85da406d6f1dc16df71a43d (patch) | |
tree | 9d78ef245ac730a3b2a1bd5e70f0d1ef1ec1db2e | |
parent | 4b42cc4b31f682214ab473838f0de0584f58cba8 (diff) | |
download | seabios-4902b8a703779ee2d85da406d6f1dc16df71a43d.tar.gz |
SeaVGABIOS/vbe: Query driver for scanline pitch v2
Query the driver for the real scanline pitch in bytes.
As cbvga doesn't change the pitch on mode change, always
return the same pitch, that might exceed width times Bytes-per-pixel.
Report the default stdvga pitch for all other drivers.
Signed-off-by: Patrick Rudolph <siro@das-labor.org>
-rw-r--r-- | vgasrc/cbvga.c | 7 | ||||
-rw-r--r-- | vgasrc/stdvga.c | 5 | ||||
-rw-r--r-- | vgasrc/vbe.c | 2 | ||||
-rw-r--r-- | vgasrc/vgahw.h | 6 | ||||
-rw-r--r-- | vgasrc/vgautil.h | 2 |
5 files changed, 21 insertions, 1 deletions
diff --git a/vgasrc/cbvga.c b/vgasrc/cbvga.c index 39ffdbb2..417ade3a 100644 --- a/vgasrc/cbvga.c +++ b/vgasrc/cbvga.c @@ -115,6 +115,13 @@ cbvga_set_mode(struct vgamode_s *vmode_g, int flags) return 0; } +int +cbvga_get_linesize(struct vgamode_s *vmode_g) +{ + /* Can't change mode, always report active pitch. */ + return GET_GLOBAL(CBlinelength); +} + #define CB_TAG_FRAMEBUFFER 0x0012 struct cb_framebuffer { u32 tag; diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c index 886deca0..0e24297e 100644 --- a/vgasrc/stdvga.c +++ b/vgasrc/stdvga.c @@ -321,6 +321,11 @@ stdvga_set_dacformat(struct vgamode_s *vmode_g, int val) return -1; } +int +stdvga_get_linesize(struct vgamode_s *vmode_g) +{ + return DIV_ROUND_UP(vmode_g->width * vga_bpp(vmode_g), 8); +} /**************************************************************** * Save/Restore state diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c index facad198..724c1bad 100644 --- a/vgasrc/vbe.c +++ b/vgasrc/vbe.c @@ -107,7 +107,7 @@ vbe_104f01(struct bregs *regs) // Basic information about mode. int width = GET_GLOBAL(vmode_g->width); int height = GET_GLOBAL(vmode_g->height); - int linesize = DIV_ROUND_UP(width * vga_bpp(vmode_g), 8); + int linesize = vgahw_get_linesize(vmode_g); SET_FARVAR(seg, info->bytes_per_scanline, linesize); SET_FARVAR(seg, info->xres, width); SET_FARVAR(seg, info->yres, height); diff --git a/vgasrc/vgahw.h b/vgasrc/vgahw.h index dab2b4dd..2a85eba8 100644 --- a/vgasrc/vgahw.h +++ b/vgasrc/vgahw.h @@ -139,4 +139,10 @@ static inline int vgahw_save_restore(int cmd, u16 seg, void *data) { return stdvga_save_restore(cmd, seg, data); } +static inline int vgahw_get_linesize(struct vgamode_s *vmode_g) { + if (CONFIG_VGA_COREBOOT) + return cbvga_get_linesize(vmode_g); + return stdvga_get_linesize(vmode_g); +} + #endif // vgahw.h diff --git a/vgasrc/vgautil.h b/vgasrc/vgautil.h index 08c4e8dc..fae5fbae 100644 --- a/vgasrc/vgautil.h +++ b/vgasrc/vgautil.h @@ -17,6 +17,7 @@ int cbvga_get_dacformat(struct vgamode_s *vmode_g); int cbvga_set_dacformat(struct vgamode_s *vmode_g, int val); int cbvga_save_restore(int cmd, u16 seg, void *data); int cbvga_set_mode(struct vgamode_s *vmode_g, int flags); +int cbvga_get_linesize(struct vgamode_s *vmode_g); int cbvga_setup(void); // clext.c @@ -63,6 +64,7 @@ void stdvga_list_modes(u16 seg, u16 *dest, u16 *last); void stdvga_build_video_param(void); void stdvga_override_crtc(int mode, u8 *crtc); int stdvga_set_mode(struct vgamode_s *vmode_g, int flags); +int stdvga_get_linesize(struct vgamode_s *vmode_g); void stdvga_set_packed_palette(void); // swcursor.c |