mirror of
https://github.com/libretro/beetle-psx-libretro.git
synced 2025-02-17 07:30:50 +00:00
Add fallback support for graphics backend.
Will choose either GL/Vulkan depending on what the frontend allows.
This commit is contained in:
parent
7e47a977d1
commit
b9969d2fbd
2
Makefile
2
Makefile
@ -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
|
||||
|
29
libretro.cpp
29
libretro.cpp
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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, ¶ms) ) {
|
||||
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 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user