X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=main.c;h=a087561f28a3b7da6947174f1156c050be0d5746;hb=6018e36555e1a02bc85e6b4212a0e70dec79a264;hp=476baa74ebb72a6c0f6260aa5f6620c8799c09e8;hpb=696108c29db9a5271f45decee642a4ac72c3367d;p=vidsys diff --git a/main.c b/main.c index 476baa7..a087561 100644 --- a/main.c +++ b/main.c @@ -5,14 +5,17 @@ #include "vidsys.h" void test8bpp(void); +void testrgb(void); struct vid_modeinfo *vm; -void *vmem; +void *vmem, *framebuf; +int doublebuf; static const char *usage_fmt = "Usage %s: [options]\n" "Options: \n" " -s : video resolution\n" - " -b : color depth\n"; + " -b : color depth\n" + " -d: double buffer\n"; int main(int argc, char **argv) { @@ -41,6 +44,11 @@ invalopt: fprintf(stderr, "invalid option: %s\n", argv[i]); fprintf(stderr, "invalid color depth: %s\n", argv[i]); return 1; } + break; + + case 'd': + doublebuf = 1; + break; case 'h': printf(usage_fmt, argv[0]); @@ -67,19 +75,22 @@ invalopt: fprintf(stderr, "invalid option: %s\n", argv[i]); fprintf(stderr, "failed to find video mode: %dx%d %dbpp\n", xres, yres, bpp); return 1; } + vm = vid_modeinfo(mode); + + if(!(framebuf = malloc(vm->pitch * vm->width))) { + fprintf(stderr, "failed to allocate main memory framebuffer\n"); + return 1; + } + if(!(vmem = vid_setmode(mode))) { fprintf(stderr, "failed to set video mode %04x\n", mode); return 1; } - vm = vid_modeinfo(mode); - switch(vm->bpp) { - case 8: + if(vm->bpp == 8) { test8bpp(); - break; - - default: - break; + } else { + testrgb(); } for(;;) { @@ -119,27 +130,110 @@ void test8bpp(void) } vid_setpal(0, 256, cmap); - if(vid_islinear()) { - winsz = INT_MAX; + if(doublebuf) { + fb = framebuf; + for(i=0; iheight; i++) { + for(j=0; jwidth; j++) { + *fb++ = i ^ j; + } + } + vid_blitfb(framebuf, 0); } else { - winsz = 65536; - winpos = 0; - vid_setwin(0, 0); + if(vid_islinear()) { + winsz = INT_MAX; + } else { + winsz = vm->win_size << 10; + winpos = 0; + vid_setwin(0, 0); + } + winleft = winsz; + fb = vmem; + + vid_vsync(); + + for(i=0; iheight; i++) { + for(j=0; jwidth; j++) { + if(winleft-- <= 0) { + winpos += vm->win_step; + vid_setwin(0, winpos); + winleft = winsz; + fb = vmem; + } + *fb++ = i ^ j; + } + } } - winleft = winsz; - fb = vmem; +} - vid_vsync(); +void testrgb(void) +{ + int i, j, r, g, b; + unsigned char *fb24; + uint16_t *fb16; + uint32_t *fb32; + uint32_t pcol; + int winsz, winleft, winpos; + + if(!doublebuf) { + if(vid_islinear()) { + winsz = INT_MAX; + } else { + winsz = vm->win_size << 10; + winpos = 0; + vid_setwin(0, 0); + } + winleft = winsz; + fb24 = vmem; + fb32 = vmem; + fb16 = vmem; + + vid_vsync(); + } else { + fb24 = framebuf; + fb32 = framebuf; + fb16 = framebuf; + } for(i=0; iheight; i++) { for(j=0; jwidth; j++) { - if(winleft-- <= 0) { - winpos += vm->win_step; - vid_setwin(0, winpos); - winleft = winsz; - fb = vmem; + if(!doublebuf) { + if(winleft <= 0) { + winpos += vm->win_step; + vid_setwin(0, winpos); + winleft = winsz; + fb24 = vmem; + fb16 = vmem; + fb32 = vmem; + } + winleft -= (vm->bpp + 7) >> 3; + } + r = (i ^ j) >> 1; + g = i ^ j; + b = (i ^ j) << 1; + vm->ops.pack(&pcol, r, g, b); + + switch(vm->bpp) { + case 15: + case 16: + *fb16++ = pcol; + break; + + case 24: + fb24[0] = r; + fb24[1] = g; + fb24[2] = b; + fb24 += 3; + break; + + case 32: + *fb32++ = pcol; + break; } - *fb++ = i ^ j; } } + + if(doublebuf) { + vid_vsync(); + vid_blitfb(framebuf, 0); + } }