infcubes crashes
authorJohn Tsiombikas <nuclear@member.fsf.org>
Fri, 13 Dec 2019 08:47:11 +0000 (10:47 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Fri, 13 Dec 2019 08:47:11 +0000 (10:47 +0200)
src/dos/gfx.c
src/dos/gfx.h
src/dos/main.c

index 570eaba..8818ab9 100644 (file)
@@ -22,6 +22,7 @@ static struct vbe_mode_info mode_info;
 
 static void *vpgaddr[2];
 static int fbidx;
+static int pgcount;
 
 static int init_vbe(void)
 {
@@ -50,7 +51,7 @@ 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;
@@ -70,7 +71,7 @@ void *set_video_mode(int xsz, int ysz, int bpp)
        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;
@@ -95,17 +96,22 @@ void *set_video_mode(int xsz, int ysz, int bpp)
        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 */
index 029066f..f23e0f6 100644 (file)
@@ -5,7 +5,7 @@
 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);
index 6d83027..aed12e9 100644 (file)
@@ -31,7 +31,7 @@ static quat_t rot = {0, 0, 0, 1};
 
 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");
 
@@ -46,12 +46,14 @@ int main(int argc, char **argv)
                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;
        }