#I need a way to generate v128 entity enabled mask from a chunk using a query.

1 messages · Page 1 of 1 (latest)

viral drum
#

I am trying to create a function that runs IJobChunk.Execute() in managed code directly.

Unity actually have a function for this inside IJobChunk named "RunByRefWithoutJobs" but it is internal...

I succeeded getting these variables:
chunk
query.ToArchetypeChunkList();
unfilteredChunkIndex:
query.CalculateFilteredChunkIndexArray();

Only enabled mask is missing.
Even though i found a way using query.Matches(entity) + chunk.GetNativeArray(EntityTypeHandle), it would be cool if i were to literally get it using a function.

Of course, the Unity also gets enabled mask via an utility class which i dont have access to:
ChunkIterationUtility.GetEnabledMask(chunkIndexInArchetype, chunkEntityCount, _CurrentArchetypeState, out enableBits);

#
public static void RunWithoutJobs<T>(this ref T job, ref SystemState state, EntityQuery query)
    where T: struct, IJobChunk
{
    NativeList<ArchetypeChunk> chunks = new (Allocator.Temp);
    query.ToArchetypeChunkList(chunks);

    NativeArray<int> filteredChunkIndices = query.CalculateFilteredChunkIndexArray(Allocator.Temp);
    EntityTypeHandle entityTypeHandle = state.GetEntityTypeHandle();

    for (int i = 0; i < filteredChunkIndices.Length; i++)
    {
        ArchetypeChunk chunk = chunks[filteredChunkIndices[i]];
        NativeArray<Entity> entities = chunk.GetNativeArray(entityTypeHandle);

        /*
        // 1. Iterate over entities
        // 2. Shift 2 ulong values (128 bit) using query.Matches(Entity)
        // 3. generate v128
        // But this is already what query.Matches(Entity) does at the background :d So 2x extra overhead.

        ChunkIterationUtility.GetEnabledMask(chunkIndexInArchetype, chunkEntityCount, _CurrentArchetypeState, out enableBits);
        if (enableBits.ULong0 == 0 && enableBits.ULong1 == 0)
        {
            chunkIndexInCache++;
            continue;
        }

        var enabledCount = EnabledBitUtility.countbits(enableBits);
        useEnableBits = enabledCount != chunkEntityCount;

        job.Execute(in chunk, i, );
        */
    }
#

I need a way to generate v128 entity enabled mask from a chunk using a query.