Mail Archives: djgpp/1995/02/02/17:28:15
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 <stdlib.h>
#include <dos.h>
#include <pc.h>
#include <grx.h>
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 <stdlib.h>
#include <dos.h>
#include <pc.h>
#include <math.h>
#include <grx.h>
#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();
}
- Raw text -