Пример #1
0
        public void FreeAll()
        {
            if (m_AllBuffers != null)
            {
                UnsafeUtility.Free(m_AllBuffers, Allocator.Persistent);
                m_AllBuffers = null;
            }

            m_DynamicUpdateBuffers = new DoubleBuffers();
            m_FixedUpdateBuffers   = new DoubleBuffers();

#if UNITY_EDITOR
            m_EditorUpdateBuffers = new DoubleBuffers();
#endif

            s_CurrentBuffers = new DoubleBuffers();

            if (s_DefaultStateBuffer == defaultStateBuffer)
            {
                s_DefaultStateBuffer = null;
            }

            defaultStateBuffer = null;

            if (s_NoiseMaskBuffer == noiseMaskBuffer)
            {
                s_NoiseMaskBuffer = null;
            }

            noiseMaskBuffer = null;

            totalSize     = 0;
            sizePerBuffer = 0;
        }
Пример #2
0
        public unsafe void FreeAll()
        {
            if (m_AllBuffers != IntPtr.Zero)
            {
                UnsafeUtility.Free(m_AllBuffers.ToPointer(), Allocator.Persistent);
                m_AllBuffers = IntPtr.Zero;
            }

            m_DynamicUpdateBuffers = new DoubleBuffers();
            m_FixedUpdateBuffers   = new DoubleBuffers();

#if UNITY_EDITOR
            m_EditorUpdateBuffers = new DoubleBuffers();
#endif

            s_CurrentBuffers = new DoubleBuffers();

            if (s_DefaultStateBuffer == defaultStateBuffer)
            {
                s_DefaultStateBuffer = IntPtr.Zero;
            }

            defaultStateBuffer = IntPtr.Zero;

            if (s_NoiseBitmaskBuffer == noiseBitmaskBuffer)
            {
                s_NoiseBitmaskBuffer = IntPtr.Zero;
            }

            noiseBitmaskBuffer = IntPtr.Zero;

            totalSize     = 0;
            sizePerBuffer = 0;
        }
Пример #3
0
        // Switch the current set of buffers used by the system.
        public void SwitchTo(InputUpdateType update)
        {
            switch (update)
            {
            case InputUpdateType.Dynamic:
                s_CurrentBuffers = m_DynamicUpdateBuffers;
                break;

            case InputUpdateType.Fixed:
                s_CurrentBuffers = m_FixedUpdateBuffers;
                break;

            case InputUpdateType.BeforeRender:
                if (m_DynamicUpdateBuffers.valid)
                {
                    s_CurrentBuffers = m_DynamicUpdateBuffers;
                }
                else
                {
                    s_CurrentBuffers = m_FixedUpdateBuffers;
                }
                break;

#if UNITY_EDITOR
            case InputUpdateType.Editor:
                s_CurrentBuffers = m_EditorUpdateBuffers;
                break;
#endif
            }
        }
        // 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 unsafe uint[] AllocateAll(InputUpdateType updateMask, InputDevice[] devices)
        {
            uint[] newDeviceOffsets = null;
            sizePerBuffer = ComputeSizeOfSingleBufferAndOffsetForEachDevice(devices, ref newDeviceOffsets);
            if (sizePerBuffer == 0)
            {
                return(null);
            }
            sizePerBuffer = NumberHelpers.AlignToMultiple(sizePerBuffer, 4);

            var isDynamicUpdateEnabled = (updateMask & InputUpdateType.Dynamic) == InputUpdateType.Dynamic;
            var isFixedUpdateEnabled   = (updateMask & InputUpdateType.Fixed) == InputUpdateType.Fixed;

            // Determine how much memory we need.
            var deviceCount = devices.Length;
            var mappingTableSizePerBuffer = (uint)(deviceCount * sizeof(void *) * 2);

            if (isDynamicUpdateEnabled)
            {
                totalSize += sizePerBuffer * 2;
                totalSize += mappingTableSizePerBuffer;
            }
            if (isFixedUpdateEnabled)
            {
                totalSize += sizePerBuffer * 2;
                totalSize += mappingTableSizePerBuffer;
            }
            // Before render doesn't have its own buffers.

#if UNITY_EDITOR
            totalSize += sizePerBuffer * 2;
            totalSize += mappingTableSizePerBuffer;
#endif

            // Allocate.
            m_AllBuffers = (IntPtr)UnsafeUtility.Malloc(totalSize, 4, Allocator.Persistent);
            UnsafeUtility.MemClear(m_AllBuffers.ToPointer(), totalSize);

            // Set up device to buffer mappings.
            var ptr = m_AllBuffers;
            if (isDynamicUpdateEnabled)
            {
                m_DynamicUpdateBuffers =
                    SetUpDeviceToBufferMappings(devices, ref ptr, sizePerBuffer, mappingTableSizePerBuffer);
            }
            if (isFixedUpdateEnabled)
            {
                m_FixedUpdateBuffers =
                    SetUpDeviceToBufferMappings(devices, ref ptr, sizePerBuffer, mappingTableSizePerBuffer);
            }

#if UNITY_EDITOR
            m_EditorUpdateBuffers =
                SetUpDeviceToBufferMappings(devices, ref ptr, sizePerBuffer, mappingTableSizePerBuffer);
#endif

            return(newDeviceOffsets);
        }
