Add fallback support for graphics backend.

Will choose either GL/Vulkan depending on what the frontend allows.
This commit is contained in:
Tiny Tiger 2016-12-03 11:48:21 +01:00 committed by twinaphex
parent 7e47a977d1
commit b9969d2fbd
6 changed files with 71 additions and 25 deletions

View File

@ -41,7 +41,7 @@ CORE_DEFINE := -DWANT_PSX_EMU
TARGET_NAME := mednafen_psx
ifeq ($(HAVE_VULKAN),1)
TARGET_NAME := mednafen_psx_vulkan
TARGET_NAME := mednafen_psx_hw
else ifeq ($(HAVE_OPENGL),1)
TARGET_NAME := mednafen_psx_hw
endif

View File

@ -2484,13 +2484,14 @@ void retro_init(void)
#ifdef HAVE_RUST
rsx_intf_init(RSX_EXTERNAL_RUST);
#elif defined(HAVE_VULKAN)
rsx_intf_init(RSX_VULKAN);
#elif defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
rsx_intf_init(RSX_OPENGL);
#else
rsx_intf_init(RSX_SOFTWARE);
#endif
#ifdef HAVE_VULKAN
rsx_intf_init(RSX_VULKAN);
#endif
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
rsx_intf_init(RSX_OPENGL);
#endif
rsx_intf_init(RSX_SOFTWARE);
}
void retro_reset(void)
@ -2528,13 +2529,25 @@ static void check_variables(bool startup)
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
if (!strcmp(var.value, "software"))
{
rsx_intf_set_type(RSX_SOFTWARE);
rsx_intf_set_fallback_type(RSX_SOFTWARE);
}
else if (!strcmp(var.value, "opengl"))
{
rsx_intf_set_type(RSX_OPENGL);
rsx_intf_set_fallback_type(RSX_VULKAN);
}
else if (!strcmp(var.value, "vulkan"))
{
rsx_intf_set_type(RSX_VULKAN);
rsx_intf_set_fallback_type(RSX_OPENGL);
}
else if (!strcmp(var.value, "opengl-rust"))
{
rsx_intf_set_type(RSX_EXTERNAL_RUST);
rsx_intf_set_type(RSX_VULKAN);
}
}
}
@ -3955,12 +3968,12 @@ void retro_set_controller_port_device(unsigned in_port, unsigned device)
#if defined(HAVE_VULKAN)
#define FIRST_RENDERER "vulkan"
#if defined(HAVE_OPENGL)
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
#define EXT_RENDERER "|opengl|software"
#else
#define EXT_RENDERER "|software"
#endif
#elif defined(HAVE_OPENGL)
#elif defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
#define FIRST_RENDERER "opengl"
#define EXT_RENDERER "|software"
#elif defined(HAVE_RUST)

View File

@ -23,6 +23,8 @@
static enum rsx_renderer_type rsx_type =
#ifdef HAVE_RUST
RSX_EXTERNAL_RUST
#elif defined(HAVE_VULKAN)
RSX_VULKAN
#elif defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
RSX_OPENGL
#else
@ -30,6 +32,8 @@ RSX_SOFTWARE
#endif
;
static enum rsx_renderer_type rsx_fallback_type = RSX_SOFTWARE;
void rsx_intf_set_environment(retro_environment_t cb)
{
switch (rsx_type)
@ -141,34 +145,57 @@ void rsx_intf_set_type(enum rsx_renderer_type type)
rsx_type = type;
}
void rsx_intf_set_fallback_type(enum rsx_renderer_type type)
{
rsx_fallback_type = type;
}
bool rsx_intf_open(bool is_pal)
{
bool ret = true;
switch (rsx_type)
{
case RSX_SOFTWARE:
if (!rsx_soft_open(is_pal))
return false;
ret = false;
break;
case RSX_OPENGL:
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
if (!rsx_gl_open(is_pal))
return false;
ret = false;
#else
ret = false;
#endif
break;
case RSX_VULKAN:
#if defined(HAVE_VULKAN)
if (!rsx_vulkan_open(is_pal))
return false;
ret = false;
#else
ret = false;
#endif
break;
case RSX_EXTERNAL_RUST:
#ifdef HAVE_RUST
if (!rsx_open(is_pal))
return false;
ret = false;
#else
ret = false;
#endif
break;
}
if (!ret)
{
if (rsx_fallback_type == rsx_type) // We're screwed.
return false;
// Try the fallback type.
rsx_type = rsx_fallback_type;
rsx_fallback_type = RSX_SOFTWARE; // This shouldn't ever fail.
return rsx_intf_open(rsx_type);
}
#if defined(RSX_DUMP)
const char *env = getenv("RSX_DUMP");
if (env)

View File

@ -125,6 +125,7 @@ enum blending_modes
uint16_t w, uint16_t h, bool mask_test, bool set_mask);
void rsx_intf_set_type(enum rsx_renderer_type type);
void rsx_intf_set_fallback_type(enum rsx_renderer_type type);
enum rsx_renderer_type rsx_intf_is_type(void);

View File

@ -37,8 +37,7 @@ bool rsx_gl_open(bool is_pal)
{
VideoClock clock = is_pal ? VideoClock_Pal : VideoClock_Ntsc;
set_renderer( RetroGl::getInstance(clock) );
return true;
return static_renderer != NULL;
}
void rsx_gl_close(void)

View File

@ -3,6 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // memcpy()
#include <stdexcept>
/*
*
@ -15,15 +16,19 @@ bool RetroGl::isCreated = false;
RetroGl* RetroGl::getInstance(VideoClock video_clock)
{
static RetroGl *single = NULL;
if (single && isCreated)
{
return single;
} else {
single = new RetroGl(video_clock);
isCreated = true;
return single;
}
static RetroGl *single = NULL;
if (single && isCreated)
{
return single;
} else {
try {
single = new RetroGl(video_clock);
} catch (const std::runtime_error &) {
return NULL;
}
isCreated = true;
return single;
}
}
RetroGl* RetroGl::getInstance()
@ -52,7 +57,8 @@ RetroGl::RetroGl(VideoClock video_clock)
if ( !glsm_ctl(GLSM_CTL_STATE_CONTEXT_INIT, &params) ) {
puts("Failed to init hardware context\n");
exit(EXIT_FAILURE);
// TODO: Move this out to a init function to avoid exceptions?
throw std::runtime_error("Failed to init GLSM context.");
}
static DrawConfig config = {