Exemplo n.º 1
0
        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
        }
Exemplo n.º 2
0
        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
        }