X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fdos%2Fdrv_vbe.c;h=ae36be8697a9ffcec2d5bb48e6a07eedbaed7854;hb=4a690a4a5268847c24e8edb08ba558a36bbd6d3c;hp=9989bb1d360f25f2c1433dcac53c430ec914e177;hpb=af36400e1b3d2d591beaf66e1539884434e30475;p=retroray diff --git a/src/dos/drv_vbe.c b/src/dos/drv_vbe.c index 9989bb1..ae36be8 100644 --- a/src/dos/drv_vbe.c +++ b/src/dos/drv_vbe.c @@ -20,10 +20,13 @@ static const char *memsize_str(long sz); static int get_mode_info(int mode, struct vbe_mode_info *mi); static int conv_vbeinfo(int mode, struct vid_modeinfo *mi, struct vbe_mode_info *vbemi); static unsigned int calc_mask(int nbits, int pos); +static void print_mode_info(int mode, struct vid_modeinfo *mi); static void pack(uint32_t *pix, int r, int g, int b); static void unpack(uint32_t pix, int *r, int *g, int *b); static void clear(uint32_t color); +static void blit_lfb(int x, int y, int w, int h, void *fb, int pitch); +static void blit_banked(int x, int y, int w, int h, void *fb, int pitch); static void blitfb_lfb(void *fb, int pitch); static void blitfb_banked(void *fb, int pitch); static void flip(int vsync); @@ -166,10 +169,14 @@ retry: cur_pgsize = minf->height * minf->pitch; if(mode & VBE_MODE_LFB) { + minf->ops.blit = blit_lfb; minf->ops.blitfb = blitfb_lfb; } else { + minf->ops.blit = blit_banked; minf->ops.blitfb = blitfb_banked; } + + print_mode_info(mode, minf); return 0; } @@ -305,6 +312,7 @@ static int conv_vbeinfo(int mode, struct vid_modeinfo *mi, struct vbe_mode_info mi->ops.getpal = vga_getpal; mi->ops.vsync = vid_vsync; mi->ops.clear = clear; + mi->ops.blit = 0; mi->ops.blitfb = 0; mi->ops.flip = flip; return 0; @@ -321,6 +329,28 @@ static unsigned int calc_mask(int nbits, int pos) return mask << pos; } +static void print_mode_info(int mode, struct vid_modeinfo *mi) +{ + infomsg("VBE mode %04x\n", mode); + infomsg(" %dx%d %d bpp (%d colors)\n", mi->width, mi->height, + mi->bpp, mi->ncolors); + infomsg(" pitch: %d bytes, %d vmem pages\n", mi->pitch, mi->pages); + + if(mi->bpp > 8) { + infomsg(" RGB mask %06x %06x %06x (pos: %d %d %d)\n", (unsigned int)mi->rmask, + (unsigned int)mi->gmask, (unsigned int)mi->bmask, mi->rshift, + mi->gshift, mi->bshift); + } + + if(mode & VBE_MODE_LFB) { + infomsg(" LFB address %xh, size: %d\n", (unsigned int)mi->vmem_addr, + (int)mi->vmem_size); + } else { + infomsg(" banked window %d kb, granularity: %d kb, step: %d\n", mi->win_size, + mi->win_gran, mi->win_step); + } +} + static void pack(uint32_t *pix, int r, int g, int b) { @@ -340,16 +370,44 @@ static void clear(uint32_t color) { } +static void blit_lfb(int x, int y, int w, int h, void *fb, int pitch) +{ + int i, pixsz, spansz; + unsigned char *dest, *src; + + /*dbgmsg("blit: %d,%d (%dx%d)\n", x, y, w, h);*/ + + pixsz = (cur_mi->bpp + 7) >> 3; + spansz = w * pixsz; + + dest = (char*)vid_vmem + cur_mi->pitch * y + x * pixsz; + src = fb; + + for(i=0; ipitch; + src += pitch; + } +} + +static void blit_banked(int x, int y, int w, int h, void *fb, int pitch) +{ + abort(); +} + static void blitfb_lfb(void *fb, int pitch) { - int i; + int i, pixsz, spansz; unsigned char *dest, *src; + pixsz = (cur_mi->bpp + 7) >> 3; + spansz = cur_mi->width * pixsz; + dest = vid_vmem; src = fb; for(i=0; iheight; i++) { - memcpy(dest, src, cur_mi->pitch); + memcpy(dest, src, spansz); dest += cur_mi->pitch; src += pitch; }