On Fri, Mar 17, 2017 at 05:49:40PM +0100, Patrick Rudolph wrote:
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.
Signed-off-by: Patrick Rudolph siro@das-labor.org
vgasrc/bochsvga.c | 5 +++++ vgasrc/bochsvga.h | 1 + vgasrc/cbvga.c | 7 +++++++ vgasrc/clext.c | 5 +++++ vgasrc/stdvga.c | 5 +++++ vgasrc/vbe.c | 2 +- vgasrc/vgahw.h | 10 ++++++++++ vgasrc/vgautil.h | 3 +++ 8 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/vgasrc/bochsvga.c b/vgasrc/bochsvga.c index ec5d101..458b3a8 100644 --- a/vgasrc/bochsvga.c +++ b/vgasrc/bochsvga.c @@ -310,6 +310,11 @@ bochsvga_save_restore(int cmd, u16 seg, void *data) return ret + (VBE_DISPI_INDEX_Y_OFFSET-VBE_DISPI_INDEX_XRES+1)*sizeof(u16); }
+int +bochsvga_get_linesize(struct vgamode_s *vmode_g) +{
- return DIV_ROUND_UP(vmode_g->width * vga_bpp(vmode_g), 8);
+}
/****************************************************************
- Mode setting
diff --git a/vgasrc/bochsvga.h b/vgasrc/bochsvga.h index ae5f75d..40ce6f1 100644 --- a/vgasrc/bochsvga.h +++ b/vgasrc/bochsvga.h @@ -52,6 +52,7 @@ int bochsvga_get_dacformat(struct vgamode_s *vmode_g); int bochsvga_set_dacformat(struct vgamode_s *vmode_g, int val); int bochsvga_save_restore(int cmd, u16 seg, void *data); int bochsvga_set_mode(struct vgamode_s *vmode_g, int flags); +int bochsvga_get_linesize(struct vgamode_s *vmode_g); int bochsvga_setup(void);
#endif // bochsvga.h diff --git a/vgasrc/cbvga.c b/vgasrc/cbvga.c index 87ec77e..50e6e69 100644 --- a/vgasrc/cbvga.c +++ b/vgasrc/cbvga.c @@ -123,6 +123,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/clext.c b/vgasrc/clext.c index da8b790..08bc9b5 100644 --- a/vgasrc/clext.c +++ b/vgasrc/clext.c @@ -376,6 +376,11 @@ clext_save_restore(int cmd, u16 seg, void *data) return stdvga_save_restore(cmd, seg, data); }
+int +clext_get_linesize(struct vgamode_s *vmode_g) +{
- return DIV_ROUND_UP(vmode_g->width * vga_bpp(vmode_g), 8);
+}
/****************************************************************
- Mode setting
diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c index 886deca..0e24297 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 facad19..724c1ba 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 dab2b4d..5839643 100644 --- a/vgasrc/vgahw.h +++ b/vgasrc/vgahw.h @@ -139,4 +139,14 @@ 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_CIRRUS)
return clext_get_linesize(vmode_g);
- if (CONFIG_VGA_BOCHS)
return bochsvga_get_linesize(vmode_g);
- if (CONFIG_VGA_COREBOOT)
return cbvga_get_linesize(vmode_g);
- return stdvga_get_linesize(vmode_g);
+}
Minor nit - I think it would be preferable if this was:
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); }
to reduce the duplicate code in the cirrus/bochs implementations.
Thanks. -Kevin