Пример #5
0
        private static void MigrateDoubleBuffer(DoubleBuffers newBuffer, InputDevice[] devices, int deviceCount, DoubleBuffers oldBuffer)
        {
            // Nothing to migrate if we no longer keep a buffer of the corresponding type.
            if (!newBuffer.valid)
            {
                return;
            }

            // We do the same if we don't had a corresponding buffer before.
            if (!oldBuffer.valid)
            {
                return;
            }

            // Migrate every device that has allocated state blocks.
            var newStateBlockOffset = 0u;

            for (var i = 0; i < deviceCount; ++i)
            {
                var device = devices[i];

                // Stop as soon as we're hitting a new device. Newly added devices *must* be *appended* to the
                // array as otherwise our computing of offsets into the old buffer may be wrong.
                // NOTE: This also means that device indices of
                if (device.m_StateBlock.byteOffset == InputStateBlock.InvalidOffset)
                {
                    #if DEVELOPMENT_BUILD || UNITY_EDITOR
                    for (var n = i + 1; n < deviceCount; ++n)
                    {
                        Debug.Assert(devices[n].m_StateBlock.byteOffset == InputStateBlock.InvalidOffset,
                                     "New devices must be appended to the array; found an old device coming in the array after a newly added device");
                    }
                    #endif
                    break;
                }

                var oldDeviceIndex = device.m_DeviceIndex;
                var newDeviceIndex = i;
                var numBytes       = device.m_StateBlock.alignedSizeInBytes;

                var oldFrontPtr = (byte *)oldBuffer.GetFrontBuffer(oldDeviceIndex) + (int)device.m_StateBlock.byteOffset; // m_StateBlock still refers to oldBuffer.
                var oldBackPtr  = (byte *)oldBuffer.GetBackBuffer(oldDeviceIndex) + (int)device.m_StateBlock.byteOffset;

                var newFrontPtr = (byte *)newBuffer.GetFrontBuffer(newDeviceIndex) + (int)newStateBlockOffset;
                var newBackPtr  = (byte *)newBuffer.GetBackBuffer(newDeviceIndex) + (int)newStateBlockOffset;

                // Copy state.
                UnsafeUtility.MemCpy(newFrontPtr, oldFrontPtr, numBytes);
                UnsafeUtility.MemCpy(newBackPtr, oldBackPtr, numBytes);

                newStateBlockOffset = NextDeviceOffset(newStateBlockOffset, device);
            }
        }
