1 module sbylib.wrapper.vulkan.swapchain; 2 3 import std; 4 import erupted; 5 import sbylib.wrapper.vulkan.enums; 6 import sbylib.wrapper.vulkan.device; 7 import sbylib.wrapper.vulkan.fence; 8 import sbylib.wrapper.vulkan.image; 9 import sbylib.wrapper.vulkan.surface; 10 import sbylib.wrapper.vulkan.util; 11 12 class Swapchain { 13 static struct CreateInfo { 14 @vkProp() { 15 immutable VkSwapchainCreateFlagsKHR flags; 16 Surface surface; 17 immutable uint minImageCount; 18 immutable VkFormat imageFormat; 19 immutable VkColorSpaceKHR imageColorSpace; 20 immutable VkExtent2D imageExtent; 21 immutable uint imageArrayLayers; 22 immutable ImageUsage imageUsage; 23 immutable SharingMode imageSharingMode; 24 immutable SurfaceTransform preTransform; 25 immutable CompositeAlpha compositeAlpha; 26 immutable PresentMode presentMode; 27 immutable bool clipped; 28 Swapchain oldSwapchain; 29 } 30 31 @vkProp("pQueueFamilyIndices", "queueFamilyIndexCount") { 32 const uint[] queueFamilyIndices; 33 } 34 35 mixin VkTo!(VkSwapchainCreateInfoKHR); 36 } 37 38 private Device device; 39 private VkSwapchainKHR swapchain; 40 41 mixin ImplNameSetter!(device, swapchain, DebugReportObjectType.Swapchain); 42 43 this(Device device, CreateInfo _info) { 44 import std.exception : enforce; 45 46 this.device = device; 47 48 auto info = _info.vkTo(); 49 50 enforceVK(vkCreateSwapchainKHR(device.device, &info, null, &swapchain)); 51 enforce(swapchain != VK_NULL_HANDLE); 52 } 53 54 ~this() { 55 vkDestroySwapchainKHR(device.device, swapchain, null); 56 } 57 58 mixin VkTo!(VkSwapchainKHR); 59 60 Image[] getImages() { 61 uint numSwapchainImage; 62 vkGetSwapchainImagesKHR(device.device, swapchain, &numSwapchainImage, null); 63 64 VkImage[] swapchainImages = new VkImage[numSwapchainImage]; 65 vkGetSwapchainImagesKHR(device.device, swapchain, 66 &numSwapchainImage, swapchainImages.ptr); 67 68 Image[] result = new Image[numSwapchainImage]; 69 foreach (i; 0..numSwapchainImage) 70 result[i] = new Image(swapchainImages[i]); 71 72 return result; 73 } 74 75 uint acquireNextImageIndex(ulong timeout, VkSemaphore semaphore, Fence fence) 76 in (device !is null) 77 in (fence !is null) 78 { 79 uint imageIndex; 80 enforceVK(vkAcquireNextImageKHR(device.device, swapchain, timeout, 81 semaphore, fence.fence, &imageIndex)); 82 return imageIndex; 83 } 84 }