mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-11-25 01:38:59 +08:00
367ca52d9e
Applies patch for SDL 2.0.9 bug 4391: "hid_enumerate() sometimes causes game to freeze for a few seconds" See: https://bugzilla.libsdl.org/show_bug.cgi?id=4391
76 lines
2.3 KiB
Diff
76 lines
2.3 KiB
Diff
# HG changeset patch
|
|
# User Sam Lantinga <slouken@libsdl.org>
|
|
# Date 1542691020 28800
|
|
# Node ID 9091b20040cf04cdc348d290ca22373b36364c39
|
|
# Parent 144400e4630d885d2eb0761b7174433b4c0d90bb
|
|
Fixed bug 4391 - hid_enumerate() sometimes causes game to freeze for a few seconds
|
|
|
|
Daniel Gibson
|
|
|
|
Even though my game (dhewm3) doesn't use SDL_INIT_JOYSTICK, SDL_PumpEvent() calls SDL_JoystickUpdate() which ends up calling hid_enumerate() every three seconds, and sometimes on my Win7 box hid_enumerate() takes about 5 seconds, which causes the whole game to freeze for that time.
|
|
|
|
diff -r 144400e4630d -r 9091b20040cf include/SDL_bits.h
|
|
--- a/include/SDL_bits.h Sun Nov 18 19:28:20 2018 +0300
|
|
+++ b/include/SDL_bits.h Mon Nov 19 21:17:00 2018 -0800
|
|
@@ -101,6 +101,15 @@
|
|
#endif
|
|
}
|
|
|
|
+SDL_FORCE_INLINE SDL_bool
|
|
+SDL_HasExactlyOneBitSet32(Uint32 x)
|
|
+{
|
|
+ if (x && !(x & (x - 1))) {
|
|
+ return SDL_TRUE;
|
|
+ }
|
|
+ return SDL_FALSE;
|
|
+}
|
|
+
|
|
/* Ends C function definitions when using C++ */
|
|
#ifdef __cplusplus
|
|
}
|
|
diff -r 144400e4630d -r 9091b20040cf src/SDL.c
|
|
--- a/src/SDL.c Sun Nov 18 19:28:20 2018 +0300
|
|
+++ b/src/SDL.c Mon Nov 19 21:17:00 2018 -0800
|
|
@@ -348,6 +348,12 @@
|
|
int num_subsystems = SDL_arraysize(SDL_SubsystemRefCount);
|
|
Uint32 initialized = 0;
|
|
|
|
+ /* Fast path for checking one flag */
|
|
+ if (SDL_HasExactlyOneBitSet32(flags)) {
|
|
+ int subsystem_index = SDL_MostSignificantBitIndex32(flags);
|
|
+ return SDL_SubsystemRefCount[subsystem_index] ? flags : 0;
|
|
+ }
|
|
+
|
|
if (!flags) {
|
|
flags = SDL_INIT_EVERYTHING;
|
|
}
|
|
diff -r 144400e4630d -r 9091b20040cf src/joystick/SDL_joystick.c
|
|
--- a/src/joystick/SDL_joystick.c Sun Nov 18 19:28:20 2018 +0300
|
|
+++ b/src/joystick/SDL_joystick.c Mon Nov 19 21:17:00 2018 -0800
|
|
@@ -1016,6 +1016,10 @@
|
|
int i;
|
|
SDL_Joystick *joystick;
|
|
|
|
+ if (!SDL_WasInit(SDL_INIT_JOYSTICK)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
SDL_LockJoysticks();
|
|
|
|
if (SDL_updating_joystick) {
|
|
diff -r 144400e4630d -r 9091b20040cf src/sensor/SDL_sensor.c
|
|
--- a/src/sensor/SDL_sensor.c Sun Nov 18 19:28:20 2018 +0300
|
|
+++ b/src/sensor/SDL_sensor.c Mon Nov 19 21:17:00 2018 -0800
|
|
@@ -505,6 +505,10 @@
|
|
int i;
|
|
SDL_Sensor *sensor;
|
|
|
|
+ if (!SDL_WasInit(SDL_INIT_SENSOR)) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
SDL_LockSensors();
|
|
|
|
if (SDL_updating_sensor) {
|
|
|