mirror of
https://github.com/cemu-project/DS4Windows.git
synced 2024-12-24 15:41:49 +01:00
Use unsafe blocks in project
Memory pointer access is needed to improve performance with basic input report copying as well as CRC32 validation
This commit is contained in:
parent
f5f6002cdc
commit
8be2f9f271
@ -276,7 +276,7 @@ namespace DS4Windows
|
|||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static uint CalculateFasterBTHash(ref uint seed, ref byte[] buffer, ref int start, ref int size)
|
public static unsafe uint CalculateFasterBTHash(ref uint seed, ref byte[] buffer, ref int start, ref int size)
|
||||||
{
|
{
|
||||||
/*uint crc = seed;
|
/*uint crc = seed;
|
||||||
for (int i = start; i < size + start; i++)
|
for (int i = start; i < size + start; i++)
|
||||||
@ -288,85 +288,88 @@ namespace DS4Windows
|
|||||||
int i = start;
|
int i = start;
|
||||||
int bufsize = size;
|
int bufsize = size;
|
||||||
//while (bufsize >= 16)
|
//while (bufsize >= 16)
|
||||||
for (int j = 0; j < 4; j++)
|
fixed (byte* byteP = buffer)
|
||||||
{
|
{
|
||||||
uint one = (buffer[i++] |
|
for (int j = 0; j < 4; j++)
|
||||||
(uint)(buffer[i++] << 8) |
|
{
|
||||||
(uint)(buffer[i++] << 16) |
|
uint one = (byteP[i++] |
|
||||||
(uint)(buffer[i++] << 24)) ^ crc;
|
(uint)(byteP[i++] << 8) |
|
||||||
uint two = buffer[i++] |
|
(uint)(byteP[i++] << 16) |
|
||||||
(uint)(buffer[i++] << 8) |
|
(uint)(byteP[i++] << 24)) ^ crc;
|
||||||
(uint)(buffer[i++] << 16) |
|
uint two = byteP[i++] |
|
||||||
(uint)(buffer[i++] << 24);
|
(uint)(byteP[i++] << 8) |
|
||||||
uint three = (buffer[i++] |
|
(uint)(byteP[i++] << 16) |
|
||||||
(uint)(buffer[i++] << 8) |
|
(uint)(byteP[i++] << 24);
|
||||||
(uint)(buffer[i++] << 16) |
|
uint three = (byteP[i++] |
|
||||||
(uint)(buffer[i++] << 24));
|
(uint)(byteP[i++] << 8) |
|
||||||
uint four = buffer[i++] |
|
(uint)(byteP[i++] << 16) |
|
||||||
(uint)(buffer[i++] << 8) |
|
(uint)(byteP[i++] << 24));
|
||||||
(uint)(buffer[i++] << 16) |
|
uint four = byteP[i++] |
|
||||||
(uint)(buffer[i++] << 24);
|
(uint)(byteP[i++] << 8) |
|
||||||
|
(uint)(byteP[i++] << 16) |
|
||||||
|
(uint)(byteP[i++] << 24);
|
||||||
|
|
||||||
crc = secondLook[15, one & 0xFF] ^
|
crc = secondLook[15, one & 0xFF] ^
|
||||||
secondLook[14, (one >> 8) & 0xFF] ^
|
secondLook[14, (one >> 8) & 0xFF] ^
|
||||||
secondLook[13, (one >> 16) & 0xFF] ^
|
secondLook[13, (one >> 16) & 0xFF] ^
|
||||||
secondLook[12, (one >> 24) & 0xFF] ^
|
secondLook[12, (one >> 24) & 0xFF] ^
|
||||||
secondLook[11, two & 0xFF] ^
|
secondLook[11, two & 0xFF] ^
|
||||||
secondLook[10, (two >> 8) & 0xFF] ^
|
secondLook[10, (two >> 8) & 0xFF] ^
|
||||||
secondLook[9, (two >> 16) & 0xFF] ^
|
secondLook[9, (two >> 16) & 0xFF] ^
|
||||||
secondLook[8, (two >> 24) & 0xFF] ^
|
secondLook[8, (two >> 24) & 0xFF] ^
|
||||||
secondLook[7, three & 0xFF] ^
|
secondLook[7, three & 0xFF] ^
|
||||||
secondLook[6, (three >> 8) & 0xFF] ^
|
secondLook[6, (three >> 8) & 0xFF] ^
|
||||||
secondLook[5, (three >> 16) & 0xFF] ^
|
secondLook[5, (three >> 16) & 0xFF] ^
|
||||||
secondLook[4, (three >> 24) & 0xFF] ^
|
secondLook[4, (three >> 24) & 0xFF] ^
|
||||||
secondLook[3, four & 0xFF] ^
|
secondLook[3, four & 0xFF] ^
|
||||||
secondLook[2, (four >> 8) & 0xFF] ^
|
secondLook[2, (four >> 8) & 0xFF] ^
|
||||||
secondLook[1, (four >> 16) & 0xFF] ^
|
secondLook[1, (four >> 16) & 0xFF] ^
|
||||||
defaultTable[(four >> 24) & 0xFF];
|
defaultTable[(four >> 24) & 0xFF];
|
||||||
|
|
||||||
bufsize -= 16;
|
bufsize -= 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
//while (bufsize >= 8)
|
||||||
|
//if (bufsize >= 8)
|
||||||
|
|
||||||
|
uint one8 = (byteP[i++] |
|
||||||
|
(uint)(byteP[i++] << 8) |
|
||||||
|
(uint)(byteP[i++] << 16) |
|
||||||
|
(uint)(byteP[i++] << 24)) ^ crc;
|
||||||
|
uint two8 = byteP[i++] |
|
||||||
|
(uint)(byteP[i++] << 8) |
|
||||||
|
(uint)(byteP[i++] << 16) |
|
||||||
|
(uint)(byteP[i++] << 24);
|
||||||
|
crc = secondLook[7, one8 & 0xFF] ^
|
||||||
|
secondLook[6, (one8 >> 8) & 0xFF] ^
|
||||||
|
secondLook[5, (one8 >> 16) & 0xFF] ^
|
||||||
|
secondLook[4, one8 >> 24] ^
|
||||||
|
secondLook[3, two8 & 0xFF] ^
|
||||||
|
secondLook[2, (two8 >> 8) & 0xFF] ^
|
||||||
|
secondLook[1, (two8 >> 16) & 0xFF] ^
|
||||||
|
defaultTable[two8 >> 24];
|
||||||
|
|
||||||
|
bufsize -= 8;
|
||||||
|
/*crc ^= buffer[i++] |
|
||||||
|
(uint)(buffer[i++] << 8) |
|
||||||
|
(uint)(buffer[i++] << 16) |
|
||||||
|
(uint)(buffer[i++] << 24);// i = i + 4;
|
||||||
|
//crc ^= buffer[i];
|
||||||
|
crc = secondLook[3, (crc & 0xFF)] ^
|
||||||
|
secondLook[2, ((crc >> 8) & 0xFF)] ^
|
||||||
|
secondLook[1, ((crc >> 16) & 0xFF)] ^
|
||||||
|
defaultTable[crc >> 24];
|
||||||
|
bufsize -= 4;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//while (--bufsize >= 0)
|
||||||
|
//{
|
||||||
|
crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ byteP[i++]];// i++;
|
||||||
|
crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ byteP[i++]];// i++;
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
//while (bufsize >= 8)
|
|
||||||
//if (bufsize >= 8)
|
|
||||||
|
|
||||||
uint one8 = (buffer[i++] |
|
|
||||||
(uint)(buffer[i++] << 8) |
|
|
||||||
(uint)(buffer[i++] << 16) |
|
|
||||||
(uint)(buffer[i++] << 24)) ^ crc;
|
|
||||||
uint two8 = buffer[i++] |
|
|
||||||
(uint)(buffer[i++] << 8) |
|
|
||||||
(uint)(buffer[i++] << 16) |
|
|
||||||
(uint)(buffer[i++] << 24);
|
|
||||||
crc = secondLook[7, one8 & 0xFF] ^
|
|
||||||
secondLook[6, (one8 >> 8) & 0xFF] ^
|
|
||||||
secondLook[5, (one8 >> 16) & 0xFF] ^
|
|
||||||
secondLook[4, one8 >> 24] ^
|
|
||||||
secondLook[3, two8 & 0xFF] ^
|
|
||||||
secondLook[2, (two8 >> 8) & 0xFF] ^
|
|
||||||
secondLook[1, (two8 >> 16) & 0xFF] ^
|
|
||||||
defaultTable[two8 >> 24];
|
|
||||||
|
|
||||||
bufsize -= 8;
|
|
||||||
/*crc ^= buffer[i++] |
|
|
||||||
(uint)(buffer[i++] << 8) |
|
|
||||||
(uint)(buffer[i++] << 16) |
|
|
||||||
(uint)(buffer[i++] << 24);// i = i + 4;
|
|
||||||
//crc ^= buffer[i];
|
|
||||||
crc = secondLook[3, (crc & 0xFF)] ^
|
|
||||||
secondLook[2, ((crc >> 8) & 0xFF)] ^
|
|
||||||
secondLook[1, ((crc >> 16) & 0xFF)] ^
|
|
||||||
defaultTable[crc >> 24];
|
|
||||||
bufsize -= 4;
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
//while (--bufsize >= 0)
|
|
||||||
//{
|
|
||||||
crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ buffer[i++]];// i++;
|
|
||||||
crc = (crc >> 8) ^ defaultTable[(crc & 0xFF) ^ buffer[i++]];// i++;
|
|
||||||
//}
|
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,7 +697,7 @@ namespace DS4Windows
|
|||||||
const uint DefaultPolynomial = 0xedb88320u;
|
const uint DefaultPolynomial = 0xedb88320u;
|
||||||
uint HamSeed = 2351727372;
|
uint HamSeed = 2351727372;
|
||||||
|
|
||||||
private void performDs4Input()
|
private unsafe void performDs4Input()
|
||||||
{
|
{
|
||||||
firstActive = DateTime.UtcNow;
|
firstActive = DateTime.UtcNow;
|
||||||
NativeMethods.HidD_SetNumInputBuffers(hDevice.safeReadHandle.DangerousGetHandle(), 2);
|
NativeMethods.HidD_SetNumInputBuffers(hDevice.safeReadHandle.DangerousGetHandle(), 2);
|
||||||
@ -749,7 +749,18 @@ namespace DS4Windows
|
|||||||
timeoutEvent = false;
|
timeoutEvent = false;
|
||||||
if (res == HidDevice.ReadStatus.Success)
|
if (res == HidDevice.ReadStatus.Success)
|
||||||
{
|
{
|
||||||
Array.Copy(btInputReport, 2, inputReport, 0, inputReport.Length);
|
//Array.Copy(btInputReport, 2, inputReport, 0, inputReport.Length);
|
||||||
|
fixed (byte* byteP = &btInputReport[2], imp = inputReport)
|
||||||
|
{
|
||||||
|
byte* btImp = byteP;
|
||||||
|
byte* finImp = imp;
|
||||||
|
for (int j = 0; j < BT_INPUT_REPORT_LENGTH-2;j++)
|
||||||
|
{
|
||||||
|
finImp[j] = btImp[j];
|
||||||
|
//*finImp = *btImp;
|
||||||
|
//btImp++; finImp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//uint recvCrc32 = BitConverter.ToUInt32(btInputReport, BT_INPUT_REPORT_CRC32_POS);
|
//uint recvCrc32 = BitConverter.ToUInt32(btInputReport, BT_INPUT_REPORT_CRC32_POS);
|
||||||
uint recvCrc32 = btInputReport[BT_INPUT_REPORT_CRC32_POS] |
|
uint recvCrc32 = btInputReport[BT_INPUT_REPORT_CRC32_POS] |
|
||||||
|
@ -92,6 +92,7 @@
|
|||||||
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
|
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
|
||||||
<LangVersion>6</LangVersion>
|
<LangVersion>6</LangVersion>
|
||||||
<DebugSymbols>false</DebugSymbols>
|
<DebugSymbols>false</DebugSymbols>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
Loading…
Reference in New Issue
Block a user