Date: Thu, 2 Feb 1995 15:07:43 -0500 (EST) From: David Max To: djgpp AT sun DOT soe DOT clarkson DOT edu Subject: Re: LIBGRX for djgpp On Thu, 2 Feb 1995, G.Mackrill wrote: > Can you help?? I have been attempting to use to screen buffers and swap > between them so as to remove the flicker when displaying 3d animations. > Unfortunately i have not been able to succeed. Can anyone tell me how this > can be achieved using LIBGRX.. > Below is code that I have used to do page flipping in various ways. David Max New York University WWW: http://found.cs.nyu.edu/robust.a/student/max/public-html/index.html /*************************************************************************** PAGEFLIP.C This version uses VGA calls to flip pages. ***************************************************************************/ #include #include #include #include GrContext *page0, *page1; unsigned char screenpage; #define DISPIO 0x3DA #define VRT_bit 8 #define CRTC_INDEX 0x3d4 #define START_ADDRESS_HIGH 0x0c void pageflip(void) { screenpage ^= 1; if (screenpage) GrSetContext(page0); else GrSetContext(page1); outportw(CRTC_INDEX, (screenpage << 15) | START_ADDRESS_HIGH); /* Wait for Vertical Retrace before continuing */ while (inportb(DISPIO) & VRT_bit); while ((inportb(DISPIO) & VRT_bit) == 0); } void opengraphics(void) { GrSetMode(GR_width_height_color_graphics,320,240,256); page0 = GrSaveContext(page0); page1 = GrSaveContext(page1); page1->gc_baseaddr += 0x8000; screenpage = 0; pageflip(); } /*************************************************************************** PAGEFLIP.C This version uses VESA calls to set up double-buffered 1024x768x16 graphics. On my machine, this is using univbe with my Diamond Speedstar 24X and the go32 default VESA graphics. ***************************************************************************/ #include #include #include #include #include #include "pageflip.h" /* contains function prototypes */ /* Global variables */ GrContext *page[2]; unsigned int screenpage; union REGS reg, reg2; void pageflip(void) { GrSetContext(page[screenpage]); screenpage ^= 1; reg.x.dx=768*screenpage; int86(0x10,®,®2); /* Apparently, at least on my card, this VESA call includes a wait-for-retrace, so explicitly waiting for vertical retrace here would be redundant. */ } void opengraphics(void) { /* set up regs for the VESA call that specifies the starting scan line. */ reg.x.ax=0x4F07; reg.h.bh=0; reg.h.bl=0; reg.x.cx=0; GrSetMode(GR_width_height_color_graphics,1024,768,16); page[0] = GrSaveContext(page[0]); page[1] = GrSaveContext(page[1]); page[1]->gc_baseaddr += 0x18000; screenpage = 0; pageflip(); }