예제 #1
0
        public void EndExclusiveTransaction()
        {
            if (!IsInTransaction)
            {
                return;
            }

            m_ExclusiveTransactionDependency.Complete();

#if ENABLE_UNITY_COLLECTIONS_CHECKS
            var res = AtomicSafetyHandle.EnforceAllBufferJobsHaveCompletedAndRelease(ExclusiveTransactionSafety);
            if (res != EnforceJobResult.AllJobsAlreadySynced)
            {
                //@TODO: Better message
                Debug.LogError("ExclusiveEntityTransaction job has not been registered");
            }
#endif
            IsInTransaction = false;

#if ENABLE_UNITY_COLLECTIONS_CHECKS
            for (var i = 0; i != TypeManager.GetTypeCount(); i++)
            {
                m_ComponentSafetyHandles[i].SafetyHandle = AtomicSafetyHandle.Create();
                AtomicSafetyHandle.SetAllowSecondaryVersionWriting(m_ComponentSafetyHandles[i].SafetyHandle, false);
            }
#endif
        }
예제 #2
0
        public void BeginExclusiveTransaction()
        {
            if (IsInTransaction)
            {
                return;
            }

#if ENABLE_UNITY_COLLECTIONS_CHECKS
            for (var i = 0; i != TypeManager.GetTypeCount(); i++)
            {
                AtomicSafetyHandle.CheckDeallocateAndThrow(m_ComponentSafetyHandles[i].SafetyHandle);
                AtomicSafetyHandle.CheckDeallocateAndThrow(m_ComponentSafetyHandles[i].BufferHandle);
            }

            for (var i = 0; i != TypeManager.GetTypeCount(); i++)
            {
                AtomicSafetyHandle.Release(m_ComponentSafetyHandles[i].SafetyHandle);
                AtomicSafetyHandle.Release(m_ComponentSafetyHandles[i].BufferHandle);
            }
#endif

            IsInTransaction = true;
#if ENABLE_UNITY_COLLECTIONS_CHECKS
            ExclusiveTransactionSafety = AtomicSafetyHandle.Create();
#endif
            m_ExclusiveTransactionDependency = GetAllDependencies();
        }
예제 #3
0
        internal static int CallTypeIndexForStableTypeHash(ulong typeHash)
        {
            for (int i = 0; i < TypeManager.GetTypeCount(); ++i)
            {
                var t = TypeManager.GetTypeInfo(i);
                if (typeHash == t.StableTypeHash)
                {
                    return(t.TypeIndex);
                }
            }

            return(-1);
        }
예제 #4
0
        public SharedComponentDataManager()
        {
            var actualCount = TypeManager.GetTypeCount() - SharedComponentTypeStart;

            dataArray = new Element[actualCount];
            for (int i = 0; i < dataArray.Length; i++)
            {
                var type = TypeManager.GetType(i + SharedComponentTypeStart);
                if (!ISharedComponentDataType.IsAssignableFrom(type) || !type.IsValueType)
                {
                    continue;
                }
                dataArray[i] = Element.Create(128, type);
            }
        }
예제 #5
0
        public List <Type> GetAssignableComponentTypes(Type interfaceType)
        {
            int         typeCount = TypeManager.GetTypeCount();
            List <Type> list      = new List <Type>();

            for (int i = 0; i < typeCount; i++)
            {
                Type c = TypeManager.GetType(i);
                if (interfaceType.IsAssignableFrom(c))
                {
                    list.Add(c);
                }
            }
            return(list);
        }
예제 #6
0
        public List <Type> GetAssignableComponentTypes(Type interfaceType, List <Type> listOut)
        {
            // #todo Cache this. It only can change when TypeManager.GetTypeCount() changes
            var componentTypeCount = TypeManager.GetTypeCount();

            for (var i = 0; i < componentTypeCount; i++)
            {
                var type = TypeManager.GetType(i);
                if (interfaceType.IsAssignableFrom(type))
                {
                    listOut.Add(type);
                }
            }

            return(listOut);
        }
        //@TODO: Optimize as one function call to in batch bump version on every single handle...
        public void CompleteAllJobsAndInvalidateArrays()
        {
            if (m_HasCleanHandles)
            {
                return;
            }

            Profiler.BeginSample("CompleteAllJobsAndInvalidateArrays");

            var count = TypeManager.GetTypeCount();

            for (var t = 0; t != count; t++)
            {
                m_ComponentSafetyHandles[t].WriteFence.Complete();

                var readFencesCount = m_ComponentSafetyHandles[t].NumReadFences;
                var readFences      = m_ReadJobFences + t * kMaxReadJobHandles;
                for (var r = 0; r != readFencesCount; r++)
                {
                    readFences[r].Complete();
                }
                m_ComponentSafetyHandles[t].NumReadFences = 0;
            }

#if ENABLE_UNITY_COLLECTIONS_CHECKS
            for (var i = 0; i != count; i++)
            {
                AtomicSafetyHandle.CheckDeallocateAndThrow(m_ComponentSafetyHandles[i].SafetyHandle);
                AtomicSafetyHandle.CheckDeallocateAndThrow(m_ComponentSafetyHandles[i].BufferHandle);
            }

            for (var i = 0; i != count; i++)
            {
                AtomicSafetyHandle.Release(m_ComponentSafetyHandles[i].SafetyHandle);
                m_ComponentSafetyHandles[i].SafetyHandle = AtomicSafetyHandle.Create();
                AtomicSafetyHandle.SetAllowSecondaryVersionWriting(m_ComponentSafetyHandles[i].SafetyHandle, false);

                AtomicSafetyHandle.Release(m_ComponentSafetyHandles[i].BufferHandle);
                m_ComponentSafetyHandles[i].BufferHandle = AtomicSafetyHandle.Create();
            }
#endif

            m_HasCleanHandles = true;

            Profiler.EndSample();
        }
예제 #8
0
        private void ReAlloc(int requiredComponentTypeIndexNotModified)
        {
            var oldLength = dataArray.Length;

            if (requiredComponentTypeIndexNotModified < oldLength + SharedComponentTypeStart)
            {
                return;
            }
            var currentActualLength = TypeManager.GetTypeCount() - SharedComponentTypeStart;

            for (int i = currentActualLength - 1; i >= oldLength; --i)
            {
                var type = TypeManager.GetType(i + SharedComponentTypeStart);
                if (!type.IsValueType || !ISharedComponentDataType.IsAssignableFrom(type))
                {
                    continue;
                }
                var tmp = new Element[i + 1];
                Buffer.BlockCopy(dataArray, 0, tmp, 0, dataArray.Length);
                dataArray    = tmp;
                dataArray[i] = Element.Create(128, type);
                break;
            }
            for (int i = dataArray.Length - 2; i >= oldLength; --i)
            {
                var type = TypeManager.GetType(i + SharedComponentTypeStart);
                if (!ISharedComponentDataType.IsAssignableFrom(type) || !type.IsValueType || (type.IsGenericType && type.IsGenericTypeDefinition))
                {
                    continue;
                }
#if REF_EQUATABLE
                var EqualsMethodInfo = type.GetMethod("Equals", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, null, CallingConventions.Any, EqualsTypeArray, null);
                if (EqualsMethodInfo == null || EqualsMethodInfo.DeclaringType != type)
                {
                    throw new Exception(type.FullName);
                }
                var GetHashCodeMethodInfo = type.GetMethod("GetHashCode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, null, CallingConventions.Any, Array.Empty <Type>(), null);
                if (GetHashCodeMethodInfo == null || GetHashCodeMethodInfo.DeclaringType != type)
                {
                    throw new Exception(type.FullName);
                }
#endif
                dataArray[i] = Element.Create(128, type);
            }
        }
예제 #9
0
        static SharedComponentDataManager()
        {
            TypeManager.Initialize();
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();

            ISharedComponentDataType = typeof(ISharedComponentData);
            for (int i = 0; i < assemblies.Length; ++i)
            {
                var types = assemblies[i].GetTypes();
                for (int j = 0; j < types.Length; ++j)
                {
                    if (!types[j].IsValueType || !ISharedComponentDataType.IsAssignableFrom(types[j]) || (types[j].IsGenericType && types[j].IsGenericTypeDefinition))
                    {
                        continue;
                    }
                    TypeManager.GetTypeIndex(types[j]);
                }
            }
            for (int i = 1, length = TypeManager.GetTypeCount(); i < length; ++i)
            {
                var type = TypeManager.GetType(i);
                if (!type.IsValueType || !ISharedComponentDataType.IsAssignableFrom(type) || (type.IsGenericType && type.IsGenericTypeDefinition))
                {
                    continue;
                }
#if REF_EQUATABLE
                var EqualsMethodInfo = type.GetMethod("Equals", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, null, CallingConventions.Any, EqualsTypeArray, null);
                if (EqualsMethodInfo == null || EqualsMethodInfo.DeclaringType != type)
                {
                    throw new Exception(type.FullName);
                }
                var GetHashCodeMethodInfo = type.GetMethod("GetHashCode", BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, null, CallingConventions.Any, Array.Empty <Type>(), null);
                if (GetHashCodeMethodInfo == null || GetHashCodeMethodInfo.DeclaringType != type)
                {
                    throw new Exception(type.FullName);
                }
#endif
                SharedComponentTypeStart = i;
                break;
            }
        }
예제 #10
0
        JobHandle GetAllDependencies()
        {
            var jobHandles = new NativeArray <JobHandle>(TypeManager.GetTypeCount() * (kMaxReadJobHandles + 1), Allocator.Temp);

            var count = 0;

            for (var i = 0; i != TypeManager.GetTypeCount(); i++)
            {
                jobHandles[count++] = m_ComponentSafetyHandles[i].WriteFence;

                var numReadFences = m_ComponentSafetyHandles[i].NumReadFences;
                for (var j = 0; j != numReadFences; j++)
                {
                    jobHandles[count++] = m_ReadJobFences[i * kMaxReadJobHandles + j];
                }
            }

            var combined = JobHandle.CombineDependencies(jobHandles);

            jobHandles.Dispose();

            return(combined);
        }