Added double-buffering support for SVGAlib (thanks Kutak!)
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40206
This commit is contained in:
parent
c9c04a2750
commit
9fa42d19f6
3 changed files with 47 additions and 9 deletions
|
@ -16,6 +16,7 @@ be found at the <A HREF="http://www.libsdl.org/"> main SDL page</A>.
|
||||||
Major changes since SDL 1.0.0:
|
Major changes since SDL 1.0.0:
|
||||||
</H2>
|
</H2>
|
||||||
<UL>
|
<UL>
|
||||||
|
<LI> 1.2.3: Added double-buffering support for SVGAlib (thanks Kutak!)
|
||||||
<LI> 1.2.3: Fixed crash when using double-buffering with DGA
|
<LI> 1.2.3: Fixed crash when using double-buffering with DGA
|
||||||
<LI> 1.2.3: Fixed resuming a paused CD on Win2K (thanks Aragorn)
|
<LI> 1.2.3: Fixed resuming a paused CD on Win2K (thanks Aragorn)
|
||||||
<LI> 1.2.3: Improved MacOS international keyboard handling (thanks Max!)
|
<LI> 1.2.3: Improved MacOS international keyboard handling (thanks Max!)
|
||||||
|
|
|
@ -145,7 +145,7 @@ static SDL_VideoDevice *SVGA_CreateDevice(int devindex)
|
||||||
device->SetHWAlpha = NULL;
|
device->SetHWAlpha = NULL;
|
||||||
device->LockHWSurface = SVGA_LockHWSurface;
|
device->LockHWSurface = SVGA_LockHWSurface;
|
||||||
device->UnlockHWSurface = SVGA_UnlockHWSurface;
|
device->UnlockHWSurface = SVGA_UnlockHWSurface;
|
||||||
device->FlipHWSurface = NULL;
|
device->FlipHWSurface = SVGA_FlipHWSurface;
|
||||||
device->FreeHWSurface = SVGA_FreeHWSurface;
|
device->FreeHWSurface = SVGA_FreeHWSurface;
|
||||||
device->SetCaption = NULL;
|
device->SetCaption = NULL;
|
||||||
device->SetIcon = NULL;
|
device->SetIcon = NULL;
|
||||||
|
@ -223,10 +223,7 @@ static void SVGA_UpdateVideoInfo(_THIS)
|
||||||
this->info.wm_available = 0;
|
this->info.wm_available = 0;
|
||||||
this->info.hw_available = 1;
|
this->info.hw_available = 1;
|
||||||
modeinfo = vga_getmodeinfo(vga_getcurrentmode());
|
modeinfo = vga_getmodeinfo(vga_getcurrentmode());
|
||||||
this->info.video_mem = (modeinfo->maxpixels/1024);
|
this->info.video_mem = modeinfo->memory;
|
||||||
if ( modeinfo->bytesperpixel > 0 ) {
|
|
||||||
this->info.video_mem *= modeinfo->bytesperpixel;
|
|
||||||
}
|
|
||||||
/* FIXME: Add hardware accelerated blit information */
|
/* FIXME: Add hardware accelerated blit information */
|
||||||
#if 0
|
#if 0
|
||||||
printf("Hardware accelerated blit: %savailable\n", modeinfo->haveblit ? "" : "not ");
|
printf("Hardware accelerated blit: %savailable\n", modeinfo->haveblit ? "" : "not ");
|
||||||
|
@ -347,6 +344,7 @@ SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
int mode;
|
int mode;
|
||||||
int vgamode;
|
int vgamode;
|
||||||
vga_modeinfo *modeinfo;
|
vga_modeinfo *modeinfo;
|
||||||
|
int screenpage_len;
|
||||||
|
|
||||||
/* Try to set the requested linear video mode */
|
/* Try to set the requested linear video mode */
|
||||||
bpp = (bpp+7)/8-1;
|
bpp = (bpp+7)/8-1;
|
||||||
|
@ -393,6 +391,34 @@ SDL_Surface *SVGA_SetVideoMode(_THIS, SDL_Surface *current,
|
||||||
current->pitch = modeinfo->linewidth;
|
current->pitch = modeinfo->linewidth;
|
||||||
current->pixels = vga_getgraphmem();
|
current->pixels = vga_getgraphmem();
|
||||||
|
|
||||||
|
/* set double-buffering */
|
||||||
|
if ( flags & SDL_DOUBLEBUF )
|
||||||
|
{
|
||||||
|
/* length of one screen page in bytes */
|
||||||
|
screenpage_len=current->h*modeinfo->linewidth;
|
||||||
|
|
||||||
|
/* if start address should be aligned */
|
||||||
|
if ( modeinfo->linewidth_unit )
|
||||||
|
{
|
||||||
|
if ( screenpage_len % modeinfo->linewidth_unit )
|
||||||
|
{
|
||||||
|
screenpage_len += modeinfo->linewidth_unit - ( screenpage_len % modeinfo->linewidth_unit );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we heve enough videomemory = ak je dost videopamete */
|
||||||
|
if ( modeinfo->memory > ( screenpage_len * 2 / 1024 ) )
|
||||||
|
{
|
||||||
|
current->flags |= SDL_DOUBLEBUF;
|
||||||
|
flip_page = 0;
|
||||||
|
flip_offset[0] = 0;
|
||||||
|
flip_offset[1] = screenpage_len;
|
||||||
|
flip_address[0] = vga_getgraphmem();
|
||||||
|
flip_address[1] = flip_address[0]+screenpage_len;
|
||||||
|
SVGA_FlipHWSurface(this,current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the blit function */
|
/* Set the blit function */
|
||||||
this->UpdateRects = SVGA_DirectUpdate;
|
this->UpdateRects = SVGA_DirectUpdate;
|
||||||
|
|
||||||
|
@ -416,9 +442,7 @@ static void SVGA_FreeHWSurface(_THIS, SDL_Surface *surface)
|
||||||
/* We need to wait for vertical retrace on page flipped displays */
|
/* We need to wait for vertical retrace on page flipped displays */
|
||||||
static int SVGA_LockHWSurface(_THIS, SDL_Surface *surface)
|
static int SVGA_LockHWSurface(_THIS, SDL_Surface *surface)
|
||||||
{
|
{
|
||||||
if ( (surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) {
|
/* The waiting is done in SVGA_FlipHWSurface() */
|
||||||
vga_waitretrace();
|
|
||||||
}
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface)
|
static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface)
|
||||||
|
@ -426,9 +450,12 @@ static void SVGA_UnlockHWSurface(_THIS, SDL_Surface *surface)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: How is this done with SVGAlib? */
|
|
||||||
static int SVGA_FlipHWSurface(_THIS, SDL_Surface *surface)
|
static int SVGA_FlipHWSurface(_THIS, SDL_Surface *surface)
|
||||||
{
|
{
|
||||||
|
vga_setdisplaystart(flip_offset[flip_page]);
|
||||||
|
flip_page=!flip_page;
|
||||||
|
surface->pixels=flip_address[flip_page];
|
||||||
|
vga_waitretrace();
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,3 +514,4 @@ void SVGA_VideoQuit(_THIS)
|
||||||
this->screen->pixels = NULL;
|
this->screen->pixels = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,10 +40,19 @@ struct SDL_PrivateVideoData {
|
||||||
int SDL_nummodes[NUM_MODELISTS];
|
int SDL_nummodes[NUM_MODELISTS];
|
||||||
SDL_Rect **SDL_modelist[NUM_MODELISTS];
|
SDL_Rect **SDL_modelist[NUM_MODELISTS];
|
||||||
int *SDL_vgamode[NUM_MODELISTS];
|
int *SDL_vgamode[NUM_MODELISTS];
|
||||||
|
|
||||||
|
/* information for double-buffering */
|
||||||
|
int flip_page;
|
||||||
|
int flip_offset[2];
|
||||||
|
Uint8 *flip_address[2];
|
||||||
};
|
};
|
||||||
/* Old variable names */
|
/* Old variable names */
|
||||||
#define SDL_nummodes (this->hidden->SDL_nummodes)
|
#define SDL_nummodes (this->hidden->SDL_nummodes)
|
||||||
#define SDL_modelist (this->hidden->SDL_modelist)
|
#define SDL_modelist (this->hidden->SDL_modelist)
|
||||||
#define SDL_vgamode (this->hidden->SDL_vgamode)
|
#define SDL_vgamode (this->hidden->SDL_vgamode)
|
||||||
|
#define flip_page (this->hidden->flip_page)
|
||||||
|
#define flip_offset (this->hidden->flip_offset)
|
||||||
|
#define flip_address (this->hidden->flip_address)
|
||||||
|
|
||||||
#endif /* _SDL_svgavideo_h */
|
#endif /* _SDL_svgavideo_h */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue