Update
[pcsx_rearmed.git] / frontend / libretro.c
index e48069a..a7c264e 100644 (file)
 #include <sys/syscall.h>
 #endif
 
+#ifdef SWITCH
+#include <switch.h>
+#endif
+
 #include "../libpcsxcore/misc.h"
 #include "../libpcsxcore/psxcounters.h"
 #include "../libpcsxcore/psxmem_map.h"
@@ -78,6 +82,7 @@ static bool display_internal_fps = false;
 static unsigned frame_count = 0;
 static bool libretro_supports_bitmasks = false;
 static int show_advanced_gpu_peops_settings = -1;
+static int show_advanced_gpu_unai_settings  = -1;
 
 static unsigned previous_width = 0;
 static unsigned previous_height = 0;
@@ -134,6 +139,16 @@ static int snd_init(void){return 0;}
 static void snd_finish(void){}
 static int snd_busy(void){return 0;}
 
+#define GPU_PEOPS_ODD_EVEN_BIT         (1 << 0)
+#define GPU_PEOPS_EXPAND_SCREEN_WIDTH  (1 << 1)
+#define GPU_PEOPS_IGNORE_BRIGHTNESS    (1 << 2)
+#define GPU_PEOPS_DISABLE_COORD_CHECK  (1 << 3)
+#define GPU_PEOPS_LAZY_SCREEN_UPDATE   (1 << 6)
+#define GPU_PEOPS_OLD_FRAME_SKIP       (1 << 7)
+#define GPU_PEOPS_REPEATED_TRIANGLES   (1 << 8)
+#define GPU_PEOPS_QUADS_WITH_TRIANGLES (1 << 9)
+#define GPU_PEOPS_FAKE_BUSY_STATE      (1 << 10)
+
 static void init_memcard(char *mcd_data)
 {
        unsigned off = 0;
@@ -962,11 +977,11 @@ static struct retro_disk_control_callback disk_control = {
 #define PATH_MAX  4096
 #endif
 
-static char base_dir[PATH_MAX];
+static char base_dir[1024];
 
 static bool read_m3u(const char *file)
 {
-       char line[PATH_MAX];
+       char line[1024];
        char name[PATH_MAX];
        FILE *f = fopen(file, "r");
        if (!f)
@@ -1323,7 +1338,7 @@ size_t retro_get_memory_size(unsigned id)
        if (id == RETRO_MEMORY_SAVE_RAM)
                return MCD_SIZE;
        else if (id == RETRO_MEMORY_SYSTEM_RAM)
-               return 0x210000;
+               return 0x200000;
        else
                return 0;
 }
@@ -1423,6 +1438,7 @@ static void update_variables(bool in_flight)
       if (strcmp(var.value, "disabled") == 0) {
          pl_rearmed_cbs.gpu_peops.iUseDither = 0;
          pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 0;
+         pl_rearmed_cbs.gpu_unai.dithering = 0;
 #ifdef __ARM_NEON__
          pl_rearmed_cbs.gpu_neon.allow_dithering = 0;
 #endif
@@ -1430,6 +1446,7 @@ static void update_variables(bool in_flight)
       else if (strcmp(var.value, "enabled") == 0) {
          pl_rearmed_cbs.gpu_peops.iUseDither = 1;
          pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 1;
+         pl_rearmed_cbs.gpu_unai.dithering = 1;
 #ifdef __ARM_NEON__
          pl_rearmed_cbs.gpu_neon.allow_dithering = 1;
 #endif
@@ -1633,91 +1650,91 @@ static void update_variables(bool in_flight)
 
 #ifdef GPU_PEOPS
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_0";
+   var.key = "pcsx_rearmed_gpu_peops_odd_even_bit";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 0);
+         gpu_peops_fix |= GPU_PEOPS_ODD_EVEN_BIT;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_1";
+   var.key = "pcsx_rearmed_gpu_peops_expand_screen_width";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 1);
+         gpu_peops_fix |= GPU_PEOPS_EXPAND_SCREEN_WIDTH;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_2";
+   var.key = "pcsx_rearmed_gpu_peops_ignore_brightness";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 2);
+         gpu_peops_fix |= GPU_PEOPS_IGNORE_BRIGHTNESS;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_3";
+   var.key = "pcsx_rearmed_gpu_peops_disable_coord_check";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 3);
+         gpu_peops_fix |= GPU_PEOPS_DISABLE_COORD_CHECK;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_6";
+   var.key = "pcsx_rearmed_gpu_peops_lazy_screen_update";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 6);
+         gpu_peops_fix |= GPU_PEOPS_LAZY_SCREEN_UPDATE;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_7";
+   var.key = "pcsx_rearmed_gpu_peops_old_frame_skip";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 7);
+         gpu_peops_fix |= GPU_PEOPS_OLD_FRAME_SKIP;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_8";
+   var.key = "pcsx_rearmed_gpu_peops_repeated_triangles";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 8);
+         gpu_peops_fix |= GPU_PEOPS_REPEATED_TRIANGLES;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_9";
+   var.key = "pcsx_rearmed_gpu_peops_quads_with_triangles";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 9);
+         gpu_peops_fix |= GPU_PEOPS_QUADS_WITH_TRIANGLES;
    }
 
    var.value = "NULL";
