Unity 2022.3.17f1
Burst 1.8.17
Collections 2.5.1
I am currently in the process of jobifying some of my systems which rely on a native plugin.
The following code is throwing errors :
[BurstCompile]
public partial struct RayCastJob : IJob
{
[NativeDisableUnsafePtrRestriction]
public NarrowPhaseQuery NarrowPhaseQuery;
public float3 Origin;
public float3 Direction;
public RayCastSettings Settings;
public CollisionCollectorType CollectorType;
public RayCastResultCollector Collector;
[NativeDisableUnsafePtrRestriction]
public BroadPhaseLayerFilter BroadPhaseLayerFilter;
[NativeDisableUnsafePtrRestriction]
public ObjectLayerFilter ObjectLayerFilter;
public void Execute()
{
NarrowPhaseQuery.CastRay(Origin, Direction, Settings, CollectorType, ref Collector, BroadPhaseLayerFilter, ObjectLayerFilter);
}
}
public unsafe struct NarrowPhaseQuery : IDisposable, IEquatable<NarrowPhaseQuery>
{
internal readonly NativeHandle<JPH_NarrowPhaseQuery> Handle;
...
public bool CastRay(float3 origin, float3 direction, RayCastSettings settings,
CollisionCollectorType collectorType, ref RayCastResultCollector collector,
BroadPhaseLayerFilter? broadPhaseLayerFilter = null,
ObjectLayerFilter? objectLayerFilter = null)
{
NativeHandle<JPH_BroadPhaseLayerFilter>? broadPhaseLayerFilterHandle = broadPhaseLayerFilter == null ? null : broadPhaseLayerFilter.Value.Handle;
NativeHandle<JPH_ObjectLayerFilter>? objectLayerFilterHandle = objectLayerFilter == null ? null : objectLayerFilter.Value.Handle;
return Bindings.JPH_NarrowPhaseQuery_CastRay3(Handle, origin, direction, settings, collectorType, ref collector, broadPhaseLayerFilterHandle, objectLayerFilterHandle, null, null);
}
...
}
internal static unsafe partial class Bindings
{
public static bool JPH_NarrowPhaseQuery_CastRay3(NativeHandle<JPH_NarrowPhaseQuery> query, rvec3 origin, float3 direction, RayCastSettings settings, CollisionCollectorType collectorType, ref RayCastResultCollector collector, NativeHandle<JPH_BroadPhaseLayerFilter>? broadPhaseLayerFilter, NativeHandle<JPH_ObjectLayerFilter>? objectLayerFilter, NativeHandle<JPH_BodyFilter>? bodyFilter, NativeHandle<JPH_ShapeFilter>? shapeFilter)
{
fixed (RayCastResultCollector* ptr = &collector)
{
void* vPtr = ptr;
return UnsafeBindings.JPH_NarrowPhaseQuery_CastRay3(query, &origin, &direction, &settings, collectorType, RayCastResultCollector.AddResultFuncPointer.Value, vPtr, broadPhaseLayerFilter, objectLayerFilter, bodyFilter, shapeFilter);
}
}
}
internal static unsafe partial class UnsafeBindings
{
[DllImport("joltc", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
[return: NativeTypeName("bool")]
public static extern NativeBool JPH_NarrowPhaseQuery_CastRay3(
[NativeTypeName("const JPH_NarrowPhaseQuery *")] JPH_NarrowPhaseQuery* query,
[NativeTypeName("const JPH_RVec3 *")] rvec3* origin,
[NativeTypeName("const JPH_Vec3 *")] float3* direction,
[NativeTypeName("const JPH_RayCastSettings *")] RayCastSettings* rayCastSettings,
[NativeTypeName("JPH_CollisionCollectorType")] CollisionCollectorType collectorType,
[NativeTypeName("JPH_CastRayResultCallback *")] IntPtr callback, void* userData,
JPH_BroadPhaseLayerFilter* broadPhaseLayerFilter,
JPH_ObjectLayerFilter* objectLayerFilter,
[NativeTypeName("const JPH_BodyFilter *")] JPH_BodyFilter* bodyFilter,
[NativeTypeName("const JPH_ShapeFilter *")] JPH_ShapeFilter* shapeFilter);
}
I get the following error :
.\Library\PackageCache\com.unity.collections@2.5.1\Unity.Collections\Memory.cs(89,25): Burst error BC1091: External and internal calls are not allowed inside static constructors: Unity.Collections.LowLevel.Unsafe.UnsafeUtility.FreeTracked(void* memory, Unity.Collections.Allocator allocator)
at Unity.Collections.Memory.Unmanaged.Array.Resize(void* oldPointer, long oldCount, long newCount, Unity.Collections.AllocatorManager.AllocatorHandle allocator, long size, int align) (at .\Library\PackageCache\com.unity.collections@2.5.1\Unity.Collections\Memory.cs:89)
at Unity.Collections.Memory.Unmanaged.Free(void* pointer, Unity.Collections.AllocatorManager.AllocatorHandle allocator) (at .\Library\PackageCache\com.unity.collections@2.5.1\Unity.Collections\Memory.cs:27)
at Unity.Collections.AllocatorManager.TryLegacy(ref Unity.Collections.AllocatorManager.Block block) (at .\Library\PackageCache\com.unity.collections@2.5.1\Unity.Collections\AllocatorManager.cs:1105)
at Unity.Collections.AllocatorManager.Try(ref Unity.Collections.AllocatorManager.Block block) (at .\Library\PackageCache\com.unity.collections@2.5.1\Unity.Collections\AllocatorManager.cs:1129)
at Unity.Collections.Memory.Unmanaged.Array.CustomResize(void* oldPointer, long oldCount, long newCount, Unity.Collections.AllocatorManager.AllocatorHandle allocator, long size, int align) (at .\Library\PackageCache\com.unity.collections@2.5.1\Unity.Collections\Memory.cs:61)While compiling job:
Unity.Jobs.IJobExtensions+JobStruct`1[[Jolt.Samples.RayCastJob, Jolt.Samples, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(Jolt.Samples.RayCastJob&, Jolt.Samples, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
Commenting out the call to UnsafeBindings.JPH_NarrowPhaseQuery_CastRay3
makes the error disappear. I cant really see where static constructors are involved or if they are even involved in the first place.
Any help would be welcomed.