shithub: cstory

Download patch

ref: 470a51219e2880b1bb5ada77348550e8640e04e9
parent: 38ea875e11a64f5c3ff50fe49bcc70676c542d82
author: Clownacy <[email protected]>
date: Mon Apr 13 23:50:33 EDT 2020

Fix WiiU builds with LTO enabled

For some reason, LTO affects how `ReadVPAD` handles failure, causing
it to spam gamepad button inputs. With proper error-checking, this is
fixed.

--- a/src/Backends/WiiU/Controller.cpp
+++ b/src/Backends/WiiU/Controller.cpp
@@ -18,60 +18,59 @@
 
 bool ControllerBackend_GetJoystickStatus(bool **buttons, unsigned int *button_count, short **axes, unsigned int *axis_count)
 {
-	VPADReadError vpad_error;
-	VPADStatus vpad_status;
-	VPADRead(VPAD_CHAN_0, &vpad_status, 1, &vpad_error);
-
 	static bool button_buffer[27];
 	static short axis_buffer[4];
 
+	*buttons = button_buffer;
+	*axes = axis_buffer;
+
 	*button_count = sizeof(button_buffer) / sizeof(button_buffer[0]);
 	*axis_count = sizeof(axis_buffer) / sizeof(axis_buffer[0]);
 
-	//////////////////////////
-	// Handle button inputs //
-	//////////////////////////
+	VPADStatus vpad_status;
+	if (VPADRead(VPAD_CHAN_0, &vpad_status, 1, NULL) == 1)
+	{
+		//////////////////////////
+		// Handle button inputs //
+		//////////////////////////
 
-	button_buffer[0] = vpad_status.hold & VPAD_BUTTON_Y;     // Shoot
-	button_buffer[1] = vpad_status.hold & VPAD_BUTTON_B;     // Jump
-	button_buffer[2] = vpad_status.hold & VPAD_BUTTON_X;     // Map
-	button_buffer[3] = vpad_status.hold & VPAD_BUTTON_L;     // Weapon left
-	button_buffer[4] = vpad_status.hold & VPAD_BUTTON_R;     // Weapon right
-	button_buffer[5] = vpad_status.hold & VPAD_BUTTON_A;     // Inventory
-	button_buffer[6] = vpad_status.hold & VPAD_BUTTON_ZL;    // Weapon left
-	button_buffer[7] = vpad_status.hold & VPAD_BUTTON_ZR;    // Weapon right
-	button_buffer[8] = vpad_status.hold & VPAD_BUTTON_LEFT;
-	button_buffer[9] = vpad_status.hold & VPAD_BUTTON_RIGHT;
-	button_buffer[10] = vpad_status.hold & VPAD_BUTTON_UP;
-	button_buffer[11] = vpad_status.hold & VPAD_BUTTON_DOWN;
-	button_buffer[12] = vpad_status.hold & VPAD_BUTTON_PLUS;
-	button_buffer[13] = vpad_status.hold & VPAD_BUTTON_MINUS;
-	button_buffer[14] = vpad_status.hold & VPAD_BUTTON_HOME;
-	button_buffer[15] = vpad_status.hold & VPAD_BUTTON_SYNC;
-	button_buffer[16] = vpad_status.hold & VPAD_BUTTON_STICK_R;
-	button_buffer[17] = vpad_status.hold & VPAD_BUTTON_STICK_L;
-	button_buffer[18] = vpad_status.hold & VPAD_BUTTON_TV;
-	button_buffer[19] = vpad_status.hold & VPAD_STICK_R_EMULATION_LEFT;
-	button_buffer[20] = vpad_status.hold & VPAD_STICK_R_EMULATION_RIGHT;
-	button_buffer[21] = vpad_status.hold & VPAD_STICK_R_EMULATION_UP;
-	button_buffer[22] = vpad_status.hold & VPAD_STICK_R_EMULATION_DOWN;
-	button_buffer[23] = vpad_status.hold & VPAD_STICK_L_EMULATION_LEFT;
-	button_buffer[24] = vpad_status.hold & VPAD_STICK_L_EMULATION_RIGHT;
-	button_buffer[25] = vpad_status.hold & VPAD_STICK_L_EMULATION_UP;
-	button_buffer[26] = vpad_status.hold & VPAD_STICK_L_EMULATION_DOWN;	
+		button_buffer[0] = vpad_status.hold & VPAD_BUTTON_Y;     // Shoot
+		button_buffer[1] = vpad_status.hold & VPAD_BUTTON_B;     // Jump
+		button_buffer[2] = vpad_status.hold & VPAD_BUTTON_X;     // Map
+		button_buffer[3] = vpad_status.hold & VPAD_BUTTON_L;     // Weapon left
+		button_buffer[4] = vpad_status.hold & VPAD_BUTTON_R;     // Weapon right
+		button_buffer[5] = vpad_status.hold & VPAD_BUTTON_A;     // Inventory
+		button_buffer[6] = vpad_status.hold & VPAD_BUTTON_ZL;    // Weapon left
+		button_buffer[7] = vpad_status.hold & VPAD_BUTTON_ZR;    // Weapon right
+		button_buffer[8] = vpad_status.hold & VPAD_BUTTON_LEFT;
+		button_buffer[9] = vpad_status.hold & VPAD_BUTTON_RIGHT;
+		button_buffer[10] = vpad_status.hold & VPAD_BUTTON_UP;
+		button_buffer[11] = vpad_status.hold & VPAD_BUTTON_DOWN;
+		button_buffer[12] = vpad_status.hold & VPAD_BUTTON_PLUS;
+		button_buffer[13] = vpad_status.hold & VPAD_BUTTON_MINUS;
+		button_buffer[14] = vpad_status.hold & VPAD_BUTTON_HOME;
+		button_buffer[15] = vpad_status.hold & VPAD_BUTTON_SYNC;
+		button_buffer[16] = vpad_status.hold & VPAD_BUTTON_STICK_R;
+		button_buffer[17] = vpad_status.hold & VPAD_BUTTON_STICK_L;
+		button_buffer[18] = vpad_status.hold & VPAD_BUTTON_TV;
+		button_buffer[19] = vpad_status.hold & VPAD_STICK_R_EMULATION_LEFT;
+		button_buffer[20] = vpad_status.hold & VPAD_STICK_R_EMULATION_RIGHT;
+		button_buffer[21] = vpad_status.hold & VPAD_STICK_R_EMULATION_UP;
+		button_buffer[22] = vpad_status.hold & VPAD_STICK_R_EMULATION_DOWN;
+		button_buffer[23] = vpad_status.hold & VPAD_STICK_L_EMULATION_LEFT;
+		button_buffer[24] = vpad_status.hold & VPAD_STICK_L_EMULATION_RIGHT;
+		button_buffer[25] = vpad_status.hold & VPAD_STICK_L_EMULATION_UP;
+		button_buffer[26] = vpad_status.hold & VPAD_STICK_L_EMULATION_DOWN;
 
-	*buttons = button_buffer;
+		////////////////////////
+		// Handle axis inputs //
+		////////////////////////
 
-	////////////////////////
-	// Handle axis inputs //
-	////////////////////////
-
-	axis_buffer[0] = (short)(vpad_status.leftStick.x * 0x7FFF);
-	axis_buffer[1] = (short)(vpad_status.leftStick.y * -0x7FFF);
-	axis_buffer[2] = (short)(vpad_status.rightStick.x * 0x7FFF);
-	axis_buffer[3] = (short)(vpad_status.rightStick.y * -0x7FFF);
-
-	*axes = axis_buffer;
+		axis_buffer[0] = (short)(vpad_status.leftStick.x * 0x7FFF);
+		axis_buffer[1] = (short)(vpad_status.leftStick.y * -0x7FFF);
+		axis_buffer[2] = (short)(vpad_status.rightStick.x * 0x7FFF);
+		axis_buffer[3] = (short)(vpad_status.rightStick.y * -0x7FFF);
+	}
 
 	return true;
 }