# HG changeset patch # User Sam Lantinga # Date 1297129447 28800 # Node ID c66b2a778b7efe9f31f848d328c2ecc1f5eb5c14 # Parent 2ee8112bfc6bb18efc51a866fbd29c25a9edc66f Try to create an OpenGL ES 2.0 context on Android and successfully fall back to OpenGL ES 1.1 if that fails. diff -r 2ee8112bfc6b -r c66b2a778b7e android-project/src/org/libsdl/app/SDLActivity.java --- a/android-project/src/org/libsdl/app/SDLActivity.java Mon Feb 07 16:45:40 2011 -0800 +++ b/android-project/src/org/libsdl/app/SDLActivity.java Mon Feb 07 17:44:07 2011 -0800 @@ -101,8 +101,8 @@ // Java functions called from C - public static void createGLContext() { - mSurface.initEGL(); + public static boolean createGLContext(int majorVersion, int minorVersion) { + return mSurface.initEGL(majorVersion, minorVersion); } public static void flipBuffers() { @@ -351,11 +351,10 @@ // EGL functions - public boolean initEGL() { - Log.v("SDL", "Starting up"); + public boolean initEGL(int majorVersion, int minorVersion) { + Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion); try { - EGL10 egl = (EGL10)EGLContext.getEGL(); EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); @@ -363,20 +362,43 @@ int[] version = new int[2]; egl.eglInitialize(dpy, version); + int EGL_OPENGL_ES_BIT = 1; + int EGL_OPENGL_ES2_BIT = 4; + int renderableType = 0; + if (majorVersion == 2) { + renderableType = EGL_OPENGL_ES2_BIT; + } else if (majorVersion == 1) { + renderableType = EGL_OPENGL_ES_BIT; + } int[] configSpec = { - //EGL10.EGL_DEPTH_SIZE, 16, - EGL10.EGL_NONE + //EGL10.EGL_DEPTH_SIZE, 16, + EGL10.EGL_RENDERABLE_TYPE, renderableType, + EGL10.EGL_NONE }; EGLConfig[] configs = new EGLConfig[1]; int[] num_config = new int[1]; - egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config); + if (!egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config) || num_config[0] == 0) { + Log.e("SDL", "No EGL config available"); + return false; + } EGLConfig config = configs[0]; EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null); + if (ctx == EGL10.EGL_NO_CONTEXT) { + Log.e("SDL", "Couldn't create context"); + return false; + } EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, this, null); + if (surface == EGL10.EGL_NO_SURFACE) { + Log.e("SDL", "Couldn't create surface"); + return false; + } - egl.eglMakeCurrent(dpy, surface, surface, ctx); + if (!egl.eglMakeCurrent(dpy, surface, surface, ctx)) { + Log.e("SDL", "Couldn't make context current"); + return false; + } mEGLContext = ctx; mEGLDisplay = dpy; diff -r 2ee8112bfc6b -r c66b2a778b7e src/core/android/SDL_android.cpp --- a/src/core/android/SDL_android.cpp Mon Feb 07 16:45:40 2011 -0800 +++ b/src/core/android/SDL_android.cpp Mon Feb 07 17:44:07 2011 -0800 @@ -20,6 +20,7 @@ slouken@libsdl.org */ #include "SDL_config.h" +#include "SDL_stdinc.h" #include "SDL_android.h" @@ -80,7 +81,7 @@ mActivityClass = cls; midCreateGLContext = mEnv->GetStaticMethodID(mActivityClass, - "createGLContext","()V"); + "createGLContext","(II)Z"); midFlipBuffers = mEnv->GetStaticMethodID(mActivityClass, "flipBuffers","()V"); midAudioInit = mEnv->GetStaticMethodID(mActivityClass, @@ -159,9 +160,13 @@ /******************************************************************************* Functions called by SDL into Java *******************************************************************************/ -extern "C" void Android_JNI_CreateContext() +extern "C" SDL_bool Android_JNI_CreateContext(int majorVersion, int minorVersion) { - mEnv->CallStaticVoidMethod(mActivityClass, midCreateGLContext); + if (mEnv->CallStaticBooleanMethod(mActivityClass, midCreateGLContext, majorVersion, minorVersion)) { + return SDL_TRUE; + } else { + return SDL_FALSE; + } } extern "C" void Android_JNI_SwapWindow() diff -r 2ee8112bfc6b -r c66b2a778b7e src/core/android/SDL_android.h --- a/src/core/android/SDL_android.h Mon Feb 07 16:45:40 2011 -0800 +++ b/src/core/android/SDL_android.h Mon Feb 07 17:44:07 2011 -0800 @@ -29,7 +29,7 @@ #endif /* Interface from the SDL library into the Android Java activity */ -extern void Android_JNI_CreateContext(); +extern SDL_bool Android_JNI_CreateContext(int majorVersion, int minorVersion); extern void Android_JNI_SwapWindow(); extern void Android_JNI_SetActivityTitle(const char *title); extern void Android_JNI_GetAccelerometerValues(float values[3]); diff -r 2ee8112bfc6b -r c66b2a778b7e src/render/opengles2/SDL_render_gles2.c --- a/src/render/opengles2/SDL_render_gles2.c Mon Feb 07 16:45:40 2011 -0800 +++ b/src/render/opengles2/SDL_render_gles2.c Mon Feb 07 17:44:07 2011 -0800 @@ -1071,11 +1071,19 @@ { SDL_Renderer *renderer; GLES2_DriverContext *rdata; + Uint32 window_flags; GLint nFormats; #ifndef ZUNE_HD GLboolean hasCompiler; #endif + window_flags = SDL_GetWindowFlags(window); + if (!(window_flags & SDL_WINDOW_OPENGL)) { + if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) { + return NULL; + } + } + /* Create the renderer struct */ renderer = (SDL_Renderer *)SDL_calloc(1, sizeof(SDL_Renderer)); if (!renderer) { diff -r 2ee8112bfc6b -r c66b2a778b7e src/video/android/SDL_androidgl.c --- a/src/video/android/SDL_androidgl.c Mon Feb 07 16:45:40 2011 -0800 +++ b/src/video/android/SDL_androidgl.c Mon Feb 07 17:44:07 2011 -0800 @@ -55,7 +55,11 @@ SDL_GLContext Android_GL_CreateContext(_THIS, SDL_Window * window) { - Android_JNI_CreateContext(); + if (!Android_JNI_CreateContext(_this->gl_config.major_version, + _this->gl_config.minor_version)) { + SDL_SetError("Couldn't create OpenGL context - see Android log for details"); + return NULL; + } return (SDL_GLContext)1; } @@ -91,3 +95,5 @@ { __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_DeleteContext\n"); } + +/* vi: set ts=4 sw=4 expandtab: */ diff -r 2ee8112bfc6b -r c66b2a778b7e src/video/android/SDL_androidwindow.c --- a/src/video/android/SDL_androidwindow.c Mon Feb 07 16:45:40 2011 -0800 +++ b/src/video/android/SDL_androidwindow.c Mon Feb 07 17:44:07 2011 -0800 @@ -41,6 +41,12 @@ window->w = Android_ScreenWidth; window->h = Android_ScreenHeight; + window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */ + window->flags |= SDL_WINDOW_OPENGL; /* window is always OpenGL */ + window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */ + window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */ + window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */ + return 0; }