Skip to content

Commit

Permalink
Added some code to support SDL+OpenGL
Browse files Browse the repository at this point in the history
  • Loading branch information
pelya committed May 13, 2010
1 parent 78f1ef2 commit 21afcf1
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 19 deletions.
2 changes: 0 additions & 2 deletions alienblaster/project/jni/sdl/include/SDL_config_android.h
Expand Up @@ -48,8 +48,6 @@

#define HAVE_STDIO_H 1

#define NO_SDL_GLEXT 1

/* FireSlash found that SDL native memcpy crashes sometimes, these defines fix it (and they are faster) */
#define HAVE_LIBC 1

Expand Down
89 changes: 72 additions & 17 deletions alienblaster/project/jni/sdl/src/video/android/SDL_androidvideo.c
Expand Up @@ -72,6 +72,7 @@ static int ANDROID_LockHWSurface(_THIS, SDL_Surface *surface);
static void ANDROID_UnlockHWSurface(_THIS, SDL_Surface *surface);
static void ANDROID_FreeHWSurface(_THIS, SDL_Surface *surface);
static int ANDROID_FlipHWSurface(_THIS, SDL_Surface *surface);
static void ANDROID_GL_SwapBuffers(_THIS);

/* etc. */
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
Expand All @@ -97,6 +98,7 @@ static int memY = 0;
static void * memBuffer1 = NULL;
static void * memBuffer2 = NULL;
static void * memBuffer = NULL;
static int sdl_opengl = 0;
// We have one Java thread drawing on GL surface, and another native C thread (typically main()) feeding it with video data
extern SDL_Thread * SDL_mainThread;
SDL_Thread * SDL_mainThread = NULL;
Expand Down Expand Up @@ -178,6 +180,7 @@ static SDL_VideoDevice *ANDROID_CreateDevice(int devindex)
device->GetWMInfo = NULL;
device->InitOSKeymap = ANDROID_InitOSKeymap;
device->PumpEvents = ANDROID_PumpEvents;
device->GL_SwapBuffers = ANDROID_GL_SwapBuffers;

device->free = ANDROID_DeleteDevice;

Expand Down Expand Up @@ -230,42 +233,50 @@ SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current,
if ( memBuffer2 )
SDL_free( memBuffer2 );

memBuffer = memBuffer1 = memBuffer2 = NULL;

sdl_opengl = (flags & SDL_OPENGL) ? 1 : 0;

memX = width;
memY = height;

memBuffer1 = SDL_malloc(memX * memY * (bpp / 8));
if ( ! memBuffer1 ) {
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate buffer for requested mode");
SDL_SetError("Couldn't allocate buffer for requested mode");
return(NULL);
}
SDL_memset(memBuffer1, 0, memX * memY * (bpp / 8));

if( flags & SDL_DOUBLEBUF )
if( ! sdl_opengl )
{
memBuffer2 = SDL_malloc(memX * memY * (bpp / 8));
if ( ! memBuffer2 ) {
memBuffer1 = SDL_malloc(memX * memY * (bpp / 8));
if ( ! memBuffer1 ) {
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate buffer for requested mode");
SDL_SetError("Couldn't allocate buffer for requested mode");
return(NULL);
}
SDL_memset(memBuffer2, 0, memX * memY * (bpp / 8));
SDL_memset(memBuffer1, 0, memX * memY * (bpp / 8));

if( flags & SDL_DOUBLEBUF )
{
memBuffer2 = SDL_malloc(memX * memY * (bpp / 8));
if ( ! memBuffer2 ) {
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate buffer for requested mode");
SDL_SetError("Couldn't allocate buffer for requested mode");
return(NULL);
}
SDL_memset(memBuffer2, 0, memX * memY * (bpp / 8));
}
memBuffer = memBuffer1;
}

memBuffer = memBuffer1;
openglInitialized = GL_State_Init;

/* Allocate the new pixel format for the screen */
if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) {
SDL_free(memBuffer);
if(memBuffer)
SDL_free(memBuffer);
memBuffer = NULL;
__android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate new pixel format for requested mode");
SDL_SetError("Couldn't allocate new pixel format for requested mode");
return(NULL);
}

/* Set up the new mode framebuffer */
current->flags = (flags & SDL_FULLSCREEN) | (flags & SDL_DOUBLEBUF);
current->flags = (flags & SDL_FULLSCREEN) | (flags & SDL_DOUBLEBUF) | (flags & SDL_OPENGL);
current->w = width;
current->h = height;
current->pitch = memX * (bpp / 8);
Expand Down Expand Up @@ -376,7 +387,7 @@ static int ANDROID_FlipHWSurface(_THIS, SDL_Surface *surface)
SDL_CondSignal(WaitForNativeRender1);
SDL_mutexP(WaitForNativeRender);

if( surface->flags & SDL_DOUBLEBUF )
if( ! sdl_opengl && surface && surface->flags & SDL_DOUBLEBUF )
{
if( WaitForNativeRenderState == Render_State_Started )
if( SDL_CondWaitTimeout( WaitForNativeRender1, WaitForNativeRender, 5000 ) != 0 )
Expand Down Expand Up @@ -414,6 +425,11 @@ static int ANDROID_FlipHWSurface(_THIS, SDL_Surface *surface)
return(0);
};

void ANDROID_GL_SwapBuffers(_THIS)
{
ANDROID_FlipHWSurface(this, NULL);
};

int ANDROID_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
{
return(1);
Expand Down Expand Up @@ -593,7 +609,7 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeRender) ( JNIEnv* env, jobject thiz, jfloa
int textX, textY;
void * memBufferTemp;

if( memBuffer && openglInitialized != GL_State_Uninit2 )
if( !sdl_opengl && memBuffer && openglInitialized != GL_State_Uninit2 )
{
if( openglInitialized == GL_State_Init )
{
Expand Down Expand Up @@ -734,6 +750,45 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeRender) ( JNIEnv* env, jobject thiz, jfloa
//glFinish(); //glFlush();

}
else if( sdl_opengl && openglInitialized != GL_State_Uninit2 )
{
if( openglInitialized == GL_State_Init )
{
openglInitialized = GL_State_Ready;
}
else if( openglInitialized == GL_State_Uninit )
{
openglInitialized = GL_State_Uninit2;
return;
}

if( WaitForNativeRender )
{
SDL_mutexP(WaitForNativeRender);

WaitForNativeRenderState = Render_State_Finished;

SDL_mutexV(WaitForNativeRender);
SDL_CondSignal(WaitForNativeRender1);
SDL_mutexP(WaitForNativeRender);

while( WaitForNativeRenderState != Render_State_Started )
{
if( SDL_CondWaitTimeout( WaitForNativeRender1, WaitForNativeRender, 5000 ) != 0 )
{
__android_log_print(ANDROID_LOG_INFO, "libSDL", "nativeRender: Frame failed to render");
SDL_mutexV(WaitForNativeRender);
return;
}
}

WaitForNativeRenderState = Render_State_Processing;

SDL_mutexV(WaitForNativeRender);

SDL_CondSignal(WaitForNativeRender1);
}
}
else
{
/*
Expand Down

0 comments on commit 21afcf1

Please sign in to comment.