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);
|
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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user