Пример #6
0
        private unsafe void MigrateDoubleBuffer(DoubleBuffers newBuffer, InputDevice[] devices, int deviceCount, uint[] newStateBlockOffsets, DoubleBuffers oldBuffer, int[] oldDeviceIndices)
        {
            // Nothing to migrate if we no longer keep a buffer of the corresponding type.
            if (!newBuffer.valid)
            {
                return;
            }

            // We do the same if we don't had a corresponding buffer before.
            if (!oldBuffer.valid)
            {
                return;
            }

            ////TOOD: if we assume linear layouts of devices in 'devices' and assume that new devices are only added
            ////      at the end and only single devices can be removed, we can copy state buffers much more efficiently
            ////      in bulk rather than device-by-device

            // Migrate every device that has allocated state blocks.
            var newDeviceCount = deviceCount;
            var oldDeviceCount = oldDeviceIndices != null ? oldDeviceIndices.Length : newDeviceCount;

            for (var i = 0; i < newDeviceCount && i < oldDeviceCount; ++i)
            {
                var device = devices[i];
                Debug.Assert(device.m_DeviceIndex == i);

                // Skip device if it's a newly added device.
                if (device.m_StateBlock.byteOffset == InputStateBlock.kInvalidOffset)
                {
                    continue;
                }

                ////FIXME: this is not protecting against devices that have changed their formats between domain reloads

                var oldDeviceIndex = oldDeviceIndices != null ? oldDeviceIndices[i] : i;
                var newDeviceIndex = i;
                var numBytes       = device.m_StateBlock.alignedSizeInBytes;

                var oldFrontPtr = (byte *)oldBuffer.GetFrontBuffer(oldDeviceIndex).ToPointer() + (int)device.m_StateBlock.byteOffset;
                var oldBackPtr  = (byte *)oldBuffer.GetBackBuffer(oldDeviceIndex).ToPointer() + (int)device.m_StateBlock.byteOffset;

                var newFrontPtr = (byte *)newBuffer.GetFrontBuffer(newDeviceIndex).ToPointer() + (int)newStateBlockOffsets[i];
                var newBackPtr  = (byte *)newBuffer.GetBackBuffer(newDeviceIndex).ToPointer() + (int)newStateBlockOffsets[i];

                // Copy state.
                UnsafeUtility.MemCpy(newFrontPtr, oldFrontPtr, numBytes);
                UnsafeUtility.MemCpy(newBackPtr, oldBackPtr, numBytes);
            }
        }
Пример #7
0
        public ShipDockComponentManager()
        {
            mComponent = default;
            mIDMapper  = new KeyValueList <int, int>();
            mMapper    = new IntegerMapper <IShipDockComponent>();

            mDeletdComponents = new List <int>();
            mUpdateByTicks    = new List <IShipDockComponent>();
            mUpdateByScene    = new List <IShipDockComponent>();

            mQueueUpdateTime    = new DoubleBuffers <int>();
            mQueueUpdateEntitas = new DoubleBuffers <IShipDockEntitas>();
            mQueueUpdateExecute = new DoubleBuffers <Action <int, IShipDockEntitas> >();

            mQueueUpdateExecute.OnDequeue += OnQueueUpdateExecute;
        }
Пример #8
0
        // 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);
        }
        public unsafe void FreeAll()
        {
            if (m_AllBuffers != IntPtr.Zero)
            {
                UnsafeUtility.Free(m_AllBuffers.ToPointer(), Allocator.Persistent);
                m_AllBuffers = IntPtr.Zero;
            }

            m_DynamicUpdateBuffers = new DoubleBuffers();
            m_FixedUpdateBuffers   = new DoubleBuffers();

#if UNITY_EDITOR
            m_EditorUpdateBuffers = new DoubleBuffers();
#endif

            s_CurrentBuffers = new DoubleBuffers();
        }
Пример #10
0
        private static DoubleBuffers SetUpDeviceToBufferMappings(int deviceCount, ref byte *bufferPtr, uint sizePerBuffer, uint mappingTableSizePerBuffer)
        {
            var front    = bufferPtr;
            var back     = bufferPtr + sizePerBuffer;
            var mappings = (void **)(bufferPtr + sizePerBuffer * 2);  // Put mapping table at end.

            bufferPtr += sizePerBuffer * 2 + mappingTableSizePerBuffer;

            var buffers = new DoubleBuffers {
                deviceToBufferMapping = mappings
            };

            for (var i = 0; i < deviceCount; ++i)
            {
                var deviceIndex = i;
                buffers.SetFrontBuffer(deviceIndex, front);
                buffers.SetBackBuffer(deviceIndex, back);
            }

            return(buffers);
        }
