gl_copyscreen() on 256 color linear mode does memcpy even if pageflipping enabled

Search this archive.

From: Maneesh Sahani (maneesh@gatsby.ucl.ac.uk)
Date: Mon 14 Feb 2000 - 17:32:38 IST


I have just begun to use svgalib, so I apologise in advance if this
proves to be a newbie misunderstanding.  It appears that gl_copyscreen()
is actually doing a memcpy(), even though I have pageflipping enabled.

I'm using an s3 card and svgalib-1.4.1.  On startup svgalib reports:
svgalib: Using S3 driver (Trio64, 4096K) svgalib: s3: chipsets newer
than S3-864 is not supported well yet.  svgalib: RAMDAC: Trio64: MCLK
= 40.091 MHz

Here's my test code (mostly lifted from the tutorial):

int main(void)
{
   int flipmode;
   struct timeval tic, toc;
   int gmode = G640x480x256;
   
   vga_init();

   if (!vga_hasmode(gmode)) {
     printf ("requested mode is not supported\n");
     return 1;
   }
     
   vga_setmode(gmode);
   gl_setcontextvga(gmode);
   physicalscreen = gl_allocatecontext();
   gl_getcontext(physicalscreen);

   gl_setcontextvgavirtual(gmode);
   virtualscreen = gl_allocatecontext();
   gl_getcontext(virtualscreen);

   flipmode = gl_enablepageflipping (physicalscreen);

   printf ("%d cols, %d bpp (%s): %d buffers\n", 
	      physicalscreen->colors,
	      physicalscreen->bytesperpixel,
	      gl_modetypes[physicalscreen->modetype],
	      flipmode);

   gl_setcontext(virtualscreen);
   draw(); /* draw into current context */

   gettimeofday(&tic, NULL);
   gl_copyscreen(physicalscreen);
   gettimeofday(&toc, NULL);

   getchar();
   gl_clearscreen(0);
   vga_setmode(0);

   printf("gl_copyscreen took %gms\n", 
	  (toc.tv_sec-tic.tv_sec)*1000 + (toc.tv_usec-tic.tv_usec)/1000.); 

   return 0;
}

The first printf confirms that I have 256 colours, 8bpp, the mode is
CONTEXT_PAGED (gl_modetypes is a static char *[]) and triplebuffering
is enabled.

The time elapsed in the gl_copyscreen() is about 6.5ms.  This time is
exactly the same if I remove the gl_enablepageflipping() call.

It appears that gl_copyscreen is written so that a memcpy occurs in
some cases even if gl_enablepageflipping() has succeeded.  In
particular the block (grlib.c:854-866):

	int soffset = 0;
	int doffset = screenoffset;
	size = SCREENSIZE(__currentcontext);
	while (soffset < size) {
	    int schunk, dchunk;
	    int count;
	    schunk = __svgalib_driver_setread(&__currentcontext, soffset,&svp);
	    dchunk = __svgalib_driver_setwrite(gc, doffset, &dvp);
	    count = min(min(schunk, dchunk), (size - soffset));
	    __memcpy(dvp, svp, count);
	    soffset += count;
	    doffset += count;
	}

is executed unless one of the following conditions is true:

(gc->modetype == CONTEXT_MODEX)
(gc->modetype == CONTEXT_PLANAR16)
(BYTESPERPIXEL == 4 && gc->bytesperpixel == 3)
(BYTESPERPIXEL == 4 && gc->bytesperpixel == 4 &&
	(gc->modeflags & MODEFLAG_32BPP_SHIFT8))

In particular, an inserted printf confirms that it is being run for my
code.  Is this really the correct behaviour?

m.
-- 
Maneesh Sahani

Gatsby Computational Neuroscience Unit  maneesh at gatsby.ucl.ac.uk
17 Queen Square,			tel:    +44 (0)20 7679 1187
London WC1N 3AR U.K. 			fax:    +44 (0)20 7679 1173


This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST