aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
authortwinaphex2013-05-24 00:08:10 +0200
committernotaz2013-05-26 19:03:57 +0300
commite268a47e483b139b3c337c5fc37e3551138fbb99 (patch)
tree7174487f6b8f647d531bf153746423e69a03f288 /frontend
parentaa0e931b7dbd98359d3b0aa0db16c4d2ee8ca197 (diff)
downloadpcsx_rearmed-e268a47e483b139b3c337c5fc37e3551138fbb99.tar.gz
pcsx_rearmed-e268a47e483b139b3c337c5fc37e3551138fbb99.tar.bz2
pcsx_rearmed-e268a47e483b139b3c337c5fc37e3551138fbb99.zip
(NEON ARM) Add NEON ARM core option (Enhanced resolution - slow)
Diffstat (limited to 'frontend')
-rw-r--r--frontend/libretro.c41
-rwxr-xr-xfrontend/libretro.h9
2 files changed, 48 insertions, 2 deletions
diff --git a/frontend/libretro.c b/frontend/libretro.c
index 7a7c2ef..8fb58b7 100644
--- a/frontend/libretro.c
+++ b/frontend/libretro.c
@@ -230,7 +230,22 @@ void out_register_libretro(struct out_driver *drv)
}
/* libretro */
-void retro_set_environment(retro_environment_t cb) { environ_cb = cb; }
+void retro_set_environment(retro_environment_t cb)
+{
+#ifdef __ARM_NEON__
+ static const struct retro_variable vars[] = {
+ { "neon_enhancement_enable", "Enhanced resolution (slow); disabled|enabled" },
+ { NULL, NULL },
+ };
+
+ environ_cb = cb;
+
+ cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
+#else
+ environ_cb = cb;
+#endif
+}
+
void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; }
void retro_set_audio_sample(retro_audio_sample_t cb) { (void)cb; }
void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { audio_batch_cb = cb; }
@@ -710,11 +725,33 @@ static const unsigned short retro_psx_map[] = {
};
#define RETRO_PSX_MAP_LEN (sizeof(retro_psx_map) / sizeof(retro_psx_map[0]))
+static void update_variables(void)
+{
+#ifdef __ARM_NEON__
+ struct retro_variable var;
+ var.value = NULL;
+ var.key = "neon_enhancement_enable";
+
+ if (!environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || !var.value)
+ return;
+
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_enable = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_enable = 1;
+#endif
+}
+
void retro_run(void)
{
int i;
input_poll_cb();
+
+ bool updated = false;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
+ update_variables();
+
in_keystate = 0;
for (i = 0; i < RETRO_PSX_MAP_LEN; i++)
if (input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, i))
@@ -795,6 +832,8 @@ void retro_init(void)
SaveFuncs.write = save_write;
SaveFuncs.seek = save_seek;
SaveFuncs.close = save_close;
+
+ update_variables();
}
void retro_deinit(void)
diff --git a/frontend/libretro.h b/frontend/libretro.h
index b02855a..dc5b52b 100755
--- a/frontend/libretro.h
+++ b/frontend/libretro.h
@@ -452,6 +452,13 @@ enum retro_mod
// Result is set to true if some variables are updated by
// frontend since last call to RETRO_ENVIRONMENT_GET_VARIABLE.
// Variables should be queried with GET_VARIABLE.
+ //
+#define RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME 18
+ // const bool * --
+ // If true, the libretro implementation supports calls to retro_load_game() with NULL as argument.
+ // Used by cores which can run without particular game data.
+ // This should be called within retro_set_environment() only.
+
// Pass this to retro_video_refresh_t if rendering to hardware.
// Passing NULL to retro_video_refresh_t is still a frame dupe as normal.
@@ -496,7 +503,7 @@ typedef void (*retro_keyboard_event_t)(bool down, unsigned keycode, uint32_t cha
struct retro_keyboard_callback
{
- retro_keyboard_event_t callback;
+ retro_keyboard_event_t callback;
};
// Callbacks for RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE.