Rewrite SDL_DINPUT_JoystickPresent method to avoid costly IDirectInput8_CreateDevice calls

This commit is contained in:
Dimitriy Ryazantcev 2021-06-10 14:01:04 +03:00 committed by Sam Lantinga
parent a6da2fbf73
commit 766d81ec86

View File

@ -537,60 +537,28 @@ SDL_DINPUT_JoystickDetect(JoyStick_DeviceData **pContext)
IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, pContext, DIEDFL_ATTACHEDONLY); IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, pContext, DIEDFL_ATTACHEDONLY);
} }
typedef struct SDL_bool
SDL_DINPUT_JoystickPresent(Uint16 vendor_id, Uint16 product_id, Uint16 version_number)
{ {
Uint16 vendor; JoyStick_DeviceData* joystick = SYS_Joystick;
Uint16 product;
Uint16 version;
SDL_bool present;
} EnumJoystickPresentData;
static BOOL CALLBACK
EnumJoystickPresentCallback(LPCDIDEVICEINSTANCE pDeviceInstance, LPVOID pContext)
{
#define CHECK(exp) { if(!(exp)) goto err; }
EnumJoystickPresentData *data = (EnumJoystickPresentData *)pContext;
Uint16 vendor = 0; Uint16 vendor = 0;
Uint16 product = 0; Uint16 product = 0;
LPDIRECTINPUTDEVICE8 device = NULL; Uint16 version = 0;
BOOL ret = DIENUM_CONTINUE;
/* We are only supporting HID devices. */ while (joystick) {
CHECK((pDeviceInstance->dwDevType & DIDEVTYPE_HID) != 0); SDL_GetJoystickGUIDInfo(joystick->guid, &vendor, &product, &version);
CHECK(SUCCEEDED(IDirectInput8_CreateDevice(dinput, &pDeviceInstance->guidInstance, &device, NULL))); if (!joystick->bXInputDevice &&
CHECK(QueryDeviceInfo(device, &vendor, &product)); vendor == vendor_id &&
product == product_id &&
version == version_number) {
return SDL_TRUE;
}
CHECK(data->vendor == vendor && data->product == product); joystick = joystick->pNext;
data->present = SDL_TRUE;
ret = DIENUM_STOP;
err:
if (device) {
IDirectInputDevice8_Release(device);
} }
return ret; return SDL_FALSE;
#undef CHECK
}
SDL_bool
SDL_DINPUT_JoystickPresent(Uint16 vendor, Uint16 product, Uint16 version)
{
EnumJoystickPresentData data;
if (dinput == NULL) {
return SDL_FALSE;
}
data.vendor = vendor;
data.product = product;
data.version = version;
data.present = SDL_FALSE;
IDirectInput8_EnumDevices(dinput, DI8DEVCLASS_GAMECTRL, EnumJoystickPresentCallback, &data, DIEDFL_ATTACHEDONLY);
return data.present;
} }
static BOOL CALLBACK static BOOL CALLBACK