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); }
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); }
/// <summary> /// Executes a deferred command list. /// </summary> /// <param name="commandList">The deferred command list.</param> public void ExecuteCommandList(CompiledCommandList commandList) { throw new NotImplementedException(); }