mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-01-23 09:34:35 -05:00
67 lines
1.7 KiB
C#
67 lines
1.7 KiB
C#
using System;
|
|
|
|
namespace OpenTK {
|
|
|
|
public static class MemUtils {
|
|
|
|
static MemUtils() {
|
|
use64Bit = IntPtr.Size == 8;
|
|
}
|
|
static bool use64Bit;
|
|
|
|
public static unsafe void memcpy( IntPtr srcPtr, IntPtr dstPtr, int bytes ) {
|
|
byte* srcByte, dstByte;
|
|
if( use64Bit ) {
|
|
ulong* srcLong = (ulong*)srcPtr, dstLong = (ulong*)dstPtr;
|
|
while( bytes >= 8 ) {
|
|
*dstLong++ = *srcLong++;
|
|
bytes -= 8;
|
|
}
|
|
srcByte = (byte*)srcLong; dstByte = (byte*)dstLong;
|
|
} else {
|
|
uint* srcInt = (uint*)srcPtr, dstInt = (uint*)dstPtr;
|
|
while( bytes >= 4 ) {
|
|
*dstInt++ = *srcInt++;
|
|
bytes -= 4;
|
|
}
|
|
srcByte = (byte*)srcInt; dstByte = (byte*)dstInt;
|
|
}
|
|
|
|
for( int i = 0; i < bytes; i++ ) {
|
|
*dstByte++ = *srcByte++;
|
|
}
|
|
}
|
|
|
|
public static unsafe void memset( IntPtr srcPtr, byte value, int startIndex, int bytes ) {
|
|
byte* srcByte = (byte*)srcPtr + startIndex;
|
|
// Make sure we do an aligned write/read for the bulk copy
|
|
while( bytes > 0 && ( startIndex & 0x7 ) != 0 ) {
|
|
*srcByte++ = value;
|
|
startIndex++;
|
|
bytes--;
|
|
}
|
|
uint valueInt = (uint)( ( value << 24 ) | ( value << 16 ) | ( value << 8 ) | value );
|
|
|
|
if( use64Bit ) {
|
|
ulong valueLong = ( (ulong)valueInt << 32 ) | valueInt;
|
|
ulong* srcLong = (ulong*)srcByte;
|
|
while( bytes >= 8 ) {
|
|
*srcLong++ = valueLong;
|
|
bytes -= 8;
|
|
}
|
|
srcByte = (byte*)srcLong;
|
|
} else {
|
|
uint* srcInt = (uint*)srcByte;
|
|
while( bytes >= 4 ) {
|
|
*srcInt++ = valueInt;
|
|
bytes -= 4;
|
|
}
|
|
srcByte = (byte*)srcInt;
|
|
}
|
|
|
|
for( int i = 0; i < bytes; i++ ) {
|
|
*srcByte++ = value;
|
|
}
|
|
}
|
|
}
|
|
}
|