From 1b01a48ca20a79dfe6660110575573325730a1b1 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Wed, 4 Dec 2024 00:01:12 -0500 Subject: [PATCH 1/9] Created a separate PR for just merging emulation of the Xbox Controller S in addition to the Xbox Controller --- config_spec.yml | 4 + data/controller_mask_s.png | Bin 0 -> 65530 bytes data/meson.build | 1 + hw/xbox/meson.build | 1 + hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu | 1 + hw/xbox/xid-gamepad.c | 293 ++++++++++++++++++++ hw/xbox/xid.c | 280 +------------------ hw/xbox/xid.h | 137 +++++++++ subprojects/glslang | 1 + thirdparty/SPIRV-Reflect | 1 + thirdparty/VulkanMemoryAllocator | 1 + thirdparty/volk | 1 + ui/xemu-input.c | 44 ++- ui/xemu-input.h | 9 +- ui/xui/gl-helpers.cc | 185 +++++++++++- ui/xui/main-menu.cc | 43 +++ 16 files changed, 726 insertions(+), 276 deletions(-) create mode 100644 data/controller_mask_s.png create mode 160000 hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu create mode 100644 hw/xbox/xid-gamepad.c create mode 100644 hw/xbox/xid.h create mode 160000 subprojects/glslang create mode 160000 thirdparty/SPIRV-Reflect create mode 160000 thirdparty/VulkanMemoryAllocator create mode 160000 thirdparty/volk diff --git a/config_spec.yml b/config_spec.yml index b858606e685..31ee2d32bee 100644 --- a/config_spec.yml +++ b/config_spec.yml @@ -21,9 +21,13 @@ general: input: bindings: + port1_driver: string port1: string + port2_driver: string port2: string + port3_driver: string port3: string + port4_driver: string port4: string peripherals: port1: diff --git a/data/controller_mask_s.png b/data/controller_mask_s.png new file mode 100644 index 0000000000000000000000000000000000000000..98c3035341a85987646ba9f7165b8c53d8d5b2b4 GIT binary patch literal 65530 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%0Di`Hta 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/YuM=XtPZR7Dbq;D?PXquv6z*-8 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 literal 0 HcmV?d00001 diff --git a/data/meson.build b/data/meson.build index e1a7ebedf4e..bb2084bc1c3 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,5 +1,6 @@ pfiles = [ 'controller_mask.png', + 'controller_mask_s.png', 'xmu_mask.png', 'logo_sdf.png', 'xemu_64x64.png', diff --git a/hw/xbox/meson.build b/hw/xbox/meson.build index 907ebdc4e8a..6149e48e424 100644 --- a/hw/xbox/meson.build +++ b/hw/xbox/meson.build @@ -15,6 +15,7 @@ specific_ss.add(files( 'xbox.c', 'xbox_pci.c', 'xid.c', + 'xid-gamepad.c', )) subdir('nv2a') subdir('mcpx') diff --git a/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu b/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu new file mode 160000 index 00000000000..d5a7308809a --- /dev/null +++ b/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu @@ -0,0 +1 @@ +Subproject commit d5a7308809a80e1b01b5c016127d4f1b91c8673b diff --git a/hw/xbox/xid-gamepad.c b/hw/xbox/xid-gamepad.c new file mode 100644 index 00000000000..5e27e4912a9 --- /dev/null +++ b/hw/xbox/xid-gamepad.c @@ -0,0 +1,293 @@ +/* + * QEMU USB XID Devices + * + * Copyright (c) 2013 espes + * Copyright (c) 2017 Jannik Vogel + * Copyright (c) 2018-2021 Matt Borgerson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "xid.h" + +// #define DEBUG_XID +#ifdef DEBUG_XID +#define DPRINTF printf +#else +#define DPRINTF(...) +#endif + +#define USB_VENDOR_MICROSOFT 0x045e + +#define GAMEPAD_IN_ENDPOINT_ID 0x02 +#define GAMEPAD_OUT_ENDPOINT_ID 0x02 + +#define USB_XID(obj) \ + OBJECT_CHECK(USBXIDGamepadState, (obj), TYPE_USB_XID_GAMEPAD) +#define USB_XID_S(obj) \ + OBJECT_CHECK(USBXIDGamepadState, (obj), TYPE_USB_XID_GAMEPAD_S) + +static const USBDescIface desc_iface_xbox_gamepad = { + .bInterfaceNumber = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_XID, + .bInterfaceSubClass = 0x42, + .bInterfaceProtocol = 0x00, + .eps = + (USBDescEndpoint[]){ + { + .bEndpointAddress = USB_DIR_IN | GAMEPAD_IN_ENDPOINT_ID, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = 0x20, + .bInterval = 4, + }, + { + .bEndpointAddress = USB_DIR_OUT | GAMEPAD_OUT_ENDPOINT_ID, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = 0x20, + .bInterval = 4, + }, + }, +}; + +static const USBDescDevice desc_device_xbox_gamepad = { + .bcdUSB = 0x0110, + .bMaxPacketSize0 = 0x40, + .bNumConfigurations = 1, + .confs = + (USBDescConfig[]){ + { + .bNumInterfaces = 1, + .bConfigurationValue = 1, + .bmAttributes = USB_CFG_ATT_ONE, + .bMaxPower = 50, + .nif = 1, + .ifs = &desc_iface_xbox_gamepad, + }, + }, +}; + +static const USBDesc desc_xbox_gamepad = { + .id = { + .idVendor = USB_VENDOR_MICROSOFT, + .idProduct = 0x0202, + .bcdDevice = 0x0100, + .iManufacturer = STR_MANUFACTURER, + .iProduct = STR_PRODUCT, + .iSerialNumber = STR_SERIALNUMBER, + }, + .full = &desc_device_xbox_gamepad, + .str = desc_strings, +}; + +static const USBDesc desc_xbox_gamepad_s = { + .id = { + .idVendor = USB_VENDOR_MICROSOFT, + .idProduct = 0x0289, + .bcdDevice = 0x0100, + .iManufacturer = STR_MANUFACTURER, + .iProduct = STR_PRODUCT, + .iSerialNumber = STR_SERIALNUMBER, + }, + .full = &desc_device_xbox_gamepad, + .str = desc_strings, +}; + +static const XIDDesc desc_xid_xbox_gamepad = { + .bLength = 0x10, + .bDescriptorType = USB_DT_XID, + .bcdXid = 0x100, + .bType = XID_DEVICETYPE_GAMEPAD, + .bSubType = XID_DEVICESUBTYPE_GAMEPAD, + .bMaxInputReportSize = 20, + .bMaxOutputReportSize = 6, + .wAlternateProductIds = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, +}; + +static const XIDDesc desc_xid_xbox_gamepad_s = { + .bLength = 0x10, + .bDescriptorType = USB_DT_XID, + .bcdXid = 0x100, + .bType = XID_DEVICETYPE_GAMEPAD, + .bSubType = XID_DEVICESUBTYPE_GAMEPAD_S, + .bMaxInputReportSize = 20, + .bMaxOutputReportSize = 6, + .wAlternateProductIds = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, +}; + +static void usb_xid_gamepad_handle_data(USBDevice *dev, USBPacket *p) +{ + USBXIDGamepadState *s = DO_UPCAST(USBXIDGamepadState, dev, dev); + + DPRINTF("xid handle_gamepad_data 0x%x %d 0x%zx\n", p->pid, p->ep->nr, + p->iov.size); + + switch (p->pid) { + case USB_TOKEN_IN: + if (p->ep->nr == GAMEPAD_IN_ENDPOINT_ID) { + update_input(s); + usb_packet_copy(p, &s->in_state, s->in_state.bLength); + } else { + assert(false); + } + break; + case USB_TOKEN_OUT: + if (p->ep->nr == GAMEPAD_OUT_ENDPOINT_ID) { + usb_packet_copy(p, &s->out_state, s->out_state.length); + update_output(s); + } else { + assert(false); + } + break; + default: + p->status = USB_RET_STALL; + assert(false); + break; + } +} + +static void usb_xid_gamepad_class_initfn(ObjectClass *klass, void *data) +{ + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->handle_reset = usb_xid_handle_reset; + uc->handle_control = usb_xid_handle_control; + uc->handle_data = usb_xid_gamepad_handle_data; + // uc->handle_destroy = usb_xid_handle_destroy; + uc->handle_attach = usb_desc_attach; +} + +static void usb_xbox_gamepad_realize(USBDevice *dev, Error **errp) +{ + USBXIDGamepadState *s = USB_XID(dev); + usb_desc_create_serial(dev); + usb_desc_init(dev); + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 2); + + s->in_state.bLength = sizeof(s->in_state); + s->in_state.bReportId = 0; + + s->out_state.length = sizeof(s->out_state); + s->out_state.report_id = 0; + + s->xid_desc = &desc_xid_xbox_gamepad; + + memset(&s->in_state_capabilities, 0xFF, sizeof(s->in_state_capabilities)); + s->in_state_capabilities.bLength = sizeof(s->in_state_capabilities); + s->in_state_capabilities.bReportId = 0; + + memset(&s->out_state_capabilities, 0xFF, sizeof(s->out_state_capabilities)); + s->out_state_capabilities.length = sizeof(s->out_state_capabilities); + s->out_state_capabilities.report_id = 0; +} + +static void usb_xbox_gamepad_s_realize(USBDevice *dev, Error **errp) +{ + USBXIDGamepadState *s = USB_XID_S(dev); + usb_desc_create_serial(dev); + usb_desc_init(dev); + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 2); + + s->in_state.bLength = sizeof(s->in_state); + s->in_state.bReportId = 0; + + s->out_state.length = sizeof(s->out_state); + s->out_state.report_id = 0; + + s->xid_desc = &desc_xid_xbox_gamepad_s; + + memset(&s->in_state_capabilities, 0xFF, sizeof(s->in_state_capabilities)); + s->in_state_capabilities.bLength = sizeof(s->in_state_capabilities); + s->in_state_capabilities.bReportId = 0; + + memset(&s->out_state_capabilities, 0xFF, sizeof(s->out_state_capabilities)); + s->out_state_capabilities.length = sizeof(s->out_state_capabilities); + s->out_state_capabilities.report_id = 0; +} + +static Property xid_properties[] = { + DEFINE_PROP_UINT8("index", USBXIDGamepadState, device_index, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static const VMStateDescription vmstate_usb_xbox = { + .name = TYPE_USB_XID_GAMEPAD, + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]){ VMSTATE_USB_DEVICE(dev, USBXIDGamepadState), + // FIXME + VMSTATE_END_OF_LIST() }, +}; + +static const VMStateDescription vmstate_usb_xbox_s = { + .name = TYPE_USB_XID_GAMEPAD_S, + .minimum_version_id = 1, + .fields = (VMStateField[]){ VMSTATE_USB_DEVICE(dev, USBXIDGamepadState), + // FIXME + VMSTATE_END_OF_LIST() }, +}; + +static void usb_xbox_gamepad_class_initfn(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->product_desc = "Microsoft Xbox Controller"; + uc->usb_desc = &desc_xbox_gamepad; + uc->realize = usb_xbox_gamepad_realize; + uc->unrealize = usb_xbox_gamepad_unrealize; + usb_xid_gamepad_class_initfn(klass, data); + set_bit(DEVICE_CATEGORY_INPUT, dc->categories); + dc->vmsd = &vmstate_usb_xbox; + device_class_set_props(dc, xid_properties); + dc->desc = "Microsoft Xbox Controller"; +} + +static void usb_xbox_gamepad_s_class_initfn(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->product_desc = "Microsoft Xbox Controller S"; + uc->usb_desc = &desc_xbox_gamepad_s; + uc->realize = usb_xbox_gamepad_s_realize; + uc->unrealize = usb_xbox_gamepad_unrealize; + usb_xid_gamepad_class_initfn(klass, data); + set_bit(DEVICE_CATEGORY_INPUT, dc->categories); + dc->vmsd = &vmstate_usb_xbox_s; + device_class_set_props(dc, xid_properties); + dc->desc = "Microsoft Xbox Controller S"; +} + +static const TypeInfo usb_xbox_gamepad_info = { + .name = TYPE_USB_XID_GAMEPAD, + .parent = TYPE_USB_DEVICE, + .instance_size = sizeof(USBXIDGamepadState), + .class_init = usb_xbox_gamepad_class_initfn, +}; + +static const TypeInfo usb_xbox_gamepad_s_info = { + .name = TYPE_USB_XID_GAMEPAD_S, + .parent = TYPE_USB_DEVICE, + .instance_size = sizeof(USBXIDGamepadState), + .class_init = usb_xbox_gamepad_s_class_initfn, +}; + +static void usb_xid_register_types(void) +{ + type_register_static(&usb_xbox_gamepad_info); + type_register_static(&usb_xbox_gamepad_s_info); +} + +type_init(usb_xid_register_types) \ No newline at end of file diff --git a/hw/xbox/xid.c b/hw/xbox/xid.c index 86f34f7de28..c37142bc0d8 100644 --- a/hw/xbox/xid.c +++ b/hw/xbox/xid.c @@ -19,22 +19,7 @@ * License along with this library; if not, see . */ -#include "qemu/osdep.h" -#include "hw/qdev-properties.h" -#include "migration/vmstate.h" -#include "sysemu/sysemu.h" -#include "hw/hw.h" -#include "ui/console.h" -#include "hw/usb.h" -#include "hw/usb/desc.h" -#include "ui/xemu-input.h" - -//#define DEBUG_XID -#ifdef DEBUG_XID -#define DPRINTF printf -#else -#define DPRINTF(...) -#endif +#include "xid.h" /* * http://xbox-linux.cvs.sourceforge.net/viewvc/xbox-linux/kernel-2.6/drivers/usb/input/xpad.c @@ -42,156 +27,18 @@ * http://euc.jp/periphs/xbox-pad-desc.txt */ -#define USB_CLASS_XID 0x58 -#define USB_DT_XID 0x42 - -#define HID_GET_REPORT 0x01 -#define HID_SET_REPORT 0x09 -#define XID_GET_CAPABILITIES 0x01 - -#define TYPE_USB_XID "usb-xbox-gamepad" -#define USB_XID(obj) OBJECT_CHECK(USBXIDState, (obj), TYPE_USB_XID) - -enum { - STR_MANUFACTURER = 1, - STR_PRODUCT, - STR_SERIALNUMBER, -}; - typedef enum HapticEmulationMode { EMU_NONE, EMU_HAPTIC_LEFT_RIGHT } HapticEmulationMode; -static const USBDescStrings desc_strings = { +const USBDescStrings desc_strings = { [STR_MANUFACTURER] = "QEMU", [STR_PRODUCT] = "Microsoft Xbox Controller", [STR_SERIALNUMBER] = "1", }; -typedef struct XIDDesc { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdXid; - uint8_t bType; - uint8_t bSubType; - uint8_t bMaxInputReportSize; - uint8_t bMaxOutputReportSize; - uint16_t wAlternateProductIds[4]; -} QEMU_PACKED XIDDesc; - -typedef struct XIDGamepadReport { - uint8_t bReportId; - uint8_t bLength; - uint16_t wButtons; - uint8_t bAnalogButtons[8]; - int16_t sThumbLX; - int16_t sThumbLY; - int16_t sThumbRX; - int16_t sThumbRY; -} QEMU_PACKED XIDGamepadReport; - -typedef struct XIDGamepadOutputReport { - uint8_t report_id; //FIXME: is this correct? - uint8_t length; - uint16_t left_actuator_strength; - uint16_t right_actuator_strength; -} QEMU_PACKED XIDGamepadOutputReport; - -typedef struct USBXIDState { - USBDevice dev; - USBEndpoint *intr; - const XIDDesc *xid_desc; - XIDGamepadReport in_state; - XIDGamepadReport in_state_capabilities; - XIDGamepadOutputReport out_state; - XIDGamepadOutputReport out_state_capabilities; - uint8_t device_index; -} USBXIDState; - -static const USBDescIface desc_iface_xbox_gamepad = { - .bInterfaceNumber = 0, - .bNumEndpoints = 2, - .bInterfaceClass = USB_CLASS_XID, - .bInterfaceSubClass = 0x42, - .bInterfaceProtocol = 0x00, - .eps = (USBDescEndpoint[]) { - { - .bEndpointAddress = USB_DIR_IN | 0x02, - .bmAttributes = USB_ENDPOINT_XFER_INT, - .wMaxPacketSize = 0x20, - .bInterval = 4, - }, - { - .bEndpointAddress = USB_DIR_OUT | 0x02, - .bmAttributes = USB_ENDPOINT_XFER_INT, - .wMaxPacketSize = 0x20, - .bInterval = 4, - }, - }, -}; - -static const USBDescDevice desc_device_xbox_gamepad = { - .bcdUSB = 0x0110, - .bMaxPacketSize0 = 0x40, - .bNumConfigurations = 1, - .confs = (USBDescConfig[]) { - { - .bNumInterfaces = 1, - .bConfigurationValue = 1, - .bmAttributes = USB_CFG_ATT_ONE, - .bMaxPower = 50, - .nif = 1, - .ifs = &desc_iface_xbox_gamepad, - }, - }, -}; - -static const USBDesc desc_xbox_gamepad = { - .id = { - .idVendor = 0x045e, - .idProduct = 0x0202, - .bcdDevice = 0x0100, - .iManufacturer = STR_MANUFACTURER, - .iProduct = STR_PRODUCT, - .iSerialNumber = STR_SERIALNUMBER, - }, - .full = &desc_device_xbox_gamepad, - .str = desc_strings, -}; - -static const XIDDesc desc_xid_xbox_gamepad = { - .bLength = 0x10, - .bDescriptorType = USB_DT_XID, - .bcdXid = 0x100, - .bType = 1, - .bSubType = 1, - .bMaxInputReportSize = 20, - .bMaxOutputReportSize = 6, - .wAlternateProductIds = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, -}; - -#define GAMEPAD_A 0 -#define GAMEPAD_B 1 -#define GAMEPAD_X 2 -#define GAMEPAD_Y 3 -#define GAMEPAD_BLACK 4 -#define GAMEPAD_WHITE 5 -#define GAMEPAD_LEFT_TRIGGER 6 -#define GAMEPAD_RIGHT_TRIGGER 7 - -#define GAMEPAD_DPAD_UP 8 -#define GAMEPAD_DPAD_DOWN 9 -#define GAMEPAD_DPAD_LEFT 10 -#define GAMEPAD_DPAD_RIGHT 11 -#define GAMEPAD_START 12 -#define GAMEPAD_BACK 13 -#define GAMEPAD_LEFT_THUMB 14 -#define GAMEPAD_RIGHT_THUMB 15 - -#define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP)) - -static void update_output(USBXIDState *s) +void update_output(USBXIDGamepadState *s) { if (xemu_input_get_test_mode()) { // Don't report changes if we are testing the controller while running @@ -205,7 +52,7 @@ static void update_output(USBXIDState *s) xemu_input_update_rumble(state); } -static void update_input(USBXIDState *s) +void update_input(USBXIDGamepadState *s) { if (xemu_input_get_test_mode()) { // Don't report changes if we are testing the controller while running @@ -256,15 +103,15 @@ static void update_input(USBXIDState *s) s->in_state.sThumbRY = state->axis[CONTROLLER_AXIS_RSTICK_Y]; } -static void usb_xid_handle_reset(USBDevice *dev) +void usb_xid_handle_reset(USBDevice *dev) { DPRINTF("xid reset\n"); } -static void usb_xid_handle_control(USBDevice *dev, USBPacket *p, +void usb_xid_handle_control(USBDevice *dev, USBPacket *p, int request, int value, int index, int length, uint8_t *data) { - USBXIDState *s = (USBXIDState *)dev; + USBXIDGamepadState *s = (USBXIDGamepadState *)dev; DPRINTF("xid handle_control 0x%x 0x%x\n", request, value); @@ -368,36 +215,6 @@ static void usb_xid_handle_control(USBDevice *dev, USBPacket *p, } } -static void usb_xid_handle_data(USBDevice *dev, USBPacket *p) -{ - USBXIDState *s = DO_UPCAST(USBXIDState, dev, dev); - - DPRINTF("xid handle_data 0x%x %d 0x%zx\n", p->pid, p->ep->nr, p->iov.size); - - switch (p->pid) { - case USB_TOKEN_IN: - if (p->ep->nr == 2) { - update_input(s); - usb_packet_copy(p, &s->in_state, s->in_state.bLength); - } else { - assert(false); - } - break; - case USB_TOKEN_OUT: - if (p->ep->nr == 2) { - usb_packet_copy(p, &s->out_state, s->out_state.length); - update_output(s); - } else { - assert(false); - } - break; - default: - p->status = USB_RET_STALL; - assert(false); - break; - } -} - #if 0 static void usb_xid_handle_destroy(USBDevice *dev) { @@ -406,87 +223,6 @@ static void usb_xid_handle_destroy(USBDevice *dev) } #endif -static void usb_xbox_gamepad_unrealize(USBDevice *dev) -{ -} - -static void usb_xid_class_initfn(ObjectClass *klass, void *data) -{ - USBDeviceClass *uc = USB_DEVICE_CLASS(klass); - - uc->handle_reset = usb_xid_handle_reset; - uc->handle_control = usb_xid_handle_control; - uc->handle_data = usb_xid_handle_data; - // uc->handle_destroy = usb_xid_handle_destroy; - uc->handle_attach = usb_desc_attach; -} - -static void usb_xbox_gamepad_realize(USBDevice *dev, Error **errp) -{ - USBXIDState *s = USB_XID(dev); - usb_desc_create_serial(dev); - usb_desc_init(dev); - s->intr = usb_ep_get(dev, USB_TOKEN_IN, 2); - - s->in_state.bLength = sizeof(s->in_state); - s->in_state.bReportId = 0; - - s->out_state.length = sizeof(s->out_state); - s->out_state.report_id = 0; - - s->xid_desc = &desc_xid_xbox_gamepad; - - memset(&s->in_state_capabilities, 0xFF, sizeof(s->in_state_capabilities)); - s->in_state_capabilities.bLength = sizeof(s->in_state_capabilities); - s->in_state_capabilities.bReportId = 0; - - memset(&s->out_state_capabilities, 0xFF, sizeof(s->out_state_capabilities)); - s->out_state_capabilities.length = sizeof(s->out_state_capabilities); - s->out_state_capabilities.report_id = 0; -} - -static Property xid_properties[] = { - DEFINE_PROP_UINT8("index", USBXIDState, device_index, 0), - DEFINE_PROP_END_OF_LIST(), -}; - -static const VMStateDescription vmstate_usb_xbox = { - .name = TYPE_USB_XID, - .version_id = 1, - .minimum_version_id = 1, - .fields = (VMStateField[]) { - VMSTATE_USB_DEVICE(dev, USBXIDState), - // FIXME - VMSTATE_END_OF_LIST() - }, -}; - -static void usb_xbox_gamepad_class_initfn(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - USBDeviceClass *uc = USB_DEVICE_CLASS(klass); - - uc->product_desc = "Microsoft Xbox Controller"; - uc->usb_desc = &desc_xbox_gamepad; - uc->realize = usb_xbox_gamepad_realize; - uc->unrealize = usb_xbox_gamepad_unrealize; - usb_xid_class_initfn(klass, data); - set_bit(DEVICE_CATEGORY_INPUT, dc->categories); - dc->vmsd = &vmstate_usb_xbox; - device_class_set_props(dc, xid_properties); - dc->desc = "Microsoft Xbox Controller"; -} - -static const TypeInfo usb_xbox_gamepad_info = { - .name = TYPE_USB_XID, - .parent = TYPE_USB_DEVICE, - .instance_size = sizeof(USBXIDState), - .class_init = usb_xbox_gamepad_class_initfn, -}; - -static void usb_xid_register_types(void) +void usb_xbox_gamepad_unrealize(USBDevice *dev) { - type_register_static(&usb_xbox_gamepad_info); } - -type_init(usb_xid_register_types) diff --git a/hw/xbox/xid.h b/hw/xbox/xid.h new file mode 100644 index 00000000000..44406eaf912 --- /dev/null +++ b/hw/xbox/xid.h @@ -0,0 +1,137 @@ +#ifndef __XID_H__ +#define __XID_H__ + +/* + * QEMU USB XID Devices + * + * Copyright (c) 2013 espes + * Copyright (c) 2017 Jannik Vogel + * Copyright (c) 2018-2021 Matt Borgerson + * Copyright (c) 2023 Fred Hallock + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "hw/hw.h" +#include "hw/qdev-properties.h" +#include "hw/usb.h" +#include "hw/usb/desc.h" +#include "migration/vmstate.h" +#include "sysemu/sysemu.h" +#include "ui/console.h" +#include "ui/xemu-input.h" + +// #define DEBUG_XID +#ifdef DEBUG_XID +#define DPRINTF printf +#else +#define DPRINTF(...) +#endif + +#define USB_CLASS_XID 0x58 +#define USB_DT_XID 0x42 + +#define HID_GET_REPORT 0x01 +#define HID_SET_REPORT 0x09 +#define XID_GET_CAPABILITIES 0x01 + +#define XID_DEVICETYPE_GAMEPAD 0x01 + +#define XID_DEVICESUBTYPE_GAMEPAD 0x01 +#define XID_DEVICESUBTYPE_GAMEPAD_S 0x02 + +#define TYPE_USB_XID_GAMEPAD "usb-xbox-gamepad" +#define TYPE_USB_XID_GAMEPAD_S "usb-xbox-gamepad-s" + +#define GAMEPAD_A 0 +#define GAMEPAD_B 1 +#define GAMEPAD_X 2 +#define GAMEPAD_Y 3 +#define GAMEPAD_BLACK 4 +#define GAMEPAD_WHITE 5 +#define GAMEPAD_LEFT_TRIGGER 6 +#define GAMEPAD_RIGHT_TRIGGER 7 + +#define GAMEPAD_DPAD_UP 8 +#define GAMEPAD_DPAD_DOWN 9 +#define GAMEPAD_DPAD_LEFT 10 +#define GAMEPAD_DPAD_RIGHT 11 +#define GAMEPAD_START 12 +#define GAMEPAD_BACK 13 +#define GAMEPAD_LEFT_THUMB 14 +#define GAMEPAD_RIGHT_THUMB 15 + +#define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP)) + +enum { + STR_MANUFACTURER = 1, + STR_PRODUCT, + STR_SERIALNUMBER, +}; + +extern const USBDescStrings desc_strings; + +typedef struct XIDDesc { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdXid; + uint8_t bType; + uint8_t bSubType; + uint8_t bMaxInputReportSize; + uint8_t bMaxOutputReportSize; + uint16_t wAlternateProductIds[4]; +} QEMU_PACKED XIDDesc; + +typedef struct XIDGamepadReport { + uint8_t bReportId; + uint8_t bLength; + uint16_t wButtons; + uint8_t bAnalogButtons[8]; + int16_t sThumbLX; + int16_t sThumbLY; + int16_t sThumbRX; + int16_t sThumbRY; +} QEMU_PACKED XIDGamepadReport; + +typedef struct XIDGamepadOutputReport { + uint8_t report_id; // FIXME: is this correct? + uint8_t length; + uint16_t left_actuator_strength; + uint16_t right_actuator_strength; +} QEMU_PACKED XIDGamepadOutputReport; + +typedef struct USBXIDGamepadState { + USBDevice dev; + USBEndpoint *intr; + const XIDDesc *xid_desc; + XIDGamepadReport in_state; + XIDGamepadReport in_state_capabilities; + XIDGamepadOutputReport out_state; + XIDGamepadOutputReport out_state_capabilities; + uint8_t device_index; +} USBXIDGamepadState; + +void update_input(USBXIDGamepadState *s); +void update_output(USBXIDGamepadState *s); +void usb_xid_handle_reset(USBDevice *dev); +void usb_xid_handle_control(USBDevice *dev, USBPacket *p, int request, + int value, int index, int length, uint8_t *data); +void usb_xbox_gamepad_unrealize(USBDevice *dev); + +#if 0 +void usb_xid_handle_destroy(USBDevice *dev); +#endif + +#endif \ No newline at end of file diff --git a/subprojects/glslang b/subprojects/glslang new file mode 160000 index 00000000000..e8dd0b6903b --- /dev/null +++ b/subprojects/glslang @@ -0,0 +1 @@ +Subproject commit e8dd0b6903b34f1879520b444634c75ea2deedf5 diff --git a/thirdparty/SPIRV-Reflect b/thirdparty/SPIRV-Reflect new file mode 160000 index 00000000000..1d674a82d7e --- /dev/null +++ b/thirdparty/SPIRV-Reflect @@ -0,0 +1 @@ +Subproject commit 1d674a82d7e102ed0c02e64e036827db9e8b1a71 diff --git a/thirdparty/VulkanMemoryAllocator b/thirdparty/VulkanMemoryAllocator new file mode 160000 index 00000000000..009ecd192c1 --- /dev/null +++ b/thirdparty/VulkanMemoryAllocator @@ -0,0 +1 @@ +Subproject commit 009ecd192c1289c7529bff248a16cfe896254816 diff --git a/thirdparty/volk b/thirdparty/volk new file mode 160000 index 00000000000..466085407d5 --- /dev/null +++ b/thirdparty/volk @@ -0,0 +1 @@ +Subproject commit 466085407d5d2f50583fd663c1d65f93a7709d3e diff --git a/ui/xemu-input.c b/ui/xemu-input.c index d9181fe2a62..efe1b5dfa44 100644 --- a/ui/xemu-input.c +++ b/ui/xemu-input.c @@ -86,6 +86,8 @@ static void xemu_input_print_controller_state(ControllerState *state) ControllerStateList available_controllers = QTAILQ_HEAD_INITIALIZER(available_controllers); ControllerState *bound_controllers[4] = { NULL, NULL, NULL, NULL }; +const char *bound_drivers[4] = { DRIVER_DUKE, DRIVER_DUKE, DRIVER_DUKE, + DRIVER_DUKE }; int test_mode; static const char **port_index_to_settings_key_map[] = { @@ -95,6 +97,13 @@ static const char **port_index_to_settings_key_map[] = { &g_config.input.bindings.port4, }; +static const char **port_index_to_driver_settings_key_map[] = { + &g_config.input.bindings.port1_driver, + &g_config.input.bindings.port2_driver, + &g_config.input.bindings.port3_driver, + &g_config.input.bindings.port4_driver +}; + static int *peripheral_types_settings_map[4][2] = { { &g_config.input.peripherals.port1.peripheral_type_0, &g_config.input.peripherals.port1.peripheral_type_1 }, @@ -119,6 +128,37 @@ static const char **peripheral_params_settings_map[4][2] = { static int sdl_kbd_scancode_map[25]; +static const char *get_bound_driver(int port) +{ + assert(port >= 0 && port <= 3); + const char *driver = NULL; + switch (port) { + case 0: + driver = g_config.input.bindings.port1_driver; + break; + case 1: + driver = g_config.input.bindings.port2_driver; + break; + case 2: + driver = g_config.input.bindings.port3_driver; + break; + case 3: + driver = g_config.input.bindings.port4_driver; + break; + } + if (driver == NULL) + return DRIVER_DUKE; // Shouldn't be possible + if (strlen(driver) == 0) + return DRIVER_DUKE; + if (strcmp(driver, DRIVER_DUKE) == 0) + return DRIVER_DUKE; + if (strcmp(driver, DRIVER_S) == 0) + return DRIVER_S; + + // Shouldn't be possible + return DRIVER_DUKE; +} + static const int port_map[4] = { 3, 4, 1, 2 }; void xemu_input_init(void) @@ -520,6 +560,8 @@ void xemu_input_bind(int index, ControllerState *state, int save) } } xemu_settings_set_string(port_index_to_settings_key_map[index], guid_buf); + xemu_settings_set_string(port_index_to_driver_settings_key_map[index], + bound_drivers[index]); } // Bind new controller @@ -548,7 +590,7 @@ void xemu_input_bind(int index, ControllerState *state, int save) QDict *qdict = qdict_new(); // Specify device driver - qdict_put_str(qdict, "driver", "usb-xbox-gamepad"); + qdict_put_str(qdict, "driver", bound_drivers[index]); // Specify device identifier static int id_counter = 0; diff --git a/ui/xemu-input.h b/ui/xemu-input.h index 330ae58a7c1..f0e7b3b6e31 100644 --- a/ui/xemu-input.h +++ b/ui/xemu-input.h @@ -30,6 +30,12 @@ #include "qemu/queue.h" +#define DRIVER_DUKE "usb-xbox-gamepad" +#define DRIVER_S "usb-xbox-gamepad-s" + +#define DRIVER_DUKE_DISPLAY_NAME "Xbox Controller" +#define DRIVER_S_DISPLAY_NAME "Xbox Controller S" + enum controller_state_buttons_mask { CONTROLLER_BUTTON_A = (1 << 0), CONTROLLER_BUTTON_B = (1 << 1), @@ -81,7 +87,7 @@ typedef struct ControllerState { // Input state uint16_t buttons; int16_t axis[CONTROLLER_AXIS__COUNT]; - + // Rendering state hacked on here for convenience but needs to be moved (FIXME) uint32_t animate_guide_button_end; uint32_t animate_trigger_end; @@ -107,6 +113,7 @@ typedef struct ControllerState { typedef QTAILQ_HEAD(, ControllerState) ControllerStateList; extern ControllerStateList available_controllers; extern ControllerState *bound_controllers[4]; +extern const char *bound_drivers[4]; #ifdef __cplusplus extern "C" { diff --git a/ui/xui/gl-helpers.cc b/ui/xui/gl-helpers.cc index 6c07d087b41..b1646a13537 100644 --- a/ui/xui/gl-helpers.cc +++ b/ui/xui/gl-helpers.cc @@ -20,6 +20,7 @@ #include "gl-helpers.hh" #include "common.hh" #include "data/controller_mask.png.h" +#include "data/controller_mask_s.png.h" #include "data/logo_sdf.png.h" #include "data/xemu_64x64.png.h" #include "data/xmu_mask.png.h" @@ -33,7 +34,7 @@ #include "ui/shader/xemu-logo-frag.h" Fbo *controller_fbo, *xmu_fbo, *logo_fbo; -GLuint g_controller_tex, g_logo_tex, g_icon_tex, g_xmu_tex; +GLuint g_controller_tex, g_controller_s_tex, g_logo_tex, g_icon_tex, g_xmu_tex; enum class ShaderType { Blit, @@ -441,6 +442,8 @@ void InitCustomRendering(void) glActiveTexture(GL_TEXTURE0); g_controller_tex = LoadTextureFromMemory(controller_mask_data, controller_mask_size); + g_controller_s_tex = + LoadTextureFromMemory(controller_mask_s_data, controller_mask_s_size); g_decal_shader = NewDecalShader(ShaderType::Mask); controller_fbo = new Fbo(512, 512); @@ -464,7 +467,7 @@ static void RenderMeter(DecalShader *s, float x, float y, float width, RenderDecal(s, x, y, width * p, height, 0, 0, 1, 1, 0, 0, color_fg); } -void RenderController(float frame_x, float frame_y, uint32_t primary_color, +static void RenderController_Duke(float frame_x, float frame_y, uint32_t primary_color, uint32_t secondary_color, ControllerState *state) { // Location within the controller texture of masked button locations, @@ -623,6 +626,184 @@ void RenderController(float frame_x, float frame_y, uint32_t primary_color, glUseProgram(0); } +static void RenderController_S(float frame_x, float frame_y, uint32_t primary_color, + uint32_t secondary_color, ControllerState *state) +{ + // Location within the controller texture of masked button locations, + // relative to the origin of the controller + const struct rect jewel = { 194, 213, 84, 84 }; + const struct rect lstick_ctr = { 103, 254, 0, 0 }; + const struct rect rstick_ctr = { 295, 176, 0, 0 }; + const struct rect buttons[12] = { + { 347, 200, 34, 34 }, // A + { 381, 235, 34, 34 }, // B + { 313, 235, 34, 34 }, // X + { 347, 270, 34, 34 }, // Y + { 123, 165, 31, 26 }, // D-Left + { 150, 187, 26, 31 }, // D-Up + { 173, 165, 31, 26 }, // D-Right + { 150, 135, 26, 31 }, // D-Down + { 45, 195, 20, 24 }, // Back + { 70, 163, 26, 26 }, // Start + { 352, 145, 30, 30 }, // White + { 388, 172, 30, 30 }, // Black + }; + + uint8_t alpha = 0; + uint32_t now = SDL_GetTicks(); + float t; + + glUseProgram(g_decal_shader->prog); + glBindVertexArray(g_decal_shader->vao); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_controller_s_tex); + + // Add a 5 pixel space around the controller so we can wiggle the controller + // around to visualize rumble in action + frame_x += 5; + frame_y += 5; + float original_frame_x = frame_x; + float original_frame_y = frame_y; + + // Floating point versions that will get scaled + float rumble_l = 0; + float rumble_r = 0; + + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ZERO); + + uint32_t jewel_color = secondary_color; + + // Check to see if the guide button is pressed + const uint32_t animate_guide_button_duration = 2000; + if (state->buttons & CONTROLLER_BUTTON_GUIDE) { + state->animate_guide_button_end = + now + animate_guide_button_duration; + } + + if (now < state->animate_guide_button_end) { + t = 1.0f - (float)(state->animate_guide_button_end - now) / + (float)animate_guide_button_duration; + float sin_wav = (1 - sin(M_PI * t / 2.0f)); + + // Animate guide button by highlighting logo jewel and fading out over + // time + alpha = sin_wav * 255.0f; + jewel_color = primary_color + alpha; + + // Add a little extra flare: wiggle the frame around while we rumble + frame_x += ((float)(rand() % 5) - 2.5) * (1 - t); + frame_y += ((float)(rand() % 5) - 2.5) * (1 - t); + rumble_l = rumble_r = sin_wav; + } + + // Render controller texture + RenderDecal(g_decal_shader, frame_x + 0, frame_y + 0, + tex_items[obj_controller].w, tex_items[obj_controller].h, + tex_items[obj_controller].x, tex_items[obj_controller].y, + tex_items[obj_controller].w, tex_items[obj_controller].h, + primary_color, secondary_color, 0); + + glBlendFunc(GL_ONE_MINUS_DST_ALPHA, + GL_ONE); // Blend with controller cutouts + RenderDecal(g_decal_shader, frame_x + jewel.x, frame_y + jewel.y, jewel.w, + jewel.h, 0, 0, 1, 1, 0, 0, jewel_color); + + // The controller has alpha cutouts where the buttons are. Draw a surface + // behind the buttons if they are activated + for (int i = 0; i < 12; i++) { + if (state->buttons & (1 << i)) { + RenderDecal(g_decal_shader, frame_x + buttons[i].x, + frame_y + buttons[i].y, buttons[i].w, buttons[i].h, 0, + 0, 1, 1, 0, 0, primary_color + 0xff); + } + } + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Blend with controller + + // Render left thumbstick + float w = tex_items[obj_lstick].w; + float h = tex_items[obj_lstick].h; + float c_x = frame_x + lstick_ctr.x; + float c_y = frame_y + lstick_ctr.y; + float lstick_x = (float)state->axis[CONTROLLER_AXIS_LSTICK_X] / 32768.0; + float lstick_y = (float)state->axis[CONTROLLER_AXIS_LSTICK_Y] / 32768.0; + RenderDecal( + g_decal_shader, (int)(c_x - w / 2.0f + 10.0f * lstick_x), + (int)(c_y - h / 2.0f + 10.0f * lstick_y), w, h, tex_items[obj_lstick].x, + tex_items[obj_lstick].y, w, h, + (state->buttons & CONTROLLER_BUTTON_LSTICK) ? secondary_color : + primary_color, + (state->buttons & CONTROLLER_BUTTON_LSTICK) ? primary_color : + secondary_color, + 0); + + // Render right thumbstick + w = tex_items[obj_rstick].w; + h = tex_items[obj_rstick].h; + c_x = frame_x + rstick_ctr.x; + c_y = frame_y + rstick_ctr.y; + float rstick_x = (float)state->axis[CONTROLLER_AXIS_RSTICK_X] / 32768.0; + float rstick_y = (float)state->axis[CONTROLLER_AXIS_RSTICK_Y] / 32768.0; + RenderDecal( + g_decal_shader, (int)(c_x - w / 2.0f + 10.0f * rstick_x), + (int)(c_y - h / 2.0f + 10.0f * rstick_y), w, h, tex_items[obj_rstick].x, + tex_items[obj_rstick].y, w, h, + (state->buttons & CONTROLLER_BUTTON_RSTICK) ? secondary_color : + primary_color, + (state->buttons & CONTROLLER_BUTTON_RSTICK) ? primary_color : + secondary_color, + 0); + + glBlendFunc(GL_ONE, + GL_ZERO); // Don't blend, just overwrite values in buffer + + // Render trigger bars + float ltrig = state->axis[CONTROLLER_AXIS_LTRIG] / 32767.0; + float rtrig = state->axis[CONTROLLER_AXIS_RTRIG] / 32767.0; + const uint32_t animate_trigger_duration = 1000; + if ((ltrig > 0) || (rtrig > 0)) { + state->animate_trigger_end = now + animate_trigger_duration; + rumble_l = fmax(rumble_l, ltrig); + rumble_r = fmax(rumble_r, rtrig); + } + + // Animate trigger alpha down after a period of inactivity + alpha = 0x80; + if (state->animate_trigger_end > now) { + t = 1.0f - (float)(state->animate_trigger_end - now) / + (float)animate_trigger_duration; + float sin_wav = (1 - sin(M_PI * t / 2.0f)); + alpha += fmin(sin_wav * 0x40, 0x80); + } + + RenderMeter(g_decal_shader, original_frame_x + 10, + original_frame_y + tex_items[obj_controller].h + 20, 150, 5, + ltrig, primary_color + alpha, primary_color + 0xff); + RenderMeter(g_decal_shader, + original_frame_x + tex_items[obj_controller].w - 160, + original_frame_y + tex_items[obj_controller].h + 20, 150, 5, + rtrig, primary_color + alpha, primary_color + 0xff); + + // Apply rumble updates + state->rumble_l = (int)(rumble_l * (float)0xffff); + state->rumble_r = (int)(rumble_r * (float)0xffff); + + glBindVertexArray(0); + glUseProgram(0); +} + +void RenderController(float frame_x, float frame_y, uint32_t primary_color, + uint32_t secondary_color, ControllerState *state) +{ + if (strcmp(bound_drivers[state->bound], DRIVER_S) == 0) + RenderController_S(frame_x, frame_y, primary_color, secondary_color, + state); + else if (strcmp(bound_drivers[state->bound], DRIVER_DUKE) == 0) + RenderController_Duke(frame_x, frame_y, primary_color, secondary_color, + state); +} + void RenderControllerPort(float frame_x, float frame_y, int i, uint32_t port_color) { diff --git a/ui/xui/main-menu.cc b/ui/xui/main-menu.cc index 75b88cafb6e..947d6047313 100644 --- a/ui/xui/main-menu.cc +++ b/ui/xui/main-menu.cc @@ -158,6 +158,49 @@ void MainMenuInputView::Draw() ImGui::PopStyleVar(); // ItemSpacing ImGui::Columns(1); + // + // Render device driver combo + // + + // List available device drivers + const char *driver = bound_drivers[active]; + + if (strcmp(driver, DRIVER_DUKE) == 0) + driver = DRIVER_DUKE_DISPLAY_NAME; + else if (strcmp(driver, DRIVER_S) == 0) + driver = DRIVER_S_DISPLAY_NAME; + + ImGui::SetNextItemWidth(-FLT_MIN); + if (ImGui::BeginCombo("###InputDrivers", driver, + ImGuiComboFlags_NoArrowButton)) { + const char *available_drivers[] = { DRIVER_DUKE, DRIVER_S }; + const char *driver_display_names[] = { + DRIVER_DUKE_DISPLAY_NAME, + DRIVER_S_DISPLAY_NAME + }; + bool is_selected = false; + int num_drivers = sizeof(driver_display_names) / sizeof(driver_display_names[0]); + for (int i = 0; i < num_drivers; i++) { + const char *iter = driver_display_names[i]; + is_selected = strcmp(driver, iter) == 0; + ImGui::PushID(iter); + if (ImGui::Selectable(iter, is_selected)) { + for (int j = 0; j < num_drivers; j++) { + if (iter == driver_display_names[j]) + bound_drivers[active] = available_drivers[j]; + } + xemu_input_bind(active, bound_controllers[active], 1); + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + DrawComboChevron(); + // // Render input device combo // From 9e05b66dee32c7ccf858585c6a15b266ce67f129 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Wed, 4 Dec 2024 00:01:12 -0500 Subject: [PATCH 2/9] Created a separate PR for just merging emulation of the Xbox Controller S in addition to the Xbox Controller --- config_spec.yml | 4 + data/controller_mask_s.png | Bin 0 -> 65530 bytes data/meson.build | 1 + hw/xbox/meson.build | 1 + hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu | 1 + hw/xbox/xid-gamepad.c | 293 ++++++++++++++++++++ hw/xbox/xid.c | 280 +------------------ hw/xbox/xid.h | 137 +++++++++ subprojects/glslang | 1 + thirdparty/SPIRV-Reflect | 1 + thirdparty/VulkanMemoryAllocator | 1 + thirdparty/volk | 1 + ui/xemu-input.c | 44 ++- ui/xemu-input.h | 9 +- ui/xui/gl-helpers.cc | 185 +++++++++++- ui/xui/main-menu.cc | 43 +++ 16 files changed, 726 insertions(+), 276 deletions(-) create mode 100644 data/controller_mask_s.png create mode 160000 hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu create mode 100644 hw/xbox/xid-gamepad.c create mode 100644 hw/xbox/xid.h create mode 160000 subprojects/glslang create mode 160000 thirdparty/SPIRV-Reflect create mode 160000 thirdparty/VulkanMemoryAllocator create mode 160000 thirdparty/volk diff --git a/config_spec.yml b/config_spec.yml index b858606e685..31ee2d32bee 100644 --- a/config_spec.yml +++ b/config_spec.yml @@ -21,9 +21,13 @@ general: input: bindings: + port1_driver: string port1: string + port2_driver: string port2: string + port3_driver: string port3: string + port4_driver: string port4: string peripherals: port1: diff --git a/data/controller_mask_s.png b/data/controller_mask_s.png new file mode 100644 index 0000000000000000000000000000000000000000..98c3035341a85987646ba9f7165b8c53d8d5b2b4 GIT binary patch literal 65530 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%0Di`Hta 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/YuM=XtPZR7Dbq;D?PXquv6z*-8 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 literal 0 HcmV?d00001 diff --git a/data/meson.build b/data/meson.build index e1a7ebedf4e..bb2084bc1c3 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,5 +1,6 @@ pfiles = [ 'controller_mask.png', + 'controller_mask_s.png', 'xmu_mask.png', 'logo_sdf.png', 'xemu_64x64.png', diff --git a/hw/xbox/meson.build b/hw/xbox/meson.build index 907ebdc4e8a..6149e48e424 100644 --- a/hw/xbox/meson.build +++ b/hw/xbox/meson.build @@ -15,6 +15,7 @@ specific_ss.add(files( 'xbox.c', 'xbox_pci.c', 'xid.c', + 'xid-gamepad.c', )) subdir('nv2a') subdir('mcpx') diff --git a/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu b/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu new file mode 160000 index 00000000000..d5a7308809a --- /dev/null +++ b/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu @@ -0,0 +1 @@ +Subproject commit d5a7308809a80e1b01b5c016127d4f1b91c8673b diff --git a/hw/xbox/xid-gamepad.c b/hw/xbox/xid-gamepad.c new file mode 100644 index 00000000000..5e27e4912a9 --- /dev/null +++ b/hw/xbox/xid-gamepad.c @@ -0,0 +1,293 @@ +/* + * QEMU USB XID Devices + * + * Copyright (c) 2013 espes + * Copyright (c) 2017 Jannik Vogel + * Copyright (c) 2018-2021 Matt Borgerson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "xid.h" + +// #define DEBUG_XID +#ifdef DEBUG_XID +#define DPRINTF printf +#else +#define DPRINTF(...) +#endif + +#define USB_VENDOR_MICROSOFT 0x045e + +#define GAMEPAD_IN_ENDPOINT_ID 0x02 +#define GAMEPAD_OUT_ENDPOINT_ID 0x02 + +#define USB_XID(obj) \ + OBJECT_CHECK(USBXIDGamepadState, (obj), TYPE_USB_XID_GAMEPAD) +#define USB_XID_S(obj) \ + OBJECT_CHECK(USBXIDGamepadState, (obj), TYPE_USB_XID_GAMEPAD_S) + +static const USBDescIface desc_iface_xbox_gamepad = { + .bInterfaceNumber = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_XID, + .bInterfaceSubClass = 0x42, + .bInterfaceProtocol = 0x00, + .eps = + (USBDescEndpoint[]){ + { + .bEndpointAddress = USB_DIR_IN | GAMEPAD_IN_ENDPOINT_ID, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = 0x20, + .bInterval = 4, + }, + { + .bEndpointAddress = USB_DIR_OUT | GAMEPAD_OUT_ENDPOINT_ID, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = 0x20, + .bInterval = 4, + }, + }, +}; + +static const USBDescDevice desc_device_xbox_gamepad = { + .bcdUSB = 0x0110, + .bMaxPacketSize0 = 0x40, + .bNumConfigurations = 1, + .confs = + (USBDescConfig[]){ + { + .bNumInterfaces = 1, + .bConfigurationValue = 1, + .bmAttributes = USB_CFG_ATT_ONE, + .bMaxPower = 50, + .nif = 1, + .ifs = &desc_iface_xbox_gamepad, + }, + }, +}; + +static const USBDesc desc_xbox_gamepad = { + .id = { + .idVendor = USB_VENDOR_MICROSOFT, + .idProduct = 0x0202, + .bcdDevice = 0x0100, + .iManufacturer = STR_MANUFACTURER, + .iProduct = STR_PRODUCT, + .iSerialNumber = STR_SERIALNUMBER, + }, + .full = &desc_device_xbox_gamepad, + .str = desc_strings, +}; + +static const USBDesc desc_xbox_gamepad_s = { + .id = { + .idVendor = USB_VENDOR_MICROSOFT, + .idProduct = 0x0289, + .bcdDevice = 0x0100, + .iManufacturer = STR_MANUFACTURER, + .iProduct = STR_PRODUCT, + .iSerialNumber = STR_SERIALNUMBER, + }, + .full = &desc_device_xbox_gamepad, + .str = desc_strings, +}; + +static const XIDDesc desc_xid_xbox_gamepad = { + .bLength = 0x10, + .bDescriptorType = USB_DT_XID, + .bcdXid = 0x100, + .bType = XID_DEVICETYPE_GAMEPAD, + .bSubType = XID_DEVICESUBTYPE_GAMEPAD, + .bMaxInputReportSize = 20, + .bMaxOutputReportSize = 6, + .wAlternateProductIds = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, +}; + +static const XIDDesc desc_xid_xbox_gamepad_s = { + .bLength = 0x10, + .bDescriptorType = USB_DT_XID, + .bcdXid = 0x100, + .bType = XID_DEVICETYPE_GAMEPAD, + .bSubType = XID_DEVICESUBTYPE_GAMEPAD_S, + .bMaxInputReportSize = 20, + .bMaxOutputReportSize = 6, + .wAlternateProductIds = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, +}; + +static void usb_xid_gamepad_handle_data(USBDevice *dev, USBPacket *p) +{ + USBXIDGamepadState *s = DO_UPCAST(USBXIDGamepadState, dev, dev); + + DPRINTF("xid handle_gamepad_data 0x%x %d 0x%zx\n", p->pid, p->ep->nr, + p->iov.size); + + switch (p->pid) { + case USB_TOKEN_IN: + if (p->ep->nr == GAMEPAD_IN_ENDPOINT_ID) { + update_input(s); + usb_packet_copy(p, &s->in_state, s->in_state.bLength); + } else { + assert(false); + } + break; + case USB_TOKEN_OUT: + if (p->ep->nr == GAMEPAD_OUT_ENDPOINT_ID) { + usb_packet_copy(p, &s->out_state, s->out_state.length); + update_output(s); + } else { + assert(false); + } + break; + default: + p->status = USB_RET_STALL; + assert(false); + break; + } +} + +static void usb_xid_gamepad_class_initfn(ObjectClass *klass, void *data) +{ + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->handle_reset = usb_xid_handle_reset; + uc->handle_control = usb_xid_handle_control; + uc->handle_data = usb_xid_gamepad_handle_data; + // uc->handle_destroy = usb_xid_handle_destroy; + uc->handle_attach = usb_desc_attach; +} + +static void usb_xbox_gamepad_realize(USBDevice *dev, Error **errp) +{ + USBXIDGamepadState *s = USB_XID(dev); + usb_desc_create_serial(dev); + usb_desc_init(dev); + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 2); + + s->in_state.bLength = sizeof(s->in_state); + s->in_state.bReportId = 0; + + s->out_state.length = sizeof(s->out_state); + s->out_state.report_id = 0; + + s->xid_desc = &desc_xid_xbox_gamepad; + + memset(&s->in_state_capabilities, 0xFF, sizeof(s->in_state_capabilities)); + s->in_state_capabilities.bLength = sizeof(s->in_state_capabilities); + s->in_state_capabilities.bReportId = 0; + + memset(&s->out_state_capabilities, 0xFF, sizeof(s->out_state_capabilities)); + s->out_state_capabilities.length = sizeof(s->out_state_capabilities); + s->out_state_capabilities.report_id = 0; +} + +static void usb_xbox_gamepad_s_realize(USBDevice *dev, Error **errp) +{ + USBXIDGamepadState *s = USB_XID_S(dev); + usb_desc_create_serial(dev); + usb_desc_init(dev); + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 2); + + s->in_state.bLength = sizeof(s->in_state); + s->in_state.bReportId = 0; + + s->out_state.length = sizeof(s->out_state); + s->out_state.report_id = 0; + + s->xid_desc = &desc_xid_xbox_gamepad_s; + + memset(&s->in_state_capabilities, 0xFF, sizeof(s->in_state_capabilities)); + s->in_state_capabilities.bLength = sizeof(s->in_state_capabilities); + s->in_state_capabilities.bReportId = 0; + + memset(&s->out_state_capabilities, 0xFF, sizeof(s->out_state_capabilities)); + s->out_state_capabilities.length = sizeof(s->out_state_capabilities); + s->out_state_capabilities.report_id = 0; +} + +static Property xid_properties[] = { + DEFINE_PROP_UINT8("index", USBXIDGamepadState, device_index, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static const VMStateDescription vmstate_usb_xbox = { + .name = TYPE_USB_XID_GAMEPAD, + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]){ VMSTATE_USB_DEVICE(dev, USBXIDGamepadState), + // FIXME + VMSTATE_END_OF_LIST() }, +}; + +static const VMStateDescription vmstate_usb_xbox_s = { + .name = TYPE_USB_XID_GAMEPAD_S, + .minimum_version_id = 1, + .fields = (VMStateField[]){ VMSTATE_USB_DEVICE(dev, USBXIDGamepadState), + // FIXME + VMSTATE_END_OF_LIST() }, +}; + +static void usb_xbox_gamepad_class_initfn(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->product_desc = "Microsoft Xbox Controller"; + uc->usb_desc = &desc_xbox_gamepad; + uc->realize = usb_xbox_gamepad_realize; + uc->unrealize = usb_xbox_gamepad_unrealize; + usb_xid_gamepad_class_initfn(klass, data); + set_bit(DEVICE_CATEGORY_INPUT, dc->categories); + dc->vmsd = &vmstate_usb_xbox; + device_class_set_props(dc, xid_properties); + dc->desc = "Microsoft Xbox Controller"; +} + +static void usb_xbox_gamepad_s_class_initfn(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + USBDeviceClass *uc = USB_DEVICE_CLASS(klass); + + uc->product_desc = "Microsoft Xbox Controller S"; + uc->usb_desc = &desc_xbox_gamepad_s; + uc->realize = usb_xbox_gamepad_s_realize; + uc->unrealize = usb_xbox_gamepad_unrealize; + usb_xid_gamepad_class_initfn(klass, data); + set_bit(DEVICE_CATEGORY_INPUT, dc->categories); + dc->vmsd = &vmstate_usb_xbox_s; + device_class_set_props(dc, xid_properties); + dc->desc = "Microsoft Xbox Controller S"; +} + +static const TypeInfo usb_xbox_gamepad_info = { + .name = TYPE_USB_XID_GAMEPAD, + .parent = TYPE_USB_DEVICE, + .instance_size = sizeof(USBXIDGamepadState), + .class_init = usb_xbox_gamepad_class_initfn, +}; + +static const TypeInfo usb_xbox_gamepad_s_info = { + .name = TYPE_USB_XID_GAMEPAD_S, + .parent = TYPE_USB_DEVICE, + .instance_size = sizeof(USBXIDGamepadState), + .class_init = usb_xbox_gamepad_s_class_initfn, +}; + +static void usb_xid_register_types(void) +{ + type_register_static(&usb_xbox_gamepad_info); + type_register_static(&usb_xbox_gamepad_s_info); +} + +type_init(usb_xid_register_types) \ No newline at end of file diff --git a/hw/xbox/xid.c b/hw/xbox/xid.c index 86f34f7de28..c37142bc0d8 100644 --- a/hw/xbox/xid.c +++ b/hw/xbox/xid.c @@ -19,22 +19,7 @@ * License along with this library; if not, see . */ -#include "qemu/osdep.h" -#include "hw/qdev-properties.h" -#include "migration/vmstate.h" -#include "sysemu/sysemu.h" -#include "hw/hw.h" -#include "ui/console.h" -#include "hw/usb.h" -#include "hw/usb/desc.h" -#include "ui/xemu-input.h" - -//#define DEBUG_XID -#ifdef DEBUG_XID -#define DPRINTF printf -#else -#define DPRINTF(...) -#endif +#include "xid.h" /* * http://xbox-linux.cvs.sourceforge.net/viewvc/xbox-linux/kernel-2.6/drivers/usb/input/xpad.c @@ -42,156 +27,18 @@ * http://euc.jp/periphs/xbox-pad-desc.txt */ -#define USB_CLASS_XID 0x58 -#define USB_DT_XID 0x42 - -#define HID_GET_REPORT 0x01 -#define HID_SET_REPORT 0x09 -#define XID_GET_CAPABILITIES 0x01 - -#define TYPE_USB_XID "usb-xbox-gamepad" -#define USB_XID(obj) OBJECT_CHECK(USBXIDState, (obj), TYPE_USB_XID) - -enum { - STR_MANUFACTURER = 1, - STR_PRODUCT, - STR_SERIALNUMBER, -}; - typedef enum HapticEmulationMode { EMU_NONE, EMU_HAPTIC_LEFT_RIGHT } HapticEmulationMode; -static const USBDescStrings desc_strings = { +const USBDescStrings desc_strings = { [STR_MANUFACTURER] = "QEMU", [STR_PRODUCT] = "Microsoft Xbox Controller", [STR_SERIALNUMBER] = "1", }; -typedef struct XIDDesc { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdXid; - uint8_t bType; - uint8_t bSubType; - uint8_t bMaxInputReportSize; - uint8_t bMaxOutputReportSize; - uint16_t wAlternateProductIds[4]; -} QEMU_PACKED XIDDesc; - -typedef struct XIDGamepadReport { - uint8_t bReportId; - uint8_t bLength; - uint16_t wButtons; - uint8_t bAnalogButtons[8]; - int16_t sThumbLX; - int16_t sThumbLY; - int16_t sThumbRX; - int16_t sThumbRY; -} QEMU_PACKED XIDGamepadReport; - -typedef struct XIDGamepadOutputReport { - uint8_t report_id; //FIXME: is this correct? - uint8_t length; - uint16_t left_actuator_strength; - uint16_t right_actuator_strength; -} QEMU_PACKED XIDGamepadOutputReport; - -typedef struct USBXIDState { - USBDevice dev; - USBEndpoint *intr; - const XIDDesc *xid_desc; - XIDGamepadReport in_state; - XIDGamepadReport in_state_capabilities; - XIDGamepadOutputReport out_state; - XIDGamepadOutputReport out_state_capabilities; - uint8_t device_index; -} USBXIDState; - -static const USBDescIface desc_iface_xbox_gamepad = { - .bInterfaceNumber = 0, - .bNumEndpoints = 2, - .bInterfaceClass = USB_CLASS_XID, - .bInterfaceSubClass = 0x42, - .bInterfaceProtocol = 0x00, - .eps = (USBDescEndpoint[]) { - { - .bEndpointAddress = USB_DIR_IN | 0x02, - .bmAttributes = USB_ENDPOINT_XFER_INT, - .wMaxPacketSize = 0x20, - .bInterval = 4, - }, - { - .bEndpointAddress = USB_DIR_OUT | 0x02, - .bmAttributes = USB_ENDPOINT_XFER_INT, - .wMaxPacketSize = 0x20, - .bInterval = 4, - }, - }, -}; - -static const USBDescDevice desc_device_xbox_gamepad = { - .bcdUSB = 0x0110, - .bMaxPacketSize0 = 0x40, - .bNumConfigurations = 1, - .confs = (USBDescConfig[]) { - { - .bNumInterfaces = 1, - .bConfigurationValue = 1, - .bmAttributes = USB_CFG_ATT_ONE, - .bMaxPower = 50, - .nif = 1, - .ifs = &desc_iface_xbox_gamepad, - }, - }, -}; - -static const USBDesc desc_xbox_gamepad = { - .id = { - .idVendor = 0x045e, - .idProduct = 0x0202, - .bcdDevice = 0x0100, - .iManufacturer = STR_MANUFACTURER, - .iProduct = STR_PRODUCT, - .iSerialNumber = STR_SERIALNUMBER, - }, - .full = &desc_device_xbox_gamepad, - .str = desc_strings, -}; - -static const XIDDesc desc_xid_xbox_gamepad = { - .bLength = 0x10, - .bDescriptorType = USB_DT_XID, - .bcdXid = 0x100, - .bType = 1, - .bSubType = 1, - .bMaxInputReportSize = 20, - .bMaxOutputReportSize = 6, - .wAlternateProductIds = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }, -}; - -#define GAMEPAD_A 0 -#define GAMEPAD_B 1 -#define GAMEPAD_X 2 -#define GAMEPAD_Y 3 -#define GAMEPAD_BLACK 4 -#define GAMEPAD_WHITE 5 -#define GAMEPAD_LEFT_TRIGGER 6 -#define GAMEPAD_RIGHT_TRIGGER 7 - -#define GAMEPAD_DPAD_UP 8 -#define GAMEPAD_DPAD_DOWN 9 -#define GAMEPAD_DPAD_LEFT 10 -#define GAMEPAD_DPAD_RIGHT 11 -#define GAMEPAD_START 12 -#define GAMEPAD_BACK 13 -#define GAMEPAD_LEFT_THUMB 14 -#define GAMEPAD_RIGHT_THUMB 15 - -#define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP)) - -static void update_output(USBXIDState *s) +void update_output(USBXIDGamepadState *s) { if (xemu_input_get_test_mode()) { // Don't report changes if we are testing the controller while running @@ -205,7 +52,7 @@ static void update_output(USBXIDState *s) xemu_input_update_rumble(state); } -static void update_input(USBXIDState *s) +void update_input(USBXIDGamepadState *s) { if (xemu_input_get_test_mode()) { // Don't report changes if we are testing the controller while running @@ -256,15 +103,15 @@ static void update_input(USBXIDState *s) s->in_state.sThumbRY = state->axis[CONTROLLER_AXIS_RSTICK_Y]; } -static void usb_xid_handle_reset(USBDevice *dev) +void usb_xid_handle_reset(USBDevice *dev) { DPRINTF("xid reset\n"); } -static void usb_xid_handle_control(USBDevice *dev, USBPacket *p, +void usb_xid_handle_control(USBDevice *dev, USBPacket *p, int request, int value, int index, int length, uint8_t *data) { - USBXIDState *s = (USBXIDState *)dev; + USBXIDGamepadState *s = (USBXIDGamepadState *)dev; DPRINTF("xid handle_control 0x%x 0x%x\n", request, value); @@ -368,36 +215,6 @@ static void usb_xid_handle_control(USBDevice *dev, USBPacket *p, } } -static void usb_xid_handle_data(USBDevice *dev, USBPacket *p) -{ - USBXIDState *s = DO_UPCAST(USBXIDState, dev, dev); - - DPRINTF("xid handle_data 0x%x %d 0x%zx\n", p->pid, p->ep->nr, p->iov.size); - - switch (p->pid) { - case USB_TOKEN_IN: - if (p->ep->nr == 2) { - update_input(s); - usb_packet_copy(p, &s->in_state, s->in_state.bLength); - } else { - assert(false); - } - break; - case USB_TOKEN_OUT: - if (p->ep->nr == 2) { - usb_packet_copy(p, &s->out_state, s->out_state.length); - update_output(s); - } else { - assert(false); - } - break; - default: - p->status = USB_RET_STALL; - assert(false); - break; - } -} - #if 0 static void usb_xid_handle_destroy(USBDevice *dev) { @@ -406,87 +223,6 @@ static void usb_xid_handle_destroy(USBDevice *dev) } #endif -static void usb_xbox_gamepad_unrealize(USBDevice *dev) -{ -} - -static void usb_xid_class_initfn(ObjectClass *klass, void *data) -{ - USBDeviceClass *uc = USB_DEVICE_CLASS(klass); - - uc->handle_reset = usb_xid_handle_reset; - uc->handle_control = usb_xid_handle_control; - uc->handle_data = usb_xid_handle_data; - // uc->handle_destroy = usb_xid_handle_destroy; - uc->handle_attach = usb_desc_attach; -} - -static void usb_xbox_gamepad_realize(USBDevice *dev, Error **errp) -{ - USBXIDState *s = USB_XID(dev); - usb_desc_create_serial(dev); - usb_desc_init(dev); - s->intr = usb_ep_get(dev, USB_TOKEN_IN, 2); - - s->in_state.bLength = sizeof(s->in_state); - s->in_state.bReportId = 0; - - s->out_state.length = sizeof(s->out_state); - s->out_state.report_id = 0; - - s->xid_desc = &desc_xid_xbox_gamepad; - - memset(&s->in_state_capabilities, 0xFF, sizeof(s->in_state_capabilities)); - s->in_state_capabilities.bLength = sizeof(s->in_state_capabilities); - s->in_state_capabilities.bReportId = 0; - - memset(&s->out_state_capabilities, 0xFF, sizeof(s->out_state_capabilities)); - s->out_state_capabilities.length = sizeof(s->out_state_capabilities); - s->out_state_capabilities.report_id = 0; -} - -static Property xid_properties[] = { - DEFINE_PROP_UINT8("index", USBXIDState, device_index, 0), - DEFINE_PROP_END_OF_LIST(), -}; - -static const VMStateDescription vmstate_usb_xbox = { - .name = TYPE_USB_XID, - .version_id = 1, - .minimum_version_id = 1, - .fields = (VMStateField[]) { - VMSTATE_USB_DEVICE(dev, USBXIDState), - // FIXME - VMSTATE_END_OF_LIST() - }, -}; - -static void usb_xbox_gamepad_class_initfn(ObjectClass *klass, void *data) -{ - DeviceClass *dc = DEVICE_CLASS(klass); - USBDeviceClass *uc = USB_DEVICE_CLASS(klass); - - uc->product_desc = "Microsoft Xbox Controller"; - uc->usb_desc = &desc_xbox_gamepad; - uc->realize = usb_xbox_gamepad_realize; - uc->unrealize = usb_xbox_gamepad_unrealize; - usb_xid_class_initfn(klass, data); - set_bit(DEVICE_CATEGORY_INPUT, dc->categories); - dc->vmsd = &vmstate_usb_xbox; - device_class_set_props(dc, xid_properties); - dc->desc = "Microsoft Xbox Controller"; -} - -static const TypeInfo usb_xbox_gamepad_info = { - .name = TYPE_USB_XID, - .parent = TYPE_USB_DEVICE, - .instance_size = sizeof(USBXIDState), - .class_init = usb_xbox_gamepad_class_initfn, -}; - -static void usb_xid_register_types(void) +void usb_xbox_gamepad_unrealize(USBDevice *dev) { - type_register_static(&usb_xbox_gamepad_info); } - -type_init(usb_xid_register_types) diff --git a/hw/xbox/xid.h b/hw/xbox/xid.h new file mode 100644 index 00000000000..44406eaf912 --- /dev/null +++ b/hw/xbox/xid.h @@ -0,0 +1,137 @@ +#ifndef __XID_H__ +#define __XID_H__ + +/* + * QEMU USB XID Devices + * + * Copyright (c) 2013 espes + * Copyright (c) 2017 Jannik Vogel + * Copyright (c) 2018-2021 Matt Borgerson + * Copyright (c) 2023 Fred Hallock + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "hw/hw.h" +#include "hw/qdev-properties.h" +#include "hw/usb.h" +#include "hw/usb/desc.h" +#include "migration/vmstate.h" +#include "sysemu/sysemu.h" +#include "ui/console.h" +#include "ui/xemu-input.h" + +// #define DEBUG_XID +#ifdef DEBUG_XID +#define DPRINTF printf +#else +#define DPRINTF(...) +#endif + +#define USB_CLASS_XID 0x58 +#define USB_DT_XID 0x42 + +#define HID_GET_REPORT 0x01 +#define HID_SET_REPORT 0x09 +#define XID_GET_CAPABILITIES 0x01 + +#define XID_DEVICETYPE_GAMEPAD 0x01 + +#define XID_DEVICESUBTYPE_GAMEPAD 0x01 +#define XID_DEVICESUBTYPE_GAMEPAD_S 0x02 + +#define TYPE_USB_XID_GAMEPAD "usb-xbox-gamepad" +#define TYPE_USB_XID_GAMEPAD_S "usb-xbox-gamepad-s" + +#define GAMEPAD_A 0 +#define GAMEPAD_B 1 +#define GAMEPAD_X 2 +#define GAMEPAD_Y 3 +#define GAMEPAD_BLACK 4 +#define GAMEPAD_WHITE 5 +#define GAMEPAD_LEFT_TRIGGER 6 +#define GAMEPAD_RIGHT_TRIGGER 7 + +#define GAMEPAD_DPAD_UP 8 +#define GAMEPAD_DPAD_DOWN 9 +#define GAMEPAD_DPAD_LEFT 10 +#define GAMEPAD_DPAD_RIGHT 11 +#define GAMEPAD_START 12 +#define GAMEPAD_BACK 13 +#define GAMEPAD_LEFT_THUMB 14 +#define GAMEPAD_RIGHT_THUMB 15 + +#define BUTTON_MASK(button) (1 << ((button) - GAMEPAD_DPAD_UP)) + +enum { + STR_MANUFACTURER = 1, + STR_PRODUCT, + STR_SERIALNUMBER, +}; + +extern const USBDescStrings desc_strings; + +typedef struct XIDDesc { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdXid; + uint8_t bType; + uint8_t bSubType; + uint8_t bMaxInputReportSize; + uint8_t bMaxOutputReportSize; + uint16_t wAlternateProductIds[4]; +} QEMU_PACKED XIDDesc; + +typedef struct XIDGamepadReport { + uint8_t bReportId; + uint8_t bLength; + uint16_t wButtons; + uint8_t bAnalogButtons[8]; + int16_t sThumbLX; + int16_t sThumbLY; + int16_t sThumbRX; + int16_t sThumbRY; +} QEMU_PACKED XIDGamepadReport; + +typedef struct XIDGamepadOutputReport { + uint8_t report_id; // FIXME: is this correct? + uint8_t length; + uint16_t left_actuator_strength; + uint16_t right_actuator_strength; +} QEMU_PACKED XIDGamepadOutputReport; + +typedef struct USBXIDGamepadState { + USBDevice dev; + USBEndpoint *intr; + const XIDDesc *xid_desc; + XIDGamepadReport in_state; + XIDGamepadReport in_state_capabilities; + XIDGamepadOutputReport out_state; + XIDGamepadOutputReport out_state_capabilities; + uint8_t device_index; +} USBXIDGamepadState; + +void update_input(USBXIDGamepadState *s); +void update_output(USBXIDGamepadState *s); +void usb_xid_handle_reset(USBDevice *dev); +void usb_xid_handle_control(USBDevice *dev, USBPacket *p, int request, + int value, int index, int length, uint8_t *data); +void usb_xbox_gamepad_unrealize(USBDevice *dev); + +#if 0 +void usb_xid_handle_destroy(USBDevice *dev); +#endif + +#endif \ No newline at end of file diff --git a/subprojects/glslang b/subprojects/glslang new file mode 160000 index 00000000000..e8dd0b6903b --- /dev/null +++ b/subprojects/glslang @@ -0,0 +1 @@ +Subproject commit e8dd0b6903b34f1879520b444634c75ea2deedf5 diff --git a/thirdparty/SPIRV-Reflect b/thirdparty/SPIRV-Reflect new file mode 160000 index 00000000000..1d674a82d7e --- /dev/null +++ b/thirdparty/SPIRV-Reflect @@ -0,0 +1 @@ +Subproject commit 1d674a82d7e102ed0c02e64e036827db9e8b1a71 diff --git a/thirdparty/VulkanMemoryAllocator b/thirdparty/VulkanMemoryAllocator new file mode 160000 index 00000000000..009ecd192c1 --- /dev/null +++ b/thirdparty/VulkanMemoryAllocator @@ -0,0 +1 @@ +Subproject commit 009ecd192c1289c7529bff248a16cfe896254816 diff --git a/thirdparty/volk b/thirdparty/volk new file mode 160000 index 00000000000..466085407d5 --- /dev/null +++ b/thirdparty/volk @@ -0,0 +1 @@ +Subproject commit 466085407d5d2f50583fd663c1d65f93a7709d3e diff --git a/ui/xemu-input.c b/ui/xemu-input.c index d9181fe2a62..efe1b5dfa44 100644 --- a/ui/xemu-input.c +++ b/ui/xemu-input.c @@ -86,6 +86,8 @@ static void xemu_input_print_controller_state(ControllerState *state) ControllerStateList available_controllers = QTAILQ_HEAD_INITIALIZER(available_controllers); ControllerState *bound_controllers[4] = { NULL, NULL, NULL, NULL }; +const char *bound_drivers[4] = { DRIVER_DUKE, DRIVER_DUKE, DRIVER_DUKE, + DRIVER_DUKE }; int test_mode; static const char **port_index_to_settings_key_map[] = { @@ -95,6 +97,13 @@ static const char **port_index_to_settings_key_map[] = { &g_config.input.bindings.port4, }; +static const char **port_index_to_driver_settings_key_map[] = { + &g_config.input.bindings.port1_driver, + &g_config.input.bindings.port2_driver, + &g_config.input.bindings.port3_driver, + &g_config.input.bindings.port4_driver +}; + static int *peripheral_types_settings_map[4][2] = { { &g_config.input.peripherals.port1.peripheral_type_0, &g_config.input.peripherals.port1.peripheral_type_1 }, @@ -119,6 +128,37 @@ static const char **peripheral_params_settings_map[4][2] = { static int sdl_kbd_scancode_map[25]; +static const char *get_bound_driver(int port) +{ + assert(port >= 0 && port <= 3); + const char *driver = NULL; + switch (port) { + case 0: + driver = g_config.input.bindings.port1_driver; + break; + case 1: + driver = g_config.input.bindings.port2_driver; + break; + case 2: + driver = g_config.input.bindings.port3_driver; + break; + case 3: + driver = g_config.input.bindings.port4_driver; + break; + } + if (driver == NULL) + return DRIVER_DUKE; // Shouldn't be possible + if (strlen(driver) == 0) + return DRIVER_DUKE; + if (strcmp(driver, DRIVER_DUKE) == 0) + return DRIVER_DUKE; + if (strcmp(driver, DRIVER_S) == 0) + return DRIVER_S; + + // Shouldn't be possible + return DRIVER_DUKE; +} + static const int port_map[4] = { 3, 4, 1, 2 }; void xemu_input_init(void) @@ -520,6 +560,8 @@ void xemu_input_bind(int index, ControllerState *state, int save) } } xemu_settings_set_string(port_index_to_settings_key_map[index], guid_buf); + xemu_settings_set_string(port_index_to_driver_settings_key_map[index], + bound_drivers[index]); } // Bind new controller @@ -548,7 +590,7 @@ void xemu_input_bind(int index, ControllerState *state, int save) QDict *qdict = qdict_new(); // Specify device driver - qdict_put_str(qdict, "driver", "usb-xbox-gamepad"); + qdict_put_str(qdict, "driver", bound_drivers[index]); // Specify device identifier static int id_counter = 0; diff --git a/ui/xemu-input.h b/ui/xemu-input.h index 330ae58a7c1..f0e7b3b6e31 100644 --- a/ui/xemu-input.h +++ b/ui/xemu-input.h @@ -30,6 +30,12 @@ #include "qemu/queue.h" +#define DRIVER_DUKE "usb-xbox-gamepad" +#define DRIVER_S "usb-xbox-gamepad-s" + +#define DRIVER_DUKE_DISPLAY_NAME "Xbox Controller" +#define DRIVER_S_DISPLAY_NAME "Xbox Controller S" + enum controller_state_buttons_mask { CONTROLLER_BUTTON_A = (1 << 0), CONTROLLER_BUTTON_B = (1 << 1), @@ -81,7 +87,7 @@ typedef struct ControllerState { // Input state uint16_t buttons; int16_t axis[CONTROLLER_AXIS__COUNT]; - + // Rendering state hacked on here for convenience but needs to be moved (FIXME) uint32_t animate_guide_button_end; uint32_t animate_trigger_end; @@ -107,6 +113,7 @@ typedef struct ControllerState { typedef QTAILQ_HEAD(, ControllerState) ControllerStateList; extern ControllerStateList available_controllers; extern ControllerState *bound_controllers[4]; +extern const char *bound_drivers[4]; #ifdef __cplusplus extern "C" { diff --git a/ui/xui/gl-helpers.cc b/ui/xui/gl-helpers.cc index 6c07d087b41..b1646a13537 100644 --- a/ui/xui/gl-helpers.cc +++ b/ui/xui/gl-helpers.cc @@ -20,6 +20,7 @@ #include "gl-helpers.hh" #include "common.hh" #include "data/controller_mask.png.h" +#include "data/controller_mask_s.png.h" #include "data/logo_sdf.png.h" #include "data/xemu_64x64.png.h" #include "data/xmu_mask.png.h" @@ -33,7 +34,7 @@ #include "ui/shader/xemu-logo-frag.h" Fbo *controller_fbo, *xmu_fbo, *logo_fbo; -GLuint g_controller_tex, g_logo_tex, g_icon_tex, g_xmu_tex; +GLuint g_controller_tex, g_controller_s_tex, g_logo_tex, g_icon_tex, g_xmu_tex; enum class ShaderType { Blit, @@ -441,6 +442,8 @@ void InitCustomRendering(void) glActiveTexture(GL_TEXTURE0); g_controller_tex = LoadTextureFromMemory(controller_mask_data, controller_mask_size); + g_controller_s_tex = + LoadTextureFromMemory(controller_mask_s_data, controller_mask_s_size); g_decal_shader = NewDecalShader(ShaderType::Mask); controller_fbo = new Fbo(512, 512); @@ -464,7 +467,7 @@ static void RenderMeter(DecalShader *s, float x, float y, float width, RenderDecal(s, x, y, width * p, height, 0, 0, 1, 1, 0, 0, color_fg); } -void RenderController(float frame_x, float frame_y, uint32_t primary_color, +static void RenderController_Duke(float frame_x, float frame_y, uint32_t primary_color, uint32_t secondary_color, ControllerState *state) { // Location within the controller texture of masked button locations, @@ -623,6 +626,184 @@ void RenderController(float frame_x, float frame_y, uint32_t primary_color, glUseProgram(0); } +static void RenderController_S(float frame_x, float frame_y, uint32_t primary_color, + uint32_t secondary_color, ControllerState *state) +{ + // Location within the controller texture of masked button locations, + // relative to the origin of the controller + const struct rect jewel = { 194, 213, 84, 84 }; + const struct rect lstick_ctr = { 103, 254, 0, 0 }; + const struct rect rstick_ctr = { 295, 176, 0, 0 }; + const struct rect buttons[12] = { + { 347, 200, 34, 34 }, // A + { 381, 235, 34, 34 }, // B + { 313, 235, 34, 34 }, // X + { 347, 270, 34, 34 }, // Y + { 123, 165, 31, 26 }, // D-Left + { 150, 187, 26, 31 }, // D-Up + { 173, 165, 31, 26 }, // D-Right + { 150, 135, 26, 31 }, // D-Down + { 45, 195, 20, 24 }, // Back + { 70, 163, 26, 26 }, // Start + { 352, 145, 30, 30 }, // White + { 388, 172, 30, 30 }, // Black + }; + + uint8_t alpha = 0; + uint32_t now = SDL_GetTicks(); + float t; + + glUseProgram(g_decal_shader->prog); + glBindVertexArray(g_decal_shader->vao); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_controller_s_tex); + + // Add a 5 pixel space around the controller so we can wiggle the controller + // around to visualize rumble in action + frame_x += 5; + frame_y += 5; + float original_frame_x = frame_x; + float original_frame_y = frame_y; + + // Floating point versions that will get scaled + float rumble_l = 0; + float rumble_r = 0; + + glBlendEquation(GL_FUNC_ADD); + glBlendFunc(GL_ONE, GL_ZERO); + + uint32_t jewel_color = secondary_color; + + // Check to see if the guide button is pressed + const uint32_t animate_guide_button_duration = 2000; + if (state->buttons & CONTROLLER_BUTTON_GUIDE) { + state->animate_guide_button_end = + now + animate_guide_button_duration; + } + + if (now < state->animate_guide_button_end) { + t = 1.0f - (float)(state->animate_guide_button_end - now) / + (float)animate_guide_button_duration; + float sin_wav = (1 - sin(M_PI * t / 2.0f)); + + // Animate guide button by highlighting logo jewel and fading out over + // time + alpha = sin_wav * 255.0f; + jewel_color = primary_color + alpha; + + // Add a little extra flare: wiggle the frame around while we rumble + frame_x += ((float)(rand() % 5) - 2.5) * (1 - t); + frame_y += ((float)(rand() % 5) - 2.5) * (1 - t); + rumble_l = rumble_r = sin_wav; + } + + // Render controller texture + RenderDecal(g_decal_shader, frame_x + 0, frame_y + 0, + tex_items[obj_controller].w, tex_items[obj_controller].h, + tex_items[obj_controller].x, tex_items[obj_controller].y, + tex_items[obj_controller].w, tex_items[obj_controller].h, + primary_color, secondary_color, 0); + + glBlendFunc(GL_ONE_MINUS_DST_ALPHA, + GL_ONE); // Blend with controller cutouts + RenderDecal(g_decal_shader, frame_x + jewel.x, frame_y + jewel.y, jewel.w, + jewel.h, 0, 0, 1, 1, 0, 0, jewel_color); + + // The controller has alpha cutouts where the buttons are. Draw a surface + // behind the buttons if they are activated + for (int i = 0; i < 12; i++) { + if (state->buttons & (1 << i)) { + RenderDecal(g_decal_shader, frame_x + buttons[i].x, + frame_y + buttons[i].y, buttons[i].w, buttons[i].h, 0, + 0, 1, 1, 0, 0, primary_color + 0xff); + } + } + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Blend with controller + + // Render left thumbstick + float w = tex_items[obj_lstick].w; + float h = tex_items[obj_lstick].h; + float c_x = frame_x + lstick_ctr.x; + float c_y = frame_y + lstick_ctr.y; + float lstick_x = (float)state->axis[CONTROLLER_AXIS_LSTICK_X] / 32768.0; + float lstick_y = (float)state->axis[CONTROLLER_AXIS_LSTICK_Y] / 32768.0; + RenderDecal( + g_decal_shader, (int)(c_x - w / 2.0f + 10.0f * lstick_x), + (int)(c_y - h / 2.0f + 10.0f * lstick_y), w, h, tex_items[obj_lstick].x, + tex_items[obj_lstick].y, w, h, + (state->buttons & CONTROLLER_BUTTON_LSTICK) ? secondary_color : + primary_color, + (state->buttons & CONTROLLER_BUTTON_LSTICK) ? primary_color : + secondary_color, + 0); + + // Render right thumbstick + w = tex_items[obj_rstick].w; + h = tex_items[obj_rstick].h; + c_x = frame_x + rstick_ctr.x; + c_y = frame_y + rstick_ctr.y; + float rstick_x = (float)state->axis[CONTROLLER_AXIS_RSTICK_X] / 32768.0; + float rstick_y = (float)state->axis[CONTROLLER_AXIS_RSTICK_Y] / 32768.0; + RenderDecal( + g_decal_shader, (int)(c_x - w / 2.0f + 10.0f * rstick_x), + (int)(c_y - h / 2.0f + 10.0f * rstick_y), w, h, tex_items[obj_rstick].x, + tex_items[obj_rstick].y, w, h, + (state->buttons & CONTROLLER_BUTTON_RSTICK) ? secondary_color : + primary_color, + (state->buttons & CONTROLLER_BUTTON_RSTICK) ? primary_color : + secondary_color, + 0); + + glBlendFunc(GL_ONE, + GL_ZERO); // Don't blend, just overwrite values in buffer + + // Render trigger bars + float ltrig = state->axis[CONTROLLER_AXIS_LTRIG] / 32767.0; + float rtrig = state->axis[CONTROLLER_AXIS_RTRIG] / 32767.0; + const uint32_t animate_trigger_duration = 1000; + if ((ltrig > 0) || (rtrig > 0)) { + state->animate_trigger_end = now + animate_trigger_duration; + rumble_l = fmax(rumble_l, ltrig); + rumble_r = fmax(rumble_r, rtrig); + } + + // Animate trigger alpha down after a period of inactivity + alpha = 0x80; + if (state->animate_trigger_end > now) { + t = 1.0f - (float)(state->animate_trigger_end - now) / + (float)animate_trigger_duration; + float sin_wav = (1 - sin(M_PI * t / 2.0f)); + alpha += fmin(sin_wav * 0x40, 0x80); + } + + RenderMeter(g_decal_shader, original_frame_x + 10, + original_frame_y + tex_items[obj_controller].h + 20, 150, 5, + ltrig, primary_color + alpha, primary_color + 0xff); + RenderMeter(g_decal_shader, + original_frame_x + tex_items[obj_controller].w - 160, + original_frame_y + tex_items[obj_controller].h + 20, 150, 5, + rtrig, primary_color + alpha, primary_color + 0xff); + + // Apply rumble updates + state->rumble_l = (int)(rumble_l * (float)0xffff); + state->rumble_r = (int)(rumble_r * (float)0xffff); + + glBindVertexArray(0); + glUseProgram(0); +} + +void RenderController(float frame_x, float frame_y, uint32_t primary_color, + uint32_t secondary_color, ControllerState *state) +{ + if (strcmp(bound_drivers[state->bound], DRIVER_S) == 0) + RenderController_S(frame_x, frame_y, primary_color, secondary_color, + state); + else if (strcmp(bound_drivers[state->bound], DRIVER_DUKE) == 0) + RenderController_Duke(frame_x, frame_y, primary_color, secondary_color, + state); +} + void RenderControllerPort(float frame_x, float frame_y, int i, uint32_t port_color) { diff --git a/ui/xui/main-menu.cc b/ui/xui/main-menu.cc index 75b88cafb6e..947d6047313 100644 --- a/ui/xui/main-menu.cc +++ b/ui/xui/main-menu.cc @@ -158,6 +158,49 @@ void MainMenuInputView::Draw() ImGui::PopStyleVar(); // ItemSpacing ImGui::Columns(1); + // + // Render device driver combo + // + + // List available device drivers + const char *driver = bound_drivers[active]; + + if (strcmp(driver, DRIVER_DUKE) == 0) + driver = DRIVER_DUKE_DISPLAY_NAME; + else if (strcmp(driver, DRIVER_S) == 0) + driver = DRIVER_S_DISPLAY_NAME; + + ImGui::SetNextItemWidth(-FLT_MIN); + if (ImGui::BeginCombo("###InputDrivers", driver, + ImGuiComboFlags_NoArrowButton)) { + const char *available_drivers[] = { DRIVER_DUKE, DRIVER_S }; + const char *driver_display_names[] = { + DRIVER_DUKE_DISPLAY_NAME, + DRIVER_S_DISPLAY_NAME + }; + bool is_selected = false; + int num_drivers = sizeof(driver_display_names) / sizeof(driver_display_names[0]); + for (int i = 0; i < num_drivers; i++) { + const char *iter = driver_display_names[i]; + is_selected = strcmp(driver, iter) == 0; + ImGui::PushID(iter); + if (ImGui::Selectable(iter, is_selected)) { + for (int j = 0; j < num_drivers; j++) { + if (iter == driver_display_names[j]) + bound_drivers[active] = available_drivers[j]; + } + xemu_input_bind(active, bound_controllers[active], 1); + } + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + ImGui::PopID(); + } + + ImGui::EndCombo(); + } + DrawComboChevron(); + // // Render input device combo // From 571108658308de6c0f0a856240b5e7d23a770a67 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Wed, 4 Dec 2024 00:38:43 -0500 Subject: [PATCH 3/9] Removed some things that weren't supposed to be added --- subprojects/glslang | 1 - 1 file changed, 1 deletion(-) delete mode 160000 subprojects/glslang diff --git a/subprojects/glslang b/subprojects/glslang deleted file mode 160000 index e8dd0b6903b..00000000000 --- a/subprojects/glslang +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e8dd0b6903b34f1879520b444634c75ea2deedf5 From 2e0ead3ae224d5b44310fcaf8996a9723fe87fc6 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Wed, 4 Dec 2024 00:39:07 -0500 Subject: [PATCH 4/9] Removed some things that weren't supposed to be added --- hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu | 1 - thirdparty/SPIRV-Reflect | 1 - thirdparty/VulkanMemoryAllocator | 1 - thirdparty/volk | 1 - 4 files changed, 4 deletions(-) delete mode 160000 hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu delete mode 160000 thirdparty/SPIRV-Reflect delete mode 160000 thirdparty/VulkanMemoryAllocator delete mode 160000 thirdparty/volk diff --git a/hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu b/hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu deleted file mode 160000 index d5a7308809a..00000000000 --- a/hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d5a7308809a80e1b01b5c016127d4f1b91c8673b diff --git a/thirdparty/SPIRV-Reflect b/thirdparty/SPIRV-Reflect deleted file mode 160000 index 1d674a82d7e..00000000000 --- a/thirdparty/SPIRV-Reflect +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1d674a82d7e102ed0c02e64e036827db9e8b1a71 diff --git a/thirdparty/VulkanMemoryAllocator b/thirdparty/VulkanMemoryAllocator deleted file mode 160000 index 009ecd192c1..00000000000 --- a/thirdparty/VulkanMemoryAllocator +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 009ecd192c1289c7529bff248a16cfe896254816 diff --git a/thirdparty/volk b/thirdparty/volk deleted file mode 160000 index 466085407d5..00000000000 --- a/thirdparty/volk +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 466085407d5d2f50583fd663c1d65f93a7709d3e From 741283a79ab55fb65814ee4e17607d0dc199e8a0 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Wed, 4 Dec 2024 00:40:09 -0500 Subject: [PATCH 5/9] deleted the nv2a_vsh_cpu folder again --- hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu | 1 - 1 file changed, 1 deletion(-) delete mode 160000 hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu diff --git a/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu b/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu deleted file mode 160000 index d5a7308809a..00000000000 --- a/hw/xbox/nv2a/pgraph/thirdparty/nv2a_vsh_cpu +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d5a7308809a80e1b01b5c016127d4f1b91c8673b From 11c82a770a5cef8fede421a11788cbc7d66a4869 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Wed, 4 Dec 2024 00:53:41 -0500 Subject: [PATCH 6/9] added back the nv2a_vsh_cpu folder --- hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu | 1 + 1 file changed, 1 insertion(+) create mode 160000 hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu diff --git a/hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu b/hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu new file mode 160000 index 00000000000..d5a7308809a --- /dev/null +++ b/hw/xbox/nv2a/thirdparty/nv2a_vsh_cpu @@ -0,0 +1 @@ +Subproject commit d5a7308809a80e1b01b5c016127d4f1b91c8673b From 62346e68d0acbcf3edab22d0d8072f9f4f63dce8 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Thu, 5 Dec 2024 19:48:58 -0500 Subject: [PATCH 7/9] Forgot to add the bit where get_bound_driver is called in xemu_input_init --- ui/xemu-input.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui/xemu-input.c b/ui/xemu-input.c index efe1b5dfa44..8eb724527de 100644 --- a/ui/xemu-input.c +++ b/ui/xemu-input.c @@ -217,6 +217,11 @@ void xemu_input_init(void) } } + bound_drivers[0] = get_bound_driver(0); + bound_drivers[1] = get_bound_driver(1); + bound_drivers[2] = get_bound_driver(2); + bound_drivers[3] = get_bound_driver(3); + // Check to see if we should auto-bind the keyboard int port = xemu_input_get_controller_default_bind_port(new_con, 0); if (port >= 0) { From 164ff142679353a5c47a6d25a7e3c7d4c6819baf Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Fri, 6 Dec 2024 00:46:17 -0500 Subject: [PATCH 8/9] Fixed some nits Fixed some naming issues Changed get_bound_driver to use port_index_to_driver_settings_key_map lookup table. Changed comment in get_bound_driver to clarify when we default to DUKE --- ui/xemu-input.c | 22 +++++----------------- ui/xemu-input.h | 2 +- ui/xui/gl-helpers.cc | 20 ++++++++++---------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/ui/xemu-input.c b/ui/xemu-input.c index 8eb724527de..31a51eda9d2 100644 --- a/ui/xemu-input.c +++ b/ui/xemu-input.c @@ -131,23 +131,12 @@ static int sdl_kbd_scancode_map[25]; static const char *get_bound_driver(int port) { assert(port >= 0 && port <= 3); - const char *driver = NULL; - switch (port) { - case 0: - driver = g_config.input.bindings.port1_driver; - break; - case 1: - driver = g_config.input.bindings.port2_driver; - break; - case 2: - driver = g_config.input.bindings.port3_driver; - break; - case 3: - driver = g_config.input.bindings.port4_driver; - break; - } + const char *driver = *port_index_to_driver_settings_key_map[port]; + + // If the driver in the config is NULL, empty, or unrecognized + // then default to DRIVER_DUKE if (driver == NULL) - return DRIVER_DUKE; // Shouldn't be possible + return DRIVER_DUKE; if (strlen(driver) == 0) return DRIVER_DUKE; if (strcmp(driver, DRIVER_DUKE) == 0) @@ -155,7 +144,6 @@ static const char *get_bound_driver(int port) if (strcmp(driver, DRIVER_S) == 0) return DRIVER_S; - // Shouldn't be possible return DRIVER_DUKE; } diff --git a/ui/xemu-input.h b/ui/xemu-input.h index f0e7b3b6e31..23c1a9f91b7 100644 --- a/ui/xemu-input.h +++ b/ui/xemu-input.h @@ -87,7 +87,7 @@ typedef struct ControllerState { // Input state uint16_t buttons; int16_t axis[CONTROLLER_AXIS__COUNT]; - + // Rendering state hacked on here for convenience but needs to be moved (FIXME) uint32_t animate_guide_button_end; uint32_t animate_trigger_end; diff --git a/ui/xui/gl-helpers.cc b/ui/xui/gl-helpers.cc index b1646a13537..0a06b7f16ac 100644 --- a/ui/xui/gl-helpers.cc +++ b/ui/xui/gl-helpers.cc @@ -34,7 +34,7 @@ #include "ui/shader/xemu-logo-frag.h" Fbo *controller_fbo, *xmu_fbo, *logo_fbo; -GLuint g_controller_tex, g_controller_s_tex, g_logo_tex, g_icon_tex, g_xmu_tex; +GLuint g_controller_duke_tex, g_controller_s_tex, g_logo_tex, g_icon_tex, g_xmu_tex; enum class ShaderType { Blit, @@ -440,7 +440,7 @@ enum tex_item_names { void InitCustomRendering(void) { glActiveTexture(GL_TEXTURE0); - g_controller_tex = + g_controller_duke_tex = LoadTextureFromMemory(controller_mask_data, controller_mask_size); g_controller_s_tex = LoadTextureFromMemory(controller_mask_s_data, controller_mask_s_size); @@ -467,7 +467,7 @@ static void RenderMeter(DecalShader *s, float x, float y, float width, RenderDecal(s, x, y, width * p, height, 0, 0, 1, 1, 0, 0, color_fg); } -static void RenderController_Duke(float frame_x, float frame_y, uint32_t primary_color, +static void RenderDukeController(float frame_x, float frame_y, uint32_t primary_color, uint32_t secondary_color, ControllerState *state) { // Location within the controller texture of masked button locations, @@ -497,7 +497,7 @@ static void RenderController_Duke(float frame_x, float frame_y, uint32_t primary glUseProgram(g_decal_shader->prog); glBindVertexArray(g_decal_shader->vao); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_controller_tex); + glBindTexture(GL_TEXTURE_2D, g_controller_duke_tex); // Add a 5 pixel space around the controller so we can wiggle the controller // around to visualize rumble in action @@ -626,7 +626,7 @@ static void RenderController_Duke(float frame_x, float frame_y, uint32_t primary glUseProgram(0); } -static void RenderController_S(float frame_x, float frame_y, uint32_t primary_color, +static void RenderControllerS(float frame_x, float frame_y, uint32_t primary_color, uint32_t secondary_color, ControllerState *state) { // Location within the controller texture of masked button locations, @@ -797,11 +797,11 @@ void RenderController(float frame_x, float frame_y, uint32_t primary_color, uint32_t secondary_color, ControllerState *state) { if (strcmp(bound_drivers[state->bound], DRIVER_S) == 0) - RenderController_S(frame_x, frame_y, primary_color, secondary_color, - state); + RenderControllerS(frame_x, frame_y, primary_color, secondary_color, + state); else if (strcmp(bound_drivers[state->bound], DRIVER_DUKE) == 0) - RenderController_Duke(frame_x, frame_y, primary_color, secondary_color, - state); + RenderDukeController(frame_x, frame_y, primary_color, secondary_color, + state); } void RenderControllerPort(float frame_x, float frame_y, int i, @@ -810,7 +810,7 @@ void RenderControllerPort(float frame_x, float frame_y, int i, glUseProgram(g_decal_shader->prog); glBindVertexArray(g_decal_shader->vao); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_controller_tex); + glBindTexture(GL_TEXTURE_2D, g_controller_duke_tex); glBlendFunc(GL_ONE, GL_ZERO); // Render port socket From 1a84e83c4102a07fb2be6e24ca8713fa7603c705 Mon Sep 17 00:00:00 2001 From: "specialfred453@gmail.com" Date: Sun, 29 Dec 2024 11:37:54 -0500 Subject: [PATCH 9/9] Recreated the Xbox Controller S controller mask as an SVG (It's missing the blue channel information for the D-Pad). Recreated the Xbox Controller S controller mask PNG from the SVG, and added in the blue channel data for the D-Pad. --- data/controller_mask_s.png | Bin 65530 -> 46409 bytes data/controller_mask_s.svg | 86 +++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 data/controller_mask_s.svg diff --git a/data/controller_mask_s.png b/data/controller_mask_s.png index 98c3035341a85987646ba9f7165b8c53d8d5b2b4..8406effbca949e4d0de7059ffe7611ca728f525a 100644 GIT binary patch literal 46409 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 literal 65530 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%0Di`Hta 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/YuM=XtPZR7Dbq;D?PXquv6z*-8 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 diff --git a/data/controller_mask_s.svg b/data/controller_mask_s.svg new file mode 100644 index 00000000000..a3cbf84c232 --- /dev/null +++ b/data/controller_mask_s.svg @@ -0,0 +1,86 @@ + + + Controller S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + + + B + + + + A + + + + Y + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file