X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro.c;h=992da60f31e8e13b05170d74bb91e2d9df73d54b;hb=8ec1e4de88798ca548481773e49bb01a4de03139;hp=9f7c4fe5d3ed15c9b303896c5973d3ee43211016;hpb=b12cce7427981efd7bdd47b454e7c3b86929b2f3;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index 9f7c4fe5..992da60f 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -74,6 +74,10 @@ static bool duping_enable; static bool found_bios; static bool display_internal_fps = false; static unsigned frame_count = 0; +static bool libretro_supports_bitmasks = false; + +static unsigned previous_width = 0; +static unsigned previous_height = 0; static int plugins_opened; static int is_pal_mode; @@ -179,6 +183,18 @@ static void vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) vout_width = w; vout_height = h; + if (previous_width != vout_width || previous_height != vout_height) + { + previous_width = vout_width; + previous_height = vout_height; + + SysPrintf("setting mode width: %d height %d\n", vout_width, vout_height); + + struct retro_system_av_info info; + retro_get_system_av_info(&info); + environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &info.geometry); + } + set_vout_fb(); } @@ -713,11 +729,15 @@ void retro_get_system_info(struct retro_system_info *info) void retro_get_system_av_info(struct retro_system_av_info *info) { + + unsigned geom_height = vout_height > 0 ? vout_height : 240; + unsigned geom_width = vout_width > 0 ? vout_width : 320; + memset(info, 0, sizeof(*info)); info->timing.fps = is_pal_mode ? 50 : 60; info->timing.sample_rate = 44100; - info->geometry.base_width = 320; - info->geometry.base_height = 240; + info->geometry.base_width = geom_width; + info->geometry.base_height = geom_height; info->geometry.max_width = VOUT_MAX_WIDTH; info->geometry.max_height = VOUT_MAX_HEIGHT; info->geometry.aspect_ratio = 4.0 / 3.0; @@ -1344,6 +1364,8 @@ void *retro_get_memory_data(unsigned id) { if (id == RETRO_MEMORY_SAVE_RAM) return Mcd1Data; + else if (id == RETRO_MEMORY_SYSTEM_RAM) + return psxM; else return NULL; } @@ -1352,6 +1374,8 @@ 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; else return 0; } @@ -1626,6 +1650,38 @@ static void update_variables(bool in_flight) Config.Cdda = 0; } +#ifndef DRC_DISABLE + var.value = NULL; + var.key = "pcsx_rearmed_nosmccheck"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) + { + if (strcmp(var.value, "enabled") == 0) + new_dynarec_hacks |= NDHACK_NO_SMC_CHECK; + else + new_dynarec_hacks &= ~NDHACK_NO_SMC_CHECK; + } + + var.value = NULL; + var.key = "pcsx_rearmed_gteregsunneeded"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) + { + if (strcmp(var.value, "enabled") == 0) + new_dynarec_hacks |= NDHACK_GTE_UNNEEDED; + else + new_dynarec_hacks &= ~NDHACK_GTE_UNNEEDED; + } + + var.value = NULL; + var.key = "pcsx_rearmed_nogteflags"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) + { + if (strcmp(var.value, "enabled") == 0) + new_dynarec_hacks |= NDHACK_GTE_NO_FLAGS; + else + new_dynarec_hacks &= ~NDHACK_GTE_NO_FLAGS; + } +#endif + if (in_flight) { // inform core things about possible config changes plugin_call_rearmed_cbs(); @@ -1664,50 +1720,18 @@ static void update_variables(bool in_flight) int psxclock = atoi(var.value); cycle_multiplier = 10000 / psxclock; } - - var.value = NULL; - var.key = "pcsx_rearmed_nosmccheck"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - if (strcmp(var.value, "enabled") == 0) - new_dynarec_hacks |= NDHACK_NO_SMC_CHECK; - else - new_dynarec_hacks &= ~NDHACK_NO_SMC_CHECK; - } - - var.value = NULL; - var.key = "pcsx_rearmed_gteregsunneeded"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - if (strcmp(var.value, "enabled") == 0) - new_dynarec_hacks |= NDHACK_GTE_UNNEEDED; - else - new_dynarec_hacks &= ~NDHACK_GTE_UNNEEDED; - } - - var.value = NULL; - var.key = "pcsx_rearmed_nogteflags"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value) - { - if (strcmp(var.value, "enabled") == 0) - new_dynarec_hacks |= NDHACK_GTE_NO_FLAGS; - else - new_dynarec_hacks &= ~NDHACK_GTE_NO_FLAGS; - } #endif } } // Taken from beetle-psx-libretro -static uint16_t get_analog_button(retro_input_state_t input_state_cb, int player_index, int id) +static uint16_t get_analog_button(int16_t ret, retro_input_state_t input_state_cb, int player_index, int id) { - uint16_t button; - // NOTE: Analog buttons were added Nov 2017. Not all front-ends support this // feature (or pre-date it) so we need to handle this in a graceful way. // First, try and get an analog value using the new libretro API constant - button = input_state_cb(player_index, + uint16_t button = input_state_cb(player_index, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_BUTTON, id); @@ -1721,10 +1745,7 @@ static uint16_t get_analog_button(retro_input_state_t input_state_cb, int player // NOTE: If we're really just not holding the button, we're still going to get zero. - button = input_state_cb(player_index, - RETRO_DEVICE_JOYPAD, - 0, - id) ? 255 : 0; + button = (ret & (1 << id)) ? 255 : 0; } return button; @@ -1764,9 +1785,9 @@ void retro_run(void) environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &msg); } - } else { - frame_count = 0; } + else + frame_count = 0; input_poll_cb(); @@ -1781,48 +1802,54 @@ void retro_run(void) float negcon_twist_amplitude; int negcon_i_rs; int negcon_ii_rs; - for(i = 0; i < PORTS_NUMBER; i++) { + for(i = 0; i < PORTS_NUMBER; i++) + { + int16_t ret = 0; in_keystate[i] = 0; if (in_type[i] == PSE_PAD_TYPE_NONE) continue; + + if (libretro_supports_bitmasks) + ret = input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK); + else + { + unsigned j; + for (j = 0; j < (RETRO_DEVICE_ID_JOYPAD_R3+1); j++) + { + if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, j)) + ret |= (1 << j); + } + } if (in_type[i] == PSE_PAD_TYPE_NEGCON) { // Query digital inputs // // > Pad-Up - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_UP)) in_keystate[i] |= (1 << DKEY_UP); - } // > Pad-Right - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_RIGHT)) in_keystate[i] |= (1 << DKEY_RIGHT); - } // > Pad-Down - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_DOWN)) in_keystate[i] |= (1 << DKEY_DOWN); - } // > Pad-Left - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_LEFT)) in_keystate[i] |= (1 << DKEY_LEFT); - } // > Start - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_START)) in_keystate[i] |= (1 << DKEY_START); - } // > neGcon A - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_A)) in_keystate[i] |= (1 << DKEY_CIRCLE); - } // > neGcon B - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_X)) in_keystate[i] |= (1 << DKEY_TRIANGLE); - } // > neGcon R shoulder (digital) - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R)){ + if (ret & (1 << RETRO_DEVICE_ID_JOYPAD_R)) in_keystate[i] |= (1 << DKEY_R1); - } // Query analog inputs // // From studying 'libpcsxcore/plugins.c' and 'frontend/plugin.c': @@ -1836,24 +1863,23 @@ void retro_run(void) // > NeGcon twist // >> Get raw analog stick value and account for deadzone lsx = input_state_cb(i, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X); - if (lsx > negcon_deadzone){ + if (lsx > negcon_deadzone) lsx = lsx - negcon_deadzone; - } else if (lsx < -negcon_deadzone){ + else if (lsx < -negcon_deadzone) lsx = lsx + negcon_deadzone; - } else { + else lsx = 0; - } // >> Convert to an 'amplitude' [-1.0,1.0] and adjust response negcon_twist_amplitude = (float)lsx / (float)(NEGCON_RANGE - negcon_deadzone); - if (negcon_linearity == 2){ - if (negcon_twist_amplitude < 0.0){ + if (negcon_linearity == 2) + { + if (negcon_twist_amplitude < 0.0) negcon_twist_amplitude = -(negcon_twist_amplitude * negcon_twist_amplitude); - } else { + else negcon_twist_amplitude = negcon_twist_amplitude * negcon_twist_amplitude; - } - } else if (negcon_linearity == 3){ - negcon_twist_amplitude = negcon_twist_amplitude * negcon_twist_amplitude * negcon_twist_amplitude; } + else if (negcon_linearity == 3) + negcon_twist_amplitude = negcon_twist_amplitude * negcon_twist_amplitude * negcon_twist_amplitude; // >> Convert to final 'in_analog' integer value [0,255] in_analog_right[i][0] = MAX(MIN((int)(negcon_twist_amplitude * 128.0f) + 128, 255), 0); // > NeGcon I + II @@ -1868,48 +1894,45 @@ void retro_run(void) // (Note: have never encountered a gamepad with significant differences // in deadzone between left/right analog sticks, so use the regular 'twist' // deadzone here) - if (rsy > negcon_deadzone){ + if (rsy > negcon_deadzone) rsy = rsy - negcon_deadzone; - } else { + else rsy = 0; - } // Convert to 'in_analog' integer value [0,255] negcon_ii_rs = MIN((int)(((float)rsy / (float)(NEGCON_RANGE - negcon_deadzone)) * 255.0f), 255); } else { - if (rsy < -negcon_deadzone){ + if (rsy < -negcon_deadzone) rsy = -1 * (rsy + negcon_deadzone); - } else { + else rsy = 0; - } negcon_i_rs = MIN((int)(((float)rsy / (float)(NEGCON_RANGE - negcon_deadzone)) * 255.0f), 255); } // >> NeGcon I in_analog_right[i][1] = MAX( MAX( - get_analog_button(input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_R2), - get_analog_button(input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_B) + get_analog_button(ret, input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_R2), + get_analog_button(ret, input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_B) ), negcon_i_rs ); // >> NeGcon II in_analog_left[i][0] = MAX( MAX( - get_analog_button(input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_L2), - get_analog_button(input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_Y) + get_analog_button(ret, input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_L2), + get_analog_button(ret, input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_Y) ), negcon_ii_rs ); // > NeGcon L - in_analog_left[i][1] = get_analog_button(input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_L); + in_analog_left[i][1] = get_analog_button(ret, input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_L); } else { // Query digital inputs - for (j = 0; j < RETRO_PSX_MAP_LEN; j++){ - if (input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, j)){ + for (j = 0; j < RETRO_PSX_MAP_LEN; j++) + if (ret & (1 << j)) in_keystate[i] |= retro_psx_map[j]; - } - } + // Query analog inputs if (in_type[i] == PSE_PAD_TYPE_ANALOGJOY || in_type[i] == PSE_PAD_TYPE_ANALOGPAD) { @@ -2157,6 +2180,9 @@ void retro_init(void) SaveFuncs.seek = save_seek; SaveFuncs.close = save_close; + if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL)) + libretro_supports_bitmasks = true; + update_variables(false); check_system_specs(); } @@ -2174,6 +2200,7 @@ void retro_deinit(void) #ifdef VITA deinit_vita_mmap(); #endif + libretro_supports_bitmasks = false; } #ifdef VITA