Exemplo n.º 1
0
        private void RecycleCommandListResources(CompiledCommandList commandList, long fenceValue)
        {
            // Set fence on staging textures
            foreach (var stagingResource in commandList.StagingResources)
            {
                stagingResource.StagingFenceValue = fenceValue;
            }

            StagingResourceLists.Release(commandList.StagingResources);
            commandList.StagingResources.Clear();

            // Recycle resources
            foreach (var heap in commandList.SrvHeaps)
            {
                SrvHeaps.RecycleObject(fenceValue, heap);
            }
            commandList.SrvHeaps.Clear();
            DescriptorHeapLists.Release(commandList.SrvHeaps);

            foreach (var heap in commandList.SamplerHeaps)
            {
                SamplerHeaps.RecycleObject(fenceValue, heap);
            }
            commandList.SamplerHeaps.Clear();
            DescriptorHeapLists.Release(commandList.SamplerHeaps);

            commandList.Builder.NativeCommandLists.Enqueue(commandList.NativeCommandList);
            CommandAllocators.RecycleObject(fenceValue, commandList.NativeCommandAllocator);
        }
        internal unsafe long ExecuteCommandListInternal(CompiledCommandList commandList)
        {
            //if (nativeUploadBuffer != VkBuffer.Null)
            //{
            //    NativeDevice.UnmapMemory(nativeUploadBufferMemory);
            //    TemporaryResources.Enqueue(new BufferInfo(NextFenceValue, nativeUploadBuffer, nativeUploadBufferMemory));

            //    nativeUploadBuffer = VkBuffer.Null;
            //    nativeUploadBufferMemory = VkDeviceMemory.Null;
            //}

            var fenceValue = NextFenceValue++;

            // Create new fence
            var fenceCreateInfo = new VkFenceCreateInfo {
                sType = VkStructureType.FenceCreateInfo
            };

            vkCreateFence(nativeDevice, &fenceCreateInfo, null, out var fence);

            using (FenceLock.WriteLock())
            {
                nativeFences.Add(new KeyValuePair <long, VkFence>(fenceValue, fence));
            }

            // Collect resources
            RecycleCommandListResources(commandList, fenceValue);

            // Submit commands
            var nativeCommandBufferCopy = commandList.NativeCommandBuffer;
            var pipelineStageFlags      = VkPipelineStageFlags.BottomOfPipe;

            var submitInfo = new VkSubmitInfo
            {
                sType = VkStructureType.SubmitInfo,
                commandBufferCount = 1,
                pCommandBuffers    = &nativeCommandBufferCopy,
                waitSemaphoreCount = 0U,
                pWaitSemaphores    = null,
                pWaitDstStageMask  = &pipelineStageFlags,
            };

            using (QueueLock.ReadLock())
            {
                vkQueueSubmit(NativeCommandQueue, 1, &submitInfo, fence);
            }

            nativeResourceCollector.Release();
            graphicsResourceLinkCollector.Release();

            return(fenceValue);
        }
Exemplo n.º 3
0
        internal long ExecuteCommandListInternal(CompiledCommandList commandList)
        {
            var fenceValue = NextFenceValue++;

            // Submit and signal fence
            NativeCommandQueue.ExecuteCommandList(commandList.NativeCommandList);
            NativeCommandQueue.Signal(nativeFence, fenceValue);

            // Recycle resources
            RecycleCommandListResources(commandList, fenceValue);

            return(fenceValue);
        }
        internal unsafe long ExecuteCommandListInternal(CompiledCommandList commandList)
        {
            //if (nativeUploadBuffer != SharpVulkan.Buffer.Null)
            //{
            //    NativeDevice.UnmapMemory(nativeUploadBufferMemory);
            //    TemporaryResources.Enqueue(new BufferInfo(NextFenceValue, nativeUploadBuffer, nativeUploadBufferMemory));

            //    nativeUploadBuffer = SharpVulkan.Buffer.Null;
            //    nativeUploadBufferMemory = DeviceMemory.Null;
            //}

            var fenceValue = NextFenceValue++;

            // Create new fence
            var fenceCreateInfo = new FenceCreateInfo {
                StructureType = StructureType.FenceCreateInfo
            };
            var fence = nativeDevice.CreateFence(ref fenceCreateInfo);

            nativeFences.Enqueue(new KeyValuePair <long, Fence>(fenceValue, fence));

            // Collect resources
            RecycleCommandListResources(commandList, fenceValue);

            // Submit commands
            var nativeCommandBufferCopy = commandList.NativeCommandBuffer;
            var pipelineStageFlags      = PipelineStageFlags.BottomOfPipe;

            var submitInfo = new SubmitInfo
            {
                StructureType      = StructureType.SubmitInfo,
                CommandBufferCount = 1,
                CommandBuffers     = new IntPtr(&nativeCommandBufferCopy),
                WaitSemaphoreCount = 0U,
                WaitSemaphores     = IntPtr.Zero,
                WaitDstStageMask   = new IntPtr(&pipelineStageFlags),
            };

            using (QueueLock.ReadLock())
            {
                NativeCommandQueue.Submit(1, &submitInfo, fence);
            }

            nativeResourceCollector.Release();
            graphicsResourceLinkCollector.Release();

            return(fenceValue);
        }
        private void RecycleCommandListResources(CompiledCommandList commandList, long fenceValue)
        {
            // Set fence on staging textures
            foreach (var stagingResource in commandList.StagingResources)
            {
                stagingResource.StagingFenceValue = fenceValue;
            }

            StagingResourceLists.Release(commandList.StagingResources);
            commandList.StagingResources.Clear();

            // Recycle all resources
            foreach (var descriptorPool in commandList.DescriptorPools)
            {
                DescriptorPools.RecycleObject(fenceValue, descriptorPool);
            }
            DescriptorPoolLists.Release(commandList.DescriptorPools);
            commandList.DescriptorPools.Clear();

            commandList.Builder.CommandBufferPool.RecycleObject(fenceValue, commandList.NativeCommandBuffer);
        }
 /// <summary>
 /// Executes a deferred command list.
 /// </summary>
 /// <param name="commandList">The deferred command list.</param>
 public void ExecuteCommandList(CompiledCommandList commandList)
 {
     ExecuteCommandListInternal(commandList);
 }
Exemplo n.º 7
0
 /// <summary>
 /// Executes a deferred command list.
 /// </summary>
 /// <param name="commandList">The deferred command list.</param>
 public void ExecuteCommandList(CompiledCommandList commandList)
 {
     throw new NotImplementedException();
 }