Fallback to software if hardware is not available

This commit is contained in:
Joshua Granick
2015-07-23 08:09:30 -07:00
parent abc83da97b
commit 861c0fe63b
5 changed files with 62 additions and 10 deletions

View File

@@ -40,23 +40,30 @@ class NativeRenderer {
handle = lime_renderer_create (parent.window.backend.handle); handle = lime_renderer_create (parent.window.backend.handle);
useHardware = parent.window.config.hardware;
#if lime_console #if lime_console
useHardware = true;
parent.context = CONSOLE (new ConsoleRenderContext ()); parent.context = CONSOLE (new ConsoleRenderContext ());
#else #else
if (useHardware) {
var type = lime_renderer_get_type (handle);
switch (type) {
parent.context = OPENGL (new GLRenderContext ()); case "opengl":
parent.context = OPENGL (new GLRenderContext ());
} else { default:
#if lime_cairo #if lime_cairo
render (); render ();
parent.context = CAIRO (cairo); parent.context = CAIRO (cairo);
#end #end
} }
#end #end
} }
@@ -137,6 +144,7 @@ class NativeRenderer {
private static var lime_renderer_create = System.load ("lime", "lime_renderer_create", 1); private static var lime_renderer_create = System.load ("lime", "lime_renderer_create", 1);
private static var lime_renderer_flip = System.load ("lime", "lime_renderer_flip", 1); private static var lime_renderer_flip = System.load ("lime", "lime_renderer_flip", 1);
private static var lime_renderer_get_type = System.load ("lime", "lime_renderer_get_type", 1);
private static var lime_renderer_lock = System.load ("lime", "lime_renderer_lock", 1); private static var lime_renderer_lock = System.load ("lime", "lime_renderer_lock", 1);
private static var lime_renderer_unlock = System.load ("lime", "lime_renderer_unlock", 1); private static var lime_renderer_unlock = System.load ("lime", "lime_renderer_unlock", 1);

View File

@@ -16,6 +16,7 @@ namespace lime {
virtual void Flip () = 0; virtual void Flip () = 0;
virtual value Lock () = 0; virtual value Lock () = 0;
virtual const char* Type () = 0;
virtual void Unlock () = 0; virtual void Unlock () = 0;
Window* currentWindow; Window* currentWindow;

View File

@@ -868,6 +868,14 @@ namespace lime {
} }
value lime_renderer_get_type (value renderer) {
Renderer* targetRenderer = (Renderer*)(intptr_t)val_float (renderer);
return alloc_string (targetRenderer->Type ());
}
value lime_renderer_lock (value renderer) { value lime_renderer_lock (value renderer) {
return ((Renderer*)(intptr_t)val_float (renderer))->Lock (); return ((Renderer*)(intptr_t)val_float (renderer))->Lock ();
@@ -1199,6 +1207,7 @@ namespace lime {
DEFINE_PRIM (lime_png_decode_file, 2); DEFINE_PRIM (lime_png_decode_file, 2);
DEFINE_PRIM (lime_renderer_create, 1); DEFINE_PRIM (lime_renderer_create, 1);
DEFINE_PRIM (lime_renderer_flip, 1); DEFINE_PRIM (lime_renderer_flip, 1);
DEFINE_PRIM (lime_renderer_get_type, 1);
DEFINE_PRIM (lime_renderer_lock, 1); DEFINE_PRIM (lime_renderer_lock, 1);
DEFINE_PRIM (lime_renderer_unlock, 1); DEFINE_PRIM (lime_renderer_unlock, 1);
DEFINE_PRIM (lime_render_event_manager_register, 2); DEFINE_PRIM (lime_render_event_manager_register, 2);

View File

@@ -31,6 +31,15 @@ namespace lime {
sdlRenderer = SDL_CreateRenderer (sdlWindow, -1, sdlFlags); sdlRenderer = SDL_CreateRenderer (sdlWindow, -1, sdlFlags);
if (!sdlRenderer && (sdlFlags & SDL_RENDERER_ACCELERATED)) {
sdlFlags &= ~SDL_RENDERER_ACCELERATED;
sdlFlags |= SDL_RENDERER_SOFTWARE;
sdlRenderer = SDL_CreateRenderer (sdlWindow, -1, sdlFlags);
}
if (!sdlRenderer) { if (!sdlRenderer) {
printf ("Could not create SDL renderer: %s.\n", SDL_GetError ()); printf ("Could not create SDL renderer: %s.\n", SDL_GetError ());
@@ -95,6 +104,30 @@ namespace lime {
} }
const char* SDLRenderer::Type () {
if (sdlRenderer) {
SDL_RendererInfo info;
SDL_GetRendererInfo (sdlRenderer, &info);
if (info.flags & SDL_RENDERER_SOFTWARE) {
return "software";
} else {
return "opengl";
}
}
return "none";
}
void SDLRenderer::Unlock () { void SDLRenderer::Unlock () {
if (sdlTexture) { if (sdlTexture) {

View File

@@ -18,6 +18,7 @@ namespace lime {
virtual void Flip (); virtual void Flip ();
virtual value Lock (); virtual value Lock ();
virtual const char* Type ();
virtual void Unlock (); virtual void Unlock ();
SDL_Renderer* sdlRenderer; SDL_Renderer* sdlRenderer;