//public static implicit operator VkSemaphoresPipelineStagesHandle(VkSemaphore v) { // var result = new VkSemaphoresPipelineStagesHandle(); // result.Set(v); // return result; //} //public static implicit operator VkSemaphoresPipelineStagesHandle(VkSemaphore[] v) { // var result = new VkSemaphoresPipelineStagesHandle(); // result.Set(v); // return result; //} public void Set(params VkPipelineStageFlagBits[] value) { IntPtr ptr = (IntPtr)this.waitDstStageMask; value.Set(ref ptr, ref this.count); this.waitDstStageMask = (VkPipelineStageFlagBits *)ptr; }
public void DrawFrame() { var result = VulkanNative.vkQueueWaitIdle(vkPresentQueue); Helpers.CheckErrors(result); uint imageIndex; result = VulkanNative.vkAcquireNextImageKHR(vkDevice, vkSwapChain, ulong.MaxValue, vkImageAvailableSemaphore, 0, &imageIndex); Helpers.CheckErrors(result); VkSemaphore * waitSemaphores = stackalloc VkSemaphore[] { vkImageAvailableSemaphore }; VkPipelineStageFlagBits *waitStages = stackalloc VkPipelineStageFlagBits[] { VkPipelineStageFlagBits.VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; VkSemaphore * signalSemaphores = stackalloc VkSemaphore[] { vkRenderFinishedSemaphore }; VkCommandBuffer * commandBuffers = stackalloc VkCommandBuffer[] { vkCommandBuffers[imageIndex] }; var submitInfo = new VkSubmitInfo() { sType = VkStructureType.VK_STRUCTURE_TYPE_SUBMIT_INFO, pWaitSemaphores = waitSemaphores, waitSemaphoreCount = 1, pWaitDstStageMask = waitStages, commandBufferCount = 1, pCommandBuffers = commandBuffers, signalSemaphoreCount = 1, pSignalSemaphores = signalSemaphores, }; result = VulkanNative.vkQueueSubmit(vkGraphicsQueue, 1, &submitInfo, 0); Helpers.CheckErrors(result); VkSwapchainKHR *swapChains = stackalloc VkSwapchainKHR[] { vkSwapChain }; var presentInfo = new VkPresentInfoKHR() { sType = VkStructureType.VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, waitSemaphoreCount = 1, pWaitSemaphores = signalSemaphores, swapchainCount = 1, pSwapchains = swapChains, pImageIndices = &imageIndex, }; result = VulkanNative.vkQueuePresentKHR(vkPresentQueue, &presentInfo); Helpers.CheckErrors(result); }
//public static implicit operator VkSemaphoresPipelineStagesHandle(VkPipelineStageFlagBits v) { // var result = new VkSemaphoresPipelineStagesHandle(); // result.Set(v); // return result; //} //public static implicit operator VkSemaphoresPipelineStagesHandle(VkPipelineStageFlagBits[] v) { // var result = new VkSemaphoresPipelineStagesHandle(); // result.Set(v); // return result; //} /// <summary> /// Free unmanaged memory and reset all members to 0. /// </summary> public void Reset() { if (this.waitSemaphores != null) { UInt32 count = this.count; IntPtr ptr = (IntPtr)this.waitSemaphores; Helper.Set <VkSemaphore>(null, ref ptr, ref count); this.waitSemaphores = null; } if (this.waitDstStageMask != null) { UInt32 count = this.count; IntPtr ptr = (IntPtr)this.waitDstStageMask; Helper.Set <VkPipelineStageFlagBits>(null, ref ptr, ref count); this.waitDstStageMask = null; } { this.count = 0; } }