Some work on using accelerated alpha blits with hardware surfaces.
From Stephane Marchesin's fork, don't know who originally wrote it. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401053
This commit is contained in:
parent
ec77fa9503
commit
8907a054cf
4 changed files with 32 additions and 5 deletions
|
@ -280,6 +280,17 @@ int SDL_CalculateBlit(SDL_Surface *surface)
|
||||||
video->CheckHWBlit(this, surface, surface->map->dst);
|
video->CheckHWBlit(this, surface, surface->map->dst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if an alpha pixel format is specified, we can accelerate alpha blits */
|
||||||
|
if (((surface->flags & SDL_HWSURFACE) == SDL_HWSURFACE )&&(current_video->displayformatalphapixel))
|
||||||
|
{
|
||||||
|
if ( (surface->flags & SDL_SRCALPHA) )
|
||||||
|
if ( current_video->info.blit_hw_A ) {
|
||||||
|
SDL_VideoDevice *video = current_video;
|
||||||
|
SDL_VideoDevice *this = current_video;
|
||||||
|
video->CheckHWBlit(this, surface, surface->map->dst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the blit function index, based on surface mode */
|
/* Get the blit function index, based on surface mode */
|
||||||
/* { 0 = nothing, 1 = colorkey, 2 = alpha, 3 = colorkey+alpha } */
|
/* { 0 = nothing, 1 = colorkey, 2 = alpha, 3 = colorkey+alpha } */
|
||||||
|
|
|
@ -91,11 +91,22 @@ SDL_Surface * SDL_CreateRGBSurface (Uint32 flags,
|
||||||
}
|
}
|
||||||
surface->flags = SDL_SWSURFACE;
|
surface->flags = SDL_SWSURFACE;
|
||||||
if ( (flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
|
if ( (flags & SDL_HWSURFACE) == SDL_HWSURFACE ) {
|
||||||
depth = screen->format->BitsPerPixel;
|
if ((Amask) && (video->displayformatalphapixel))
|
||||||
Rmask = screen->format->Rmask;
|
{
|
||||||
Gmask = screen->format->Gmask;
|
depth = video->displayformatalphapixel->BitsPerPixel;
|
||||||
Bmask = screen->format->Bmask;
|
Rmask = video->displayformatalphapixel->Rmask;
|
||||||
Amask = screen->format->Amask;
|
Gmask = video->displayformatalphapixel->Gmask;
|
||||||
|
Bmask = video->displayformatalphapixel->Bmask;
|
||||||
|
Amask = video->displayformatalphapixel->Amask;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
depth = screen->format->BitsPerPixel;
|
||||||
|
Rmask = screen->format->Rmask;
|
||||||
|
Gmask = screen->format->Gmask;
|
||||||
|
Bmask = screen->format->Bmask;
|
||||||
|
Amask = screen->format->Amask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
surface->format = SDL_AllocFormat(depth, Rmask, Gmask, Bmask, Amask);
|
surface->format = SDL_AllocFormat(depth, Rmask, Gmask, Bmask, Amask);
|
||||||
if ( surface->format == NULL ) {
|
if ( surface->format == NULL ) {
|
||||||
|
|
|
@ -134,6 +134,9 @@ struct SDL_VideoDevice {
|
||||||
/* Information about the video hardware */
|
/* Information about the video hardware */
|
||||||
SDL_VideoInfo info;
|
SDL_VideoInfo info;
|
||||||
|
|
||||||
|
/* The pixel format used when SDL_CreateRGBSurface creates SDL_HWSURFACEs with alpha */
|
||||||
|
SDL_PixelFormat* displayformatalphapixel;
|
||||||
|
|
||||||
/* Allocates a surface in video memory */
|
/* Allocates a surface in video memory */
|
||||||
int (*AllocHWSurface)(_THIS, SDL_Surface *surface);
|
int (*AllocHWSurface)(_THIS, SDL_Surface *surface);
|
||||||
|
|
||||||
|
|
|
@ -212,6 +212,8 @@ int SDL_VideoInit (const char *driver_name, Uint32 flags)
|
||||||
video->offset_x = 0;
|
video->offset_x = 0;
|
||||||
video->offset_y = 0;
|
video->offset_y = 0;
|
||||||
memset(&video->info, 0, (sizeof video->info));
|
memset(&video->info, 0, (sizeof video->info));
|
||||||
|
|
||||||
|
video->displayformatalphapixel = NULL;
|
||||||
|
|
||||||
/* Set some very sane GL defaults */
|
/* Set some very sane GL defaults */
|
||||||
video->gl_config.driver_loaded = 0;
|
video->gl_config.driver_loaded = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue