Fallback to software if hardware is not available
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace lime {
|
||||
|
||||
virtual void Flip ();
|
||||
virtual value Lock ();
|
||||
virtual const char* Type ();
|
||||
virtual void Unlock ();
|
||||
|
||||
SDL_Renderer* sdlRenderer;
|
||||
|
||||
Reference in New Issue
Block a user