static void *vpgaddr[2];
static int fbidx;
+static int pgcount;
static int init_vbe(void)
{
return 0;
}
-void *set_video_mode(int xsz, int ysz, int bpp)
+void *set_video_mode(int xsz, int ysz, int bpp, int nbuf)
{
int i, nmodes;
int best_match_mode = -1;
mode = -1;
nmodes = vbe_num_modes(&vbe);
for(i=0; i<nmodes; i++) {
- if(vbe_mode_info(vbe.modes[i], &minf) == -1) {
+ if(vbe_mode_info(vbe.modes[i] | VBE_MODE_LFB, &minf) == -1) {
continue;
}
if(minf.xres != xsz || minf.yres != ysz) continue;
printf("setting video mode %x: (%dx%d %d)\n", (unsigned int)mode, mode_info.xres,
mode_info.yres, mode_info.bpp);
- if(vbe_setmode(mode) == -1) {
+ if(vbe_setmode(mode | VBE_MODE_LFB) == -1) {
fprintf(stderr, "failed to set video mode\n");
return 0;
}
+ if(nbuf < 1) nbuf = 1;
+ if(nbuf > 2) nbuf = 2;
+ pgcount = nbuf > mode_info.num_img_pages ? mode_info.num_img_pages : nbuf;
+
pgsize = mode_info.xres * mode_info.yres * (bpp / 8);
- fbsize = mode_info.num_img_pages * pgsize;
+ fbsize = pgcount * pgsize;
vpgaddr[0] = (void*)dpmi_mmap(mode_info.fb_addr, fbsize);
+ memset(vpgaddr[0], 0xaa, fbsize);
- if(mode_info.num_img_pages > 1) {
+ if(pgcount > 1) {
vpgaddr[1] = (char*)vpgaddr[0] + pgsize;
fbidx = 1;
page_flip(FLIP_NOW); /* start with the second page visible */
extern "C" {
#endif
-void *set_video_mode(int xsz, int ysz, int bpp);
+void *set_video_mode(int xsz, int ysz, int bpp, int nbuf);
int set_text_mode(void);
int get_color_depth(void);
int main(int argc, char **argv)
{
- fbsize = fb_width * fb_height * fb_bpp / CHAR_BIT;
+ fbsize = fb_width * fb_height * fb_bpp / 8;
init_logger("demo.log");
set_mouse(fb_width / 2, fb_height / 2);
}
- if(!(fb_pixels = malloc(fbsize))) {
+ /* allocate a couple extra rows as a guard band, until we fucking fix the rasterizer */
+ if(!(fb_pixels = malloc(fbsize + (fb_width * fb_bpp / 8) * 2))) {
fprintf(stderr, "failed to allocate backbuffer\n");
return 1;
}
+ fb_pixels += fb_width;
- if(!(vmem = set_video_mode(fb_width, fb_height, fb_bpp))) {
+ if(!(vmem = set_video_mode(fb_width, fb_height, fb_bpp, 1))) {
return 1;
}