Add a threaded renderer
[pcsx_rearmed.git] / frontend / libretro.c
index a91c5c1..323932a 100644 (file)
@@ -90,6 +90,7 @@ static int show_advanced_gpu_peops_settings = -1;
 static int show_advanced_gpu_unai_settings = -1;
 #endif
 static int show_other_input_settings = -1;
+static float mouse_sensitivity = 1.0f;
 
 static unsigned previous_width = 0;
 static unsigned previous_height = 0;
@@ -1817,6 +1818,21 @@ static void update_variables(bool in_flight)
          Config.SpuIrq = 1;
    }
 
+#ifdef THREAD_RENDERING
+   var.key = "pcsx_rearmed_gpu_thread_rendering";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_OFF;
+      else if (strcmp(var.value, "sync") == 0)
+         pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_SYNC;
+      else if (strcmp(var.value, "async") == 0)
+         pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_ASYNC;
+   }
+#endif
+
 #ifdef GPU_PEOPS
    var.value = NULL;
    var.key = "pcsx_rearmed_gpu_peops_odd_even_bit";
@@ -1998,6 +2014,17 @@ static void update_variables(bool in_flight)
          pl_rearmed_cbs.gpu_unai.blending = 1;
    }
 
+   var.key = "pcsx_rearmed_gpu_unai_scale_hires";
+   var.value = NULL;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0)
+         pl_rearmed_cbs.gpu_unai.scale_hires = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+         pl_rearmed_cbs.gpu_unai.scale_hires = 1;
+   }
+
    var.key = "pcsx_rearmed_show_gpu_unai_settings";
    var.value = NULL;
 
@@ -2013,17 +2040,18 @@ static void update_variables(bool in_flight)
       {
          unsigned i;
          struct retro_core_option_display option_display;
-         char gpu_unai_option[5][40] = {
+         char gpu_unai_option[6][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"
+            "pcsx_rearmed_gpu_unai_pixel_skip",
+            "pcsx_rearmed_gpu_unai_scale_hires",
          };
 
          option_display.visible = show_advanced_gpu_unai_settings;
 
-         for (i = 0; i < 5; i++)
+         for (i = 0; i < 6; i++)
          {
             option_display.key = gpu_unai_option[i];
             environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display);
@@ -2108,6 +2136,13 @@ static void update_variables(bool in_flight)
    }
 #endif /* NEW_DYNAREC */
 
+   var.value = NULL;
+   var.key = "pcsx_rearmed_input_sensitivity";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      mouse_sensitivity = atof(var.value);
+   }
+
    var.key = "pcsx_rearmed_show_other_input_settings";
    var.value = NULL;
 
@@ -2250,40 +2285,35 @@ static void update_input_guncon(int port, int ret)
    //RETRO_DEVICE_ID_LIGHTGUN_AUX_B
    //Though not sure these are hooked up properly on the Pi
 
-   //ToDo
-   //Put the controller index back to port instead of hardcoding to 1 when the libretro overlay crash bug is fixed
-   //This is required for 2 player
-
    //GUNCON has 3 controls, Trigger,A,B which equal Circle,Start,Cross
 
    // Trigger
    //The 1 is hardcoded instead of port to prevent the overlay mouse button libretro crash bug
-   if (input_state_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT))
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT))
    {
       in_keystate[port] |= (1 << DKEY_CIRCLE);
    }
 
    // A
-   if (input_state_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT))
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT))
    {
       in_keystate[port] |= (1 << DKEY_START);
    }
 
    // B
-   if (input_state_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE))
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE))
    {
       in_keystate[port] |= (1 << DKEY_CROSS);
    }
 
-   //The 1 is hardcoded instead of port to prevent the overlay mouse button libretro crash bug
-   int gunx = input_state_cb(1, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X);
-   int guny = input_state_cb(1, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y);
+   int gunx = input_state_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X);
+   int guny = input_state_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y);
 
    //Mouse range is -32767 -> 32767
    //1% is about 655
    //Use the left analog stick field to store the absolute coordinates
-   in_analog_left[0][0] = (gunx * GunconAdjustRatioX) + (GunconAdjustX * 655);
-   in_analog_left[0][1] = (guny * GunconAdjustRatioY) + (GunconAdjustY * 655);
+   in_analog_left[port][0] = (gunx * GunconAdjustRatioX) + (GunconAdjustX * 655);
+   in_analog_left[port][1] = (guny * GunconAdjustRatioY) + (GunconAdjustY * 655);
 }
 
 static void update_input_negcon(int port, int ret)
@@ -2396,6 +2426,32 @@ static void update_input_negcon(int port, int ret)
    in_analog_left[port][1] = get_analog_button(ret, input_state_cb, port, RETRO_DEVICE_ID_JOYPAD_L);
 }
 
+static void update_input_mouse(int port, int ret)
+{
+   float raw_x = input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
+   float raw_y = input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
+
+   int x = (int)roundf(raw_x * mouse_sensitivity);
+   int y = (int)roundf(raw_y * mouse_sensitivity);
+
+   if (x > 127) x = 127;
+   else if (x < -128) x = -128;
+
+   if (y > 127) y = 127;
+   else if (y < -128) y = -128;
+
+   in_mouse[port][0] = x; /* -128..+128 left/right movement, 0 = no movement */
+   in_mouse[port][1] = y; /* -128..+128 down/up movement, 0 = no movement    */
+
+   /* left mouse button state */
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT))
+      in_keystate[port] |= 1 << 11;
+
+   /* right mouse button state */
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT))
+      in_keystate[port] |= 1 << 10;
+}
+
 static void update_input(void)
 {
    // reset all keystate, query libretro for keystate
@@ -2432,38 +2488,8 @@ static void update_input(void)
          update_input_negcon(i, ret);
          break;
       case PSE_PAD_TYPE_MOUSE:
-      {
-         /* mouse x/y movement, range -128 to +127 */
-         float accum_x = 0, accum_y = 0;
-         
-         float x = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
-         float y = input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
-
-         accum_x += x;
-         accum_y += y;
-
-         if (accum_x > 127)
-            accum_x = 127;
-         else if (accum_x < -128)
-            accum_x = -128;
-
-         if (accum_y > 127)
-            accum_y = 127;
-         else if (accum_y < -128)
-            accum_y = -128;
-
-         in_mouse[i][0] = (int)accum_x;
-         in_mouse[i][1] = (int)accum_y;
-
-         /* mouse button state */
-         if (input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT))
-            in_keystate[i] |= 1 << 11;
-
-         if (input_state_cb(i, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT))
-            in_keystate[i] |= 1 << 10;
-
-         break;
-      }
+         update_input_mouse(i, ret);
+         break;      
       default:
          // Query digital inputs
          for (j = 0; j < RETRO_PSX_MAP_LEN; j++)
@@ -2817,7 +2843,7 @@ void retro_init(void)
     * we have to do this because cache misses and some IO penalties
     * are not emulated. Warning: changing this may break compatibility. */
    cycle_multiplier = 175;
-#ifdef HAVE_PRE_ARMV7
+#if defined(HAVE_PRE_ARMV7) && !defined(_3DS)
    cycle_multiplier = 200;
 #endif
    pl_rearmed_cbs.gpu_peops.iUseDither = 1;
@@ -2881,3 +2907,17 @@ void SysPrintf(const char *fmt, ...)
    if (log_cb)
       log_cb(RETRO_LOG_INFO, "%s", msg);
 }
+
+/* Prints debug-level logs */
+void SysDLog(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_DEBUG, "%s", msg);
+}