// Allocates all buffers to serve the given updates and comes up with a spot // for the state block of each device. Returns the new state blocks for the // devices (it will *NOT* install them on the devices). public uint[] AllocateAll(InputDevice[] devices, int deviceCount) { uint[] newDeviceOffsets = null; sizePerBuffer = ComputeSizeOfSingleBufferAndOffsetForEachDevice(devices, deviceCount, ref newDeviceOffsets); if (sizePerBuffer == 0) { return(null); } sizePerBuffer = sizePerBuffer.AlignToMultipleOf(4); // Determine how much memory we need. var mappingTableSizePerBuffer = (uint)(deviceCount * sizeof(void *) * 2); totalSize = 0; totalSize += sizePerBuffer * 2; totalSize += mappingTableSizePerBuffer; #if UNITY_EDITOR totalSize += sizePerBuffer * 2; totalSize += mappingTableSizePerBuffer; #endif // Plus 2 more buffers (1 for default states, and one for noise masks). totalSize += sizePerBuffer * 2; // Allocate. m_AllBuffers = UnsafeUtility.Malloc(totalSize, 4, Allocator.Persistent); UnsafeUtility.MemClear(m_AllBuffers, totalSize); // Set up device to buffer mappings. var ptr = (byte *)m_AllBuffers; m_PlayerStateBuffers = SetUpDeviceToBufferMappings(devices, deviceCount, ref ptr, sizePerBuffer, mappingTableSizePerBuffer); #if UNITY_EDITOR m_EditorStateBuffers = SetUpDeviceToBufferMappings(devices, deviceCount, ref ptr, sizePerBuffer, mappingTableSizePerBuffer); #endif // Default state and noise filter buffers go last. defaultStateBuffer = ptr; noiseMaskBuffer = ptr + sizePerBuffer; return(newDeviceOffsets); }