-   var.key = "pcsx_rearmed_gpu_peops_fix_10";
+   var.key = "pcsx_rearmed_gpu_peops_fake_busy_state";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "enabled") == 0)
-         gpu_peops_fix |= (1 << 10);
+         gpu_peops_fix |= GPU_PEOPS_FAKE_BUSY_STATE;
    }
 
    if (pl_rearmed_cbs.gpu_peops.dwActFixes != gpu_peops_fix)
       pl_rearmed_cbs.gpu_peops.dwActFixes = gpu_peops_fix;
 
 
-    /* Show/hide core options */
+   /* Show/hide core options */
 
    var.key = "pcsx_rearmed_show_gpu_peops_settings";
    var.value = NULL;
@@ -1734,16 +1751,16 @@ static void update_variables(bool in_flight)
       {
          unsigned i;
          struct retro_core_option_display option_display;
-         char gpu_peops_option[9][32] = {
-            "pcsx_rearmed_gpu_peops_fix_0",
-            "pcsx_rearmed_gpu_peops_fix_1",
-            "pcsx_rearmed_gpu_peops_fix_2",
-            "pcsx_rearmed_gpu_peops_fix_3",
-            "pcsx_rearmed_gpu_peops_fix_6",
-            "pcsx_rearmed_gpu_peops_fix_7",
-            "pcsx_rearmed_gpu_peops_fix_8",
-            "pcsx_rearmed_gpu_peops_fix_9",
-            "pcsx_rearmed_gpu_peops_fix_10",
+         char gpu_peops_option[9][45] = {
+            "pcsx_rearmed_gpu_peops_odd_even_bit",
+            "pcsx_rearmed_gpu_peops_expand_screen_width",
+            "pcsx_rearmed_gpu_peops_ignore_brightness",
+            "pcsx_rearmed_gpu_peops_disable_coord_check",
+            "pcsx_rearmed_gpu_peops_lazy_screen_update",
+            "pcsx_rearmed_gpu_peops_old_frame_skip",
+            "pcsx_rearmed_gpu_peops_repeated_triangles",
+            "pcsx_rearmed_gpu_peops_quads_with_triangles",
+            "pcsx_rearmed_gpu_peops_fake_busy_state",
          };
 
          option_display.visible = show_advanced_gpu_peops_settings;
@@ -1757,6 +1774,96 @@ static void update_variables(bool in_flight)
    }
 #endif
 
+#ifdef GPU_UNAI
+   var.key = "pcsx_rearmed_gpu_unai_ilace_force";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_unai.ilace_force = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_unai.ilace_force = 1;
+   }
+
+   var.key = "pcsx_rearmed_gpu_unai_pixel_skip";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_unai.pixel_skip = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_unai.pixel_skip = 1;
+   }
+
+   var.key = "pcsx_rearmed_gpu_unai_lighting";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_unai.lighting = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_unai.lighting = 1;
+   }
+
+   var.key = "pcsx_rearmed_gpu_unai_fast_lighting";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_unai.fast_lighting = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_unai.fast_lighting = 1;
+   }
+
+   var.key = "pcsx_rearmed_gpu_unai_blending";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_unai.blending = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_unai.blending = 1;
+   }
+
+   var.key = "pcsx_rearmed_show_gpu_unai_settings";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      int show_advanced_gpu_unai_settings_prev = show_advanced_gpu_unai_settings;
+
+      show_advanced_gpu_unai_settings = 1;
+      if (strcmp(var.value, "disabled") == 0)
+         show_advanced_gpu_unai_settings = 0;
+
+      if (show_advanced_gpu_unai_settings != show_advanced_gpu_unai_settings_prev)
+      {
+         unsigned i;
+         struct retro_core_option_display option_display;
+         char gpu_unai_option[5][40] = {
+            "pcsx_rearmed_gpu_unai_blending",
+            "pcsx_rearmed_gpu_unai_lighting",
+            "pcsx_rearmed_gpu_unai_fast_lighting",
+            "pcsx_rearmed_gpu_unai_ilace_force",
+            "pcsx_rearmed_gpu_unai_pixel_skip",
+         };
+
+         option_display.visible = show_advanced_gpu_unai_settings;
+
+         for (i = 0; i < 5; i++)
+         {
+            option_display.key = gpu_unai_option[i];
+            environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display);
+         }
+      }
+   }
+#endif // GPU_UNAI
+
    if (in_flight) {
       // inform core things about possible config changes
       plugin_call_rearmed_cbs();
@@ -2068,7 +2175,7 @@ static bool find_any_bios(const char *dirpath, char *path, size_t path_size)
                return false;
 
        while ((ent = readdir(dir))) {
-               if (strncasecmp(ent->d_name, "scph", 4) != 0)
+               if ((strncasecmp(ent->d_name, "scph", 4) != 0) && (strncasecmp(ent->d_name, "psx", 3) != 0))
                        continue;
 
                snprintf(path, path_size, "%s%c%s", dirpath, SLASH, ent->d_name);
@@ -2130,10 +2237,11 @@ static int init_memcards(void)
 static void loadPSXBios(void)
 {
        const char *dir;
-       char path[256];
+       char path[PATH_MAX];
        unsigned useHLE = 0;
 
        const char *bios[] = {
+               "PSXONPSP660", "psxonpsp660",
                "SCPH101", "scph101",
                "SCPH5501", "scph5501",
                "SCPH7001", "scph7001",
@@ -2222,7 +2330,7 @@ void retro_init(void)
 
 #ifdef _3DS
    vout_buf = linearMemAlign(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2, 0x80);
-#elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && !defined(VITA)
+#elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && !defined(VITA) && !defined(__SWITCH__)
        posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2);
 #else
        vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2);
@@ -2247,7 +2355,7 @@ void retro_init(void)
        cycle_multiplier = 200;
 #endif
        pl_rearmed_cbs.gpu_peops.iUseDither = 1;
-   pl_rearmed_cbs.gpu_peops.dwActFixes = 1 << 7;
+       pl_rearmed_cbs.gpu_peops.dwActFixes = GPU_PEOPS_OLD_FRAME_SKIP;
        spu_config.iUseFixedUpdates = 1;
 
        SaveFuncs.open = save_open;
@@ -2265,6 +2373,7 @@ void retro_init(void)
 
 void retro_deinit(void)
 {
+       ClosePlugins();
        SysClose();
 #ifdef _3DS
    linearFree(vout_buf);
@@ -2286,3 +2395,15 @@ int usleep (unsigned long us)
    sceKernelDelayThread(us);
 }
 #endif
+
+void SysPrintf(const char *fmt, ...) {
+       va_list list;
+       char msg[512];
+
+       va_start(list, fmt);
+       vsprintf(msg, fmt, list);
+       va_end(list);
+
+       if (log_cb)
+               log_cb(RETRO_LOG_INFO, "%s", msg);
+}