Пример #11
0
        private unsafe DoubleBuffers SetUpDeviceToBufferMappings(InputDevice[] devices, int deviceCount, ref IntPtr bufferPtr, uint sizePerBuffer, uint mappingTableSizePerBuffer)
        {
            var front    = bufferPtr;
            var back     = new IntPtr(bufferPtr.ToInt64() + sizePerBuffer);
            var mappings = (void **)new IntPtr(bufferPtr.ToInt64() + sizePerBuffer * 2).ToPointer();  // Put mapping table at end.

            bufferPtr = new IntPtr(bufferPtr.ToInt64() + sizePerBuffer * 2 + mappingTableSizePerBuffer);

            var buffers = new DoubleBuffers {
                deviceToBufferMapping = mappings
            };

            for (var i = 0; i < deviceCount; ++i)
            {
                var deviceIndex = devices[i].m_DeviceIndex;

                buffers.SetFrontBuffer(deviceIndex, front);
                buffers.SetBackBuffer(deviceIndex, back);
            }

            return(buffers);
        }
Пример #12
0
 // Switch the current set of buffers used by the system.
 public static void SwitchTo(InputStateBuffers buffers, InputUpdateType update)
 {
     s_CurrentBuffers = buffers.GetDoubleBuffersFor(update);
 }
Пример #13
0
        // 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(InputUpdateType updateMask, InputDevice[] devices, int deviceCount)
        {
            uint[] newDeviceOffsets = null;
            sizePerBuffer = ComputeSizeOfSingleBufferAndOffsetForEachDevice(devices, deviceCount, ref newDeviceOffsets);
            if (sizePerBuffer == 0)
            {
                return(null);
            }
            sizePerBuffer = NumberHelpers.AlignToMultiple(sizePerBuffer, 4);

            var isDynamicUpdateEnabled = (updateMask & InputUpdateType.Dynamic) != 0;
            var isFixedUpdateEnabled   = (updateMask & InputUpdateType.Fixed) != 0;
            var isManualUpdateEnabled  = (updateMask & InputUpdateType.Manual) != 0;

            // Determine how much memory we need.
            var mappingTableSizePerBuffer = (uint)(deviceCount * sizeof(void *) * 2);

            if (isDynamicUpdateEnabled)
            {
                totalSize += sizePerBuffer * 2;
                totalSize += mappingTableSizePerBuffer;
            }
            if (isFixedUpdateEnabled)
            {
                totalSize += sizePerBuffer * 2;
                totalSize += mappingTableSizePerBuffer;
            }
            if (isManualUpdateEnabled)
            {
                totalSize += sizePerBuffer * 2;
                totalSize += mappingTableSizePerBuffer;
            }
            // Before render doesn't have its own buffers.

            #if UNITY_EDITOR
            totalSize += sizePerBuffer * 2;
            totalSize += mappingTableSizePerBuffer;
            #endif

            // Plus 2 more buffers (1 for default states, and one for noise filters).
            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;
            if (isDynamicUpdateEnabled)
            {
                m_DynamicUpdateBuffers =
                    SetUpDeviceToBufferMappings(devices, deviceCount, ref ptr, sizePerBuffer,
                                                mappingTableSizePerBuffer);
            }
            if (isFixedUpdateEnabled)
            {
                m_FixedUpdateBuffers =
                    SetUpDeviceToBufferMappings(devices, deviceCount, ref ptr, sizePerBuffer,
                                                mappingTableSizePerBuffer);
            }
            if (isManualUpdateEnabled)
            {
                m_ManualUpdateBuffers =
                    SetUpDeviceToBufferMappings(devices, deviceCount, ref ptr, sizePerBuffer,
                                                mappingTableSizePerBuffer);
            }

            #if UNITY_EDITOR
            m_EditorUpdateBuffers =
                SetUpDeviceToBufferMappings(devices, deviceCount, ref ptr, sizePerBuffer, mappingTableSizePerBuffer);
            #endif

            // Default state and noise filter buffers go last.
            defaultStateBuffer = ptr;
            noiseMaskBuffer    = ptr + sizePerBuffer;

            return(newDeviceOffsets);
        }
Пример #14
0
 public TicksLater() : base()
 {
     mDoubleBuffer            = new DoubleBuffers <Action <int> >();
     mDoubleBuffer.OnDequeue += OnTicksLater;
 }