Implement input bitmasks

This commit is contained in:
twinaphex 2019-07-07 09:23:53 +02:00
parent 1e5a0df455
commit 90bf41a456
3 changed files with 26 additions and 10 deletions

View File

@ -697,7 +697,7 @@ void input_handle_lightgun( INPUT_DATA *p_input, int iplayer, retro_input_state_
}
void input_update( retro_input_state_t input_state_cb )
void input_update(bool libretro_supports_bitmasks, retro_input_state_t input_state_cb )
{
// For each player (logical controller)
for ( unsigned iplayer = 0; iplayer < players; ++iplayer )
@ -719,11 +719,21 @@ void input_update( retro_input_state_t input_state_cb )
// Use fixed lookup table to map RetroPad inputs to PlayStation input bitmap.
p_input->buttons = 0;
for ( unsigned i = 0; i < INPUT_MAP_CONTROLLER_SIZE; i++ )
if (libretro_supports_bitmasks)
{
p_input->buttons |=
input_state_cb( iplayer, RETRO_DEVICE_JOYPAD, 0, input_map_controller[ i ] )
? ( 1 << i ) : 0;
int16_t ret = input_state_cb(iplayer, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK);
for ( unsigned i = 0; i < INPUT_MAP_CONTROLLER_SIZE; i++ )
p_input->buttons |= (ret & (1 << input_map_controller[ i ] ))
? ( 1 << i ) : 0;
}
else
{
for ( unsigned i = 0; i < INPUT_MAP_CONTROLLER_SIZE; i++ )
{
p_input->buttons |=
input_state_cb( iplayer, RETRO_DEVICE_JOYPAD, 0, input_map_controller[ i ] )
? ( 1 << i ) : 0;
}
}
break;
@ -743,10 +753,8 @@ void input_update( retro_input_state_t input_state_cb )
if ( input_state_cb( iplayer, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A ) ||
input_state_cb( iplayer, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L ) ||
input_state_cb( iplayer, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R ) )
{
// Guncon 'A'
p_input->u8[ 4 ] |= 0x2;
}
break;

View File

@ -1,7 +1,8 @@
#ifndef __INPUT_H__
#define __INPUT_H__
#include "libretro.h"
#include <boolean.h>
#include <libretro.h>
#include "mednafen/psx/frontio.h"
// These input routines tell libretro about PlayStation peripherals
@ -28,7 +29,7 @@ extern void input_set_player_count( unsigned players );
extern unsigned input_get_player_count();
extern void input_update( retro_input_state_t input_state_cb );
void input_update(bool supports_bitmasks, retro_input_state_t input_state_cb );
enum
{

View File

@ -32,6 +32,8 @@
extern bool FastSaveStates;
const int DEFAULT_STATE_SIZE = 16 * 1024 * 1024;
static bool libretro_supports_bitmasks = false;
struct retro_perf_callback perf_cb;
retro_get_cpu_features_t perf_get_cpu_features_cb = NULL;
retro_log_printf_t log_cb;
@ -2632,6 +2634,9 @@ void retro_init(void)
setting_initial_scanline_pal = 0;
setting_last_scanline_pal = 287;
if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL))
libretro_supports_bitmasks = true;
check_system_specs();
}
@ -3644,7 +3649,7 @@ void retro_run(void)
input_poll_cb();
input_update( input_state_cb );
input_update(libretro_supports_bitmasks, input_state_cb );
static int32 rects[MEDNAFEN_CORE_GEOMETRY_MAX_H];
rects[0] = ~0;
@ -3915,6 +3920,8 @@ void retro_deinit(void)
MEDNAFEN_CORE_NAME, (double)audio_frames / video_frames);
log_cb(RETRO_LOG_INFO, "[%s]: Estimated FPS: %.5f\n",
MEDNAFEN_CORE_NAME, (double)video_frames * 44100 / audio_frames);
libretro_supports_bitmasks = false;
}
unsigned retro_get_region(void)