static unsafe JobHandle Schedule(void *fullData, NativeArray <byte> prefilterData, int unfilteredLength, int innerloopBatchCount, bool isParallelFor, bool isFiltered, ref JobForEachCache cache, void *deferredCountData, JobHandle dependsOn, ScheduleMode mode) { #if ENABLE_UNITY_COLLECTIONS_CHECKS try { #endif if (isParallelFor) { var scheduleParams = new JobsUtility.JobScheduleParameters(fullData, cache.JobReflectionDataParallelFor, dependsOn, mode); if (isFiltered) { return(JobsUtility.ScheduleParallelForDeferArraySize(ref scheduleParams, innerloopBatchCount, deferredCountData, null)); } else { return(JobsUtility.ScheduleParallelFor(ref scheduleParams, unfilteredLength, innerloopBatchCount)); } } else { var scheduleParams = new JobsUtility.JobScheduleParameters(fullData, cache.JobReflectionData, dependsOn, mode); return(JobsUtility.Schedule(ref scheduleParams)); } #if ENABLE_UNITY_COLLECTIONS_CHECKS } catch (InvalidOperationException e) { prefilterData.Dispose(); throw e; } #endif }
static unsafe void Initialize <T>(ComponentSystemBase system, EntityQuery entityQuery, Type jobType, Type wrapperJobType, bool isParallelFor, ref JobForEachCache cache, out ProcessIterationData iterator, ref T jobData) where T : struct #if UNITY_DOTSPLAYER , IBaseJobForEach #endif { // Get the job reflection data and cache it if we don't already have it cached. if (isParallelFor && cache.JobReflectionDataParallelFor == IntPtr.Zero || !isParallelFor && cache.JobReflectionData == IntPtr.Zero) { #if UNITY_DOTSPLAYER if (cache.Types == null) { cache.Types = jobData.GetComponentTypes(out cache.ProcessTypesCount, out cache.FilterChanged); } var res = jobData.GetJobReflection(isParallelFor); #else var iType = GetIJobForEachInterface(jobType); if (cache.Types == null) { cache.Types = GetComponentTypes(jobType, iType, out cache.ProcessTypesCount, out cache.FilterChanged); } var res = GetJobReflection(jobType, wrapperJobType, iType, isParallelFor); #endif if (isParallelFor) { cache.JobReflectionDataParallelFor = res; } else { cache.JobReflectionData = res; } } // Update cached EntityQuery and ComponentSystem data. if (system != null) { if (cache.ComponentSystem != system) { cache.EntityQuery = system.GetEntityQueryInternal(cache.Types); // If the cached filter has changed, update the newly cached EntityQuery with those changes. if (cache.FilterChanged.Length != 0) { cache.EntityQuery.SetChangedVersionFilter(cache.FilterChanged); } // Otherwise, just reset our newly cached EntityQuery's filter. else { cache.EntityQuery.ResetFilter(); } cache.ComponentSystem = system; } } else if (entityQuery != default) { if (cache.EntityQuery != entityQuery) { // Cache the new EntityQuery and cache that our system is null. cache.EntityQuery = entityQuery; cache.ComponentSystem = null; } } var query = cache.EntityQuery; iterator.IsReadOnly0 = iterator.IsReadOnly1 = iterator.IsReadOnly2 = iterator.IsReadOnly3 = iterator.IsReadOnly4 = iterator.IsReadOnly5 = 0; fixed(int *isReadOnly = &iterator.IsReadOnly0) { for (var i = 0; i != cache.ProcessTypesCount; i++) { isReadOnly[i] = cache.Types[i].AccessModeType == ComponentType.AccessMode.ReadOnly ? 1 : 0; } } iterator.TypeIndex0 = iterator.TypeIndex1 = iterator.TypeIndex2 = iterator.TypeIndex3 = iterator.TypeIndex4 = iterator.TypeIndex5 = -1; fixed(int *typeIndices = &iterator.TypeIndex0) { for (var i = 0; i != cache.ProcessTypesCount; i++) { typeIndices[i] = cache.Types[i].TypeIndex; } } iterator.m_IsParallelFor = isParallelFor; iterator.m_Length = query.CalculateChunkCountWithoutFiltering(); iterator.GlobalSystemVersion = query._GetImpl()->_Access->EntityComponentStore->GlobalSystemVersion; #if ENABLE_UNITY_COLLECTIONS_CHECKS iterator.m_MaxIndex = iterator.m_Length - 1; iterator.m_MinIndex = 0; iterator.m_Safety0 = iterator.m_Safety1 = iterator.m_Safety2 = iterator.m_Safety3 = iterator.m_Safety4 = iterator.m_Safety5 = iterator.m_Safety6 = iterator.m_Safety7 = iterator.m_Safety8 = iterator.m_Safety9 = iterator.m_Safety10 = iterator.m_Safety11 = default(AtomicSafetyHandle); var bufferTypeCount = 0; iterator.m_SafetyReadOnlyCount = 0; fixed(AtomicSafetyHandle *safety = &iterator.m_Safety0) { for (var i = 0; i != cache.ProcessTypesCount; i++) { if (cache.Types[i].AccessModeType == ComponentType.AccessMode.ReadOnly) { safety[iterator.m_SafetyReadOnlyCount] = query.GetSafetyHandle(query.GetIndexInEntityQuery(cache.Types[i].TypeIndex)); iterator.m_SafetyReadOnlyCount++; if (cache.Types[i].IsBuffer) { safety[iterator.m_SafetyReadOnlyCount] = query.GetBufferSafetyHandle(query.GetIndexInEntityQuery(cache.Types[i].TypeIndex)); iterator.m_SafetyReadOnlyCount++; bufferTypeCount++; } } } } iterator.m_SafetyReadWriteCount = 0; fixed(AtomicSafetyHandle *safety = &iterator.m_Safety0) { for (var i = 0; i != cache.ProcessTypesCount; i++) { if (cache.Types[i].AccessModeType == ComponentType.AccessMode.ReadWrite) { safety[iterator.m_SafetyReadOnlyCount + iterator.m_SafetyReadWriteCount] = query.GetSafetyHandle(query.GetIndexInEntityQuery(cache.Types[i].TypeIndex)); iterator.m_SafetyReadWriteCount++; if (cache.Types[i].IsBuffer) { safety[iterator.m_SafetyReadOnlyCount + iterator.m_SafetyReadWriteCount] = query.GetBufferSafetyHandle(query.GetIndexInEntityQuery(cache.Types[i].TypeIndex)); iterator.m_SafetyReadWriteCount++; bufferTypeCount++; } } } } Assert.AreEqual(cache.ProcessTypesCount + bufferTypeCount, iterator.m_SafetyReadWriteCount + iterator.m_SafetyReadOnlyCount); #endif }