From 861c0fe63b4fc311551ecc0fd75f972f2ca2803d Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Thu, 23 Jul 2015 08:09:30 -0700 Subject: [PATCH] Fallback to software if hardware is not available --- lime/_backend/native/NativeRenderer.hx | 28 +++++++++++++-------- project/include/graphics/Renderer.h | 1 + project/src/ExternalInterface.cpp | 9 +++++++ project/src/backend/sdl/SDLRenderer.cpp | 33 +++++++++++++++++++++++++ project/src/backend/sdl/SDLRenderer.h | 1 + 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/lime/_backend/native/NativeRenderer.hx b/lime/_backend/native/NativeRenderer.hx index 1447db885..6e17307be 100644 --- a/lime/_backend/native/NativeRenderer.hx +++ b/lime/_backend/native/NativeRenderer.hx @@ -40,23 +40,30 @@ class NativeRenderer { handle = lime_renderer_create (parent.window.backend.handle); - useHardware = parent.window.config.hardware; - #if lime_console + + useHardware = true; parent.context = CONSOLE (new ConsoleRenderContext ()); + #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 { - - #if lime_cairo - render (); - parent.context = CAIRO (cairo); - #end + default: + + #if lime_cairo + render (); + parent.context = CAIRO (cairo); + #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_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_unlock = System.load ("lime", "lime_renderer_unlock", 1); diff --git a/project/include/graphics/Renderer.h b/project/include/graphics/Renderer.h index 2b9186067..5f1bb69ac 100644 --- a/project/include/graphics/Renderer.h +++ b/project/include/graphics/Renderer.h @@ -16,6 +16,7 @@ namespace lime { virtual void Flip () = 0; virtual value Lock () = 0; + virtual const char* Type () = 0; virtual void Unlock () = 0; Window* currentWindow; diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index 007a7f5b5..64dbb50a9 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -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) { return ((Renderer*)(intptr_t)val_float (renderer))->Lock (); @@ -1199,6 +1207,7 @@ namespace lime { DEFINE_PRIM (lime_png_decode_file, 2); DEFINE_PRIM (lime_renderer_create, 1); DEFINE_PRIM (lime_renderer_flip, 1); + DEFINE_PRIM (lime_renderer_get_type, 1); DEFINE_PRIM (lime_renderer_lock, 1); DEFINE_PRIM (lime_renderer_unlock, 1); DEFINE_PRIM (lime_render_event_manager_register, 2); diff --git a/project/src/backend/sdl/SDLRenderer.cpp b/project/src/backend/sdl/SDLRenderer.cpp index 659f13f87..b70085b5a 100644 --- a/project/src/backend/sdl/SDLRenderer.cpp +++ b/project/src/backend/sdl/SDLRenderer.cpp @@ -31,6 +31,15 @@ namespace lime { 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) { 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 () { if (sdlTexture) { diff --git a/project/src/backend/sdl/SDLRenderer.h b/project/src/backend/sdl/SDLRenderer.h index cc45e818d..f2c1d6c02 100644 --- a/project/src/backend/sdl/SDLRenderer.h +++ b/project/src/backend/sdl/SDLRenderer.h @@ -18,6 +18,7 @@ namespace lime { virtual void Flip (); virtual value Lock (); + virtual const char* Type (); virtual void Unlock (); SDL_Renderer* sdlRenderer;