SDL video: added checks for current thread ID to match main thread ID in all Android video funcs (except for SDL 1.3)

This commit is contained in:
pelya
2010-11-22 15:04:36 +02:00
parent d0437da12e
commit ffbbbb6cad

View File

@@ -114,6 +114,7 @@ int SDL_ANDROID_sFakeWindowHeight = 480;
static int sdl_opengl = 0;
static SDL_Window *SDL_VideoWindow = NULL;
static SDL_Surface *SDL_CurrentVideoSurface = NULL;
static Uint32 SDL_VideoThreadID = 0;
static int HwSurfaceCount = 0;
static SDL_Surface ** HwSurfaceList = NULL;
@@ -218,6 +219,7 @@ int ANDROID_VideoInit(_THIS, SDL_PixelFormat *vformat)
this->info.video_mem = 128 * 1024; // Random value
this->info.current_w = SDL_ANDROID_sWindowWidth;
this->info.current_h = SDL_ANDROID_sWindowHeight;
SDL_VideoThreadID = SDL_ThreadID();
for ( i=0; i<SDL_NUMMODES; ++i ) {
SDL_modelist[i] = SDL_malloc(sizeof(SDL_Rect));
@@ -258,6 +260,11 @@ SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current,
int bpp1;
__android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_SetVideoMode(): application requested mode %dx%d", width, height);
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return NULL;
}
sdl_opengl = (flags & SDL_OPENGL) ? 1 : 0;
@@ -348,6 +355,11 @@ SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current,
*/
void ANDROID_VideoQuit(_THIS)
{
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
}
if( ! sdl_opengl )
{
DEBUGOUT("ANDROID_VideoQuit() in HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList);
@@ -387,6 +399,12 @@ void ANDROID_PumpEvents(_THIS)
static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface)
{
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return -1;
}
if ( ! (surface->w && surface->h) )
return(-1);
@@ -459,12 +477,18 @@ static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface)
static void ANDROID_FreeHWSurface(_THIS, SDL_Surface *surface)
{
int i;
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return;
}
if( !surface->hwdata )
return;
SDL_DestroyTexture((struct SDL_Texture *)surface->hwdata);
DEBUGOUT("ANDROID_FreeHWSurface() surface %p w %d h %d in HwSurfaceCount %d HwSurfaceList %p", surface, surface->w, surface->h, HwSurfaceCount, HwSurfaceList);
for( i = 0; i < HwSurfaceCount; i++ )
{
@@ -486,6 +510,12 @@ static void ANDROID_FreeHWSurface(_THIS, SDL_Surface *surface)
static int ANDROID_LockHWSurface(_THIS, SDL_Surface *surface)
{
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return -1;
}
if( surface == SDL_CurrentVideoSurface )
{
// Copy pixels from pixelbuffer to video surface - this is slow!
@@ -562,6 +592,12 @@ static void ANDROID_UnlockHWSurface(_THIS, SDL_Surface *surface)
int bpp;
SDL_Surface * converted = NULL;
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return;
}
if( !surface->hwdata )
return;
@@ -653,6 +689,12 @@ static void ANDROID_UnlockHWSurface(_THIS, SDL_Surface *surface)
// We're only blitting HW surface to screen, no other options provided (and if you need them your app designed wrong)
int ANDROID_HWBlit(SDL_Surface* src, SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect)
{
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return -1;
}
if( dst != SDL_CurrentVideoSurface || (! src->hwdata) )
{
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_HWBlit(): blitting SW");
@@ -683,6 +725,13 @@ static int ANDROID_CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst)
static int ANDROID_FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color)
{
Uint8 r, g, b, a;
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return -1;
}
if( dst != SDL_CurrentVideoSurface )
{
// TODO: hack
@@ -700,6 +749,12 @@ static int ANDROID_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key)
{
SDL_PixelFormat format;
SDL_Surface * converted = NULL;
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return -1;
}
if( !surface->hwdata )
return(-1);
@@ -717,6 +772,12 @@ static int ANDROID_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key)
static int ANDROID_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value)
{
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return -1;
}
if( !surface->hwdata )
return(-1);
@@ -732,8 +793,17 @@ static int ANDROID_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value)
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
{
if(!SDL_CurrentVideoSurface)
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return;
}
if(!SDL_CurrentVideoSurface)
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s without main video surface!", __PRETTY_FUNCTION__);
return;
}
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_UpdateRects()");
// Used only in single-buffer mode
//if( SDL_CurrentVideoSurface && !(SDL_CurrentVideoSurface->flags & SDL_HWSURFACE) )
@@ -742,8 +812,17 @@ static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
static int ANDROID_FlipHWSurface(_THIS, SDL_Surface *surface)
{
if(!SDL_CurrentVideoSurface)
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return;
}
if(!SDL_CurrentVideoSurface)
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s without main video surface!", __PRETTY_FUNCTION__);
return;
}
//__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_FlipHWSurface()");
if( SDL_CurrentVideoSurface->hwdata && SDL_CurrentVideoSurface->pixels && ! ( SDL_CurrentVideoSurface->flags & SDL_HWSURFACE ) )
{
@@ -767,6 +846,12 @@ static int ANDROID_FlipHWSurface(_THIS, SDL_Surface *surface)
void ANDROID_GL_SwapBuffers(_THIS)
{
if( SDL_VideoThreadID != SDL_ThreadID() )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__);
return;
}
SDL_ANDROID_CallJavaSwapBuffers();
};