This commit is contained in:
twinaphex 2017-12-05 13:15:15 +01:00
parent 332aee5b0f
commit 53efad05c6
3 changed files with 37 additions and 40 deletions

View File

@ -25,6 +25,7 @@
#include <stdint.h>
#include <boolean.h>
#include <retro_inline.h>
#if defined(_WIN32) && !defined(_XBOX)
#ifndef WIN32_LEAN_AND_MEAN
@ -41,6 +42,24 @@
#include <compat/msvc.h>
#endif
static INLINE void bits_clear_bits(uint32_t *a, uint32_t *b, uint32_t count)
{
uint32_t i;
for (i = 0; i < count;i++)
a[i] &= b[i];
}
static INLINE bool bits_any_set(uint32_t* ptr, uint32_t count)
{
uint32_t i;
for (i = 0; i < count; i++)
{
if (ptr[i] != 0)
return true;
}
return false;
}
#ifndef PATH_MAX_LENGTH
#if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(GEKKO)|| defined(WIIU)
#define PATH_MAX_LENGTH 512
@ -57,47 +76,11 @@
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define BITS_GET_ELEM(a, i) ((a).data[i])
#define BITS_GET_ELEM_PTR(a, i) ((a)->data[i])
static inline bool bits_any_set(uint32_t* ptr, uint32_t count)
{
uint32_t i;
for (i=0;i<count;i++)
{
if (ptr[i] != 0) return true;
}
return false;
}
#define BITS_ANY_SET(a) bits_any_set((a).data, sizeof((a).data)/sizeof((a).data[0])
#define BITS_ANY_SET_PTR(a) BITS_ANY_SET(*a)
static inline void bits_clear_bits(uint32_t* a, uint32_t* b, uint32_t count)
{
uint32_t i;
for (i=0;i<count;i++)
{
a[i] &= b[i];
}
}
#define BITS_CLEAR_BITS(a,b) bits_clear_bits((a).data, (b).data, sizeof((a).data)/sizeof((a).data[0])
#define BITS_COPY16_PTR(a,bits) \
{ \
BIT128_CLEAR_ALL_PTR(a); \
BITS_GET_ELEM_PTR(a, 0) = (bits) & 0xffff; \
}
#define BITS_COPY32_PTR(a,bits) \
{ \
BIT128_CLEAR_ALL_PTR(a); \
BITS_GET_ELEM_PTR(a, 0) = (bits); \
}
#define BIT_SET(a, bit) ((a)[(bit) >> 3] |= (1 << ((bit) & 7)))
#define BIT_CLEAR(a, bit) ((a)[(bit) >> 3] &= ~(1 << ((bit) & 7)))
#define BIT_GET(a, bit) (((a).data[(bit) >> 3] >> ((bit) & 7)) & 1)
@ -137,6 +120,18 @@ static inline void bits_clear_bits(uint32_t* a, uint32_t* b, uint32_t count)
#define BIT256_GET_PTR(a, bit) BIT256_GET(*a, bit)
#define BIT256_CLEAR_ALL_PTR(a) BIT256_CLEAR_ALL(*a)
#define BITS_COPY16_PTR(a,bits) \
{ \
BIT128_CLEAR_ALL_PTR(a); \
BITS_GET_ELEM_PTR(a, 0) = (bits) & 0xffff; \
}
#define BITS_COPY32_PTR(a,bits) \
{ \
BIT128_CLEAR_ALL_PTR(a); \
BITS_GET_ELEM_PTR(a, 0) = (bits); \
}
/* Helper macros and struct to keep track of many booleans. */
/* This struct has 256 bits. */
typedef struct

View File

@ -165,7 +165,7 @@ unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input)
ok_old = ok_current;
if (BITS_ANY_SET_PTR(p_input))
if (bits_any_set(p_input->data, ARRAY_SIZE(p_input->data)))
{
if (!first_held)
{

View File

@ -2397,7 +2397,7 @@ static enum runloop_state runloop_check_state(
if (input_driver_flushing_input)
{
input_driver_flushing_input = false;
if (BITS_ANY_SET(current_input))
if (bits_any_set(current_input.data, ARRAY_SIZE(current_input.data)))
{
BIT256_CLEAR_ALL(current_input);
if (runloop_paused)
@ -2540,7 +2540,9 @@ static enum runloop_state runloop_check_state(
enum menu_action action;
bool focused = false;
retro_bits_t trigger_input = current_input;
BITS_CLEAR_BITS(trigger_input, old_input);
bits_clear_bits(trigger_input.data, old_input.data,
ARRAY_SIZE(trigger_input.data));
action = (enum menu_action)menu_event(&current_input, &trigger_input);
focused = pause_nonactive ? is_focused : true;