Exemplo n.º 1
0
        /// <summary>
        /// Executes multiple deferred command lists.
        /// </summary>
        /// <param name="count">Number of command lists to execute.</param>
        /// <param name="commandLists">The deferred command lists.</param>
        public unsafe void ExecuteCommandLists(int count, CompiledCommandList[] commandLists)
        {
            if (commandLists == null)
            {
                throw new ArgumentNullException(nameof(commandLists));
            }
            if (count > commandLists.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(count));
            }

            var fenceValue = NextFenceValue++;

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

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

            // Collect resources
            var commandBuffers = stackalloc CommandBuffer[count];

            for (int i = 0; i < count; i++)
            {
                commandBuffers[i] = commandLists[i].NativeCommandBuffer;
                RecycleCommandListResources(commandLists[i], fenceValue);
            }

            // Submit commands
            var pipelineStageFlags   = PipelineStageFlags.BottomOfPipe;
            var presentSemaphoreCopy = presentSemaphore;
            var submitInfo           = new SubmitInfo
            {
                StructureType      = StructureType.SubmitInfo,
                CommandBufferCount = (uint)count,
                CommandBuffers     = new IntPtr(commandBuffers),
                WaitSemaphoreCount = presentSemaphore != Semaphore.Null ? 1U : 0U,
                WaitSemaphores     = new IntPtr(&presentSemaphoreCopy),
                WaitDstStageMask   = new IntPtr(&pipelineStageFlags),
            };

            NativeCommandQueue.Submit(1, &submitInfo, fence);

            presentSemaphore = Semaphore.Null;
            nativeResourceCollector.Release();
            graphicsResourceLinkCollector.Release();
        }
Exemplo n.º 2
0
        internal unsafe long ExecuteCommandListInternal(CommandBuffer nativeCommandBuffer)
        {
            //if (nativeUploadBuffer != SharpVulkan.Buffer.Null)
            //{
            //    NativeDevice.UnmapMemory(nativeUploadBufferMemory);
            //    TemporaryResources.Enqueue(new BufferInfo(NextFenceValue, nativeUploadBuffer, nativeUploadBufferMemory));

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

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

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

            // Submit commands
            var nativeCommandBufferCopy = nativeCommandBuffer;
            var pipelineStageFlags      = PipelineStageFlags.BottomOfPipe;

            var presentSemaphoreCopy = presentSemaphore;
            var submitInfo           = new SubmitInfo
            {
                StructureType      = StructureType.SubmitInfo,
                CommandBufferCount = 1,
                CommandBuffers     = new IntPtr(&nativeCommandBufferCopy),
                WaitSemaphoreCount = presentSemaphore != Semaphore.Null ? 1U : 0U,
                WaitSemaphores     = new IntPtr(&presentSemaphoreCopy),
                WaitDstStageMask   = new IntPtr(&pipelineStageFlags),
            };

            NativeCommandQueue.Submit(1, &submitInfo, fence);

            presentSemaphore = Semaphore.Null;
            NativeResourceCollector.Release();

            return(NextFenceValue++);
        }