public void Dispose() { for (int i = 0; i < m_BurstIntrinsicsArray.Length; i++) { Occlusion.MOC.BurstIntrinsics *mocBurstIntrinsics = (Occlusion.MOC.BurstIntrinsics *)m_BurstIntrinsicsArray[i]; mocBurstIntrinsics->Destroy(); Memory.Unmanaged.Free(mocBurstIntrinsics, Allocator.Persistent); } m_BurstIntrinsicsArray.Dispose(); #if UNITY_MOC_NATIVE_AVAILABLE for (int i = 0; i < m_MocNativeArray.Length; i++) { INTEL_MOC.MOCNative.DestroyMOC((void *)(m_MocNativeArray[i])); m_MocNativeArray[i] = IntPtr.Zero; } m_MocNativeArray.Dispose(); #endif }
public void Create(EntityManager entityManager) { m_OccluderGroup = entityManager.CreateEntityQuery(new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <WorldRenderBounds>(), ComponentType.ReadOnly <LocalToWorld>(), ComponentType.ChunkComponentReadOnly <HybridChunkInfo>(), ComponentType.ReadOnly <OcclusionMesh>(), }, }); m_ProxyOccluderGroup = entityManager.CreateEntityQuery(new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <LocalToWorld>(), ComponentType.ReadOnly <OcclusionMesh>(), }, None = new[] { ComponentType.ReadOnly <RenderMesh>(), } }); m_OcclusionTestTransformGroup = entityManager.CreateEntityQuery(new EntityQueryDesc { All = new[] { ComponentType.ReadOnly <RenderBounds>(), ComponentType.ReadOnly <LocalToWorld>(), ComponentType.ReadOnly <OcclusionTest>(), }, }); m_OcclusionTestGroup = entityManager.CreateEntityQuery(new EntityQueryDesc { All = new[] { ComponentType.ChunkComponentReadOnly <HybridChunkInfo>(), ComponentType.ReadOnly <OcclusionTest>(), }, }); //We rasterize multiple depthBuffer in parallel and then merge them together. //For a 512x512 depth buffer the memory size is around 100KB per depth buffer //after a certain amount of parallel job we stop getting performance gain when scaling so for now we limit the amount of depth buffer available to 10 to limit our memory usage int mocCount = Math.Min(10, Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobWorkerMaximumCount); m_BurstIntrinsicsArray = new NativeArray <IntPtr>(mocCount, Allocator.Persistent); for (int i = 0; i < m_BurstIntrinsicsArray.Length; i++) { Occlusion.MOC.BurstIntrinsics *mocBurstIntrinsics = (MOC.BurstIntrinsics *)Memory.Unmanaged.Allocate(sizeof(MOC.BurstIntrinsics), 64, Allocator.Persistent); mocBurstIntrinsics->Create((uint)m_MOCDepthSize, (uint)m_MOCDepthSize); m_BurstIntrinsicsArray[i] = (IntPtr)mocBurstIntrinsics; } #if UNITY_MOC_NATIVE_AVAILABLE m_MocNativeArray = new NativeArray <IntPtr>(mocCount, Allocator.Persistent); for (int i = 0; i < m_MocNativeArray.Length; i++) { // TODO: make chosable, propagate to settings void *mocNative = INTEL_MOC.MOCNative.CreateMOC( //INTEL_MOC.WantedImplementation.AUTO //INTEL_MOC.WantedImplementation.SSE2 INTEL_MOC.WantedImplementation.SSE41 ); m_MocNativeArray[i] = (IntPtr)mocNative; } #endif }