156 lines
4.7 KiB
C
156 lines
4.7 KiB
C
/*******************************************************************************
|
|
Headers
|
|
*******************************************************************************/
|
|
#include <jni.h>
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
#include <android/log.h>
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
#include "importgl.h"
|
|
#include "egl.h"
|
|
|
|
/*******************************************************************************
|
|
Globals
|
|
*******************************************************************************/
|
|
int gAppAlive = 1;
|
|
|
|
static int sWindowWidth = 320;
|
|
static int sWindowHeight = 480;
|
|
static int sDemoStopped = 0;
|
|
|
|
static long _getTime(void){
|
|
struct timeval now;
|
|
gettimeofday(&now, NULL);
|
|
return (long)(now.tv_sec*1000 + now.tv_usec/1000);
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
Things used by libsdl
|
|
*******************************************************************************/
|
|
pthread_mutex_t mSDLRenderMutex;
|
|
pthread_cond_t mSDLRenderCondition;
|
|
|
|
EGLContext mContext;
|
|
EGLDisplay mDisplay;
|
|
EGLSurface mRead;
|
|
EGLSurface mDraw;
|
|
|
|
/*******************************************************************************
|
|
SDL thread
|
|
*******************************************************************************/
|
|
pthread_t mSDLThread = 0;
|
|
|
|
void* sdlThreadProc(void* args){
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Thread Entry");
|
|
|
|
if(!eglMakeCurrent(mDisplay, mDraw, mRead, mContext)){
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't make current: 0x%x", eglGetError());
|
|
return NULL;
|
|
}
|
|
|
|
return (void *)SDL_main();
|
|
}
|
|
|
|
/*******************************************************************************
|
|
Initialize the graphics state
|
|
*******************************************************************************/
|
|
void Java_org_libsdl_android_TestRenderer_nativeInit( JNIEnv* env )
|
|
{
|
|
importGLInit();
|
|
|
|
gAppAlive = 1;
|
|
sDemoStopped = 0;
|
|
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Entry point");
|
|
|
|
pthread_mutex_init(&mSDLRenderMutex, NULL);
|
|
pthread_cond_init (&mSDLRenderCondition, NULL);
|
|
|
|
//Get some egl stuff we need
|
|
mContext = eglGetCurrentContext();
|
|
mDisplay = eglGetCurrentDisplay();
|
|
mRead = eglGetCurrentSurface(EGL_READ);
|
|
mDraw = eglGetCurrentSurface(EGL_DRAW);
|
|
|
|
//We need to abandon our context so SDL can have it
|
|
if(!eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)){
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't abandon context: 0x%x", eglGetError());
|
|
return NULL;
|
|
}
|
|
|
|
//Spin up the SDL thread
|
|
int r = pthread_create(&mSDLThread, NULL, sdlThreadProc, NULL);
|
|
|
|
if(r != 0){
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't spawn thread: %d", r);
|
|
}else{
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Started SDL thread");
|
|
}
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
Resize
|
|
*******************************************************************************/
|
|
void Java_org_libsdl_android_TestRenderer_nativeResize( JNIEnv* env,
|
|
jobject thiz,
|
|
jint w,
|
|
jint h )
|
|
{
|
|
sWindowWidth = w;
|
|
sWindowHeight = h;
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "resize w=%d h=%d", w, h);
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
Finalize (ie: shutdown)
|
|
*******************************************************************************/
|
|
void Java_org_libsdl_android_TestRenderer_nativeDone( JNIEnv* env )
|
|
{
|
|
|
|
//shut down the app
|
|
|
|
importGLDeinit();
|
|
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Finalize");
|
|
}
|
|
|
|
/*******************************************************************************
|
|
Pause (ie: stop as soon as possible)
|
|
*******************************************************************************/
|
|
void Java_org_libsdl_android_TestGLSurfaceView_nativePause( JNIEnv* env )
|
|
{
|
|
sDemoStopped = !sDemoStopped;
|
|
if (sDemoStopped) {
|
|
//we paused
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Pause");
|
|
} else {
|
|
//we resumed
|
|
__android_log_print(ANDROID_LOG_INFO, "SDL", "Resume");
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
Render the next frame
|
|
*******************************************************************************/
|
|
|
|
void Java_org_libsdl_android_TestRenderer_nativeRender( JNIEnv* env )
|
|
{
|
|
//TODO: Render here
|
|
|
|
pthread_mutex_lock(&mSDLRenderMutex);
|
|
pthread_cond_signal(&mSDLRenderCondition); //wake up the SDL thread
|
|
pthread_mutex_unlock(&mSDLRenderMutex);
|
|
|
|
//__android_log_print(ANDROID_LOG_INFO, "SDL", "Unlocked");
|
|
|
|
}
|