1 module sbylib.wrapper.vulkan.queue; 2 3 import erupted; 4 import sbylib.wrapper.vulkan.commandbuffer; 5 import sbylib.wrapper.vulkan.device; 6 import sbylib.wrapper.vulkan.enums; 7 import sbylib.wrapper.vulkan.fence; 8 import sbylib.wrapper.vulkan.swapchain; 9 import sbylib.wrapper.vulkan.util; 10 11 class Queue { 12 13 /* 14 1. Wait all `waitSemaphores` at each corresponding stage specified by `waitDstStageMask` 15 2. Execute `commandBuffers` 16 3. Signal all `signalSemaphores` 17 */ 18 static struct SubmitInfo { 19 @vkProp("pWaitSemaphores", "waitSemaphoreCount") { 20 const VkSemaphore[] waitSemaphores; 21 } 22 23 @vkProp("pWaitDstStageMask") { 24 const VkPipelineStageFlags[] waitDstStageMask; 25 } 26 27 @vkProp("pCommandBuffers", "commandBufferCount") { 28 const CommandBuffer[] commandBuffers; 29 } 30 31 @vkProp("pSignalSemaphores", "signalSemaphoreCount") { 32 const VkSemaphore[] signalSemaphores; 33 } 34 35 const mixin VkTo!(VkSubmitInfo); 36 } 37 38 static struct PresentInfo { 39 @vkProp("pWaitSemaphores", "waitSemaphoreCount") { 40 const VkSemaphore[] waitSemaphores; 41 } 42 43 @vkProp("pSwapchains", "swapchainCount") { 44 const Swapchain[] swapchains; 45 } 46 47 @vkProp("pImageIndices") { 48 const uint[] imageIndices; 49 } 50 51 @vkProp("pResults") { 52 VkResult[] results; 53 } 54 55 invariant(swapchains.length == imageIndices.length); 56 invariant(results is null || swapchains.length == results.length); 57 58 mixin VkTo!(VkPresentInfoKHR); 59 } 60 61 private Device device; 62 package VkQueue queue; 63 64 mixin ImplNameSetter!(device, queue, DebugReportObjectType.Queue); 65 66 package this(Device device, VkQueue queue) { 67 this.device = device; 68 this.queue = queue; 69 } 70 71 void submit(uint N)(SubmitInfo[N] _info, Fence _fence) { 72 VkFence fence; 73 if (_fence) 74 fence = _fence.fence; 75 76 VkSubmitInfo[N] info; 77 static foreach (i; 0 .. N) 78 info[i] = _info[i].vkTo(); 79 80 enforceVK(vkQueueSubmit(queue, N, info.ptr, fence)); 81 } 82 83 void waitIdle() { 84 enforceVK(vkQueueWaitIdle(queue)); 85 } 86 87 void present(PresentInfo _info) { 88 auto info = _info.vkTo(); 89 enforceVK(vkQueuePresentKHR(queue, &info)); 90 } 91 92 mixin VkTo!(VkQueue); 93 }