1 /// Conversion module between vulkan and graal types 2 module gfx.vulkan.conv; 3 4 package: 5 6 import gfx.bindings.vulkan; 7 8 import gfx.core.types; 9 import gfx.graal.buffer; 10 import gfx.graal.cmd; 11 import gfx.graal.format; 12 import gfx.graal.image; 13 import gfx.graal.memory; 14 import gfx.graal.pipeline; 15 import gfx.graal.presentation; 16 import gfx.graal.queue; 17 import gfx.graal.renderpass; 18 19 20 // structures and enums conversion 21 22 VkFormat toVk(in Format format) { 23 return cast(VkFormat)format; 24 } 25 26 Format toGfx(in VkFormat vkFormat) { 27 return cast(Format)vkFormat; 28 } 29 30 VkFormatFeatureFlags toVk(in FormatFeatures ff) { 31 return cast(VkFormatFeatureFlags)ff; 32 } 33 34 FormatFeatures toGfx(in VkFormatFeatureFlags vkFff) { 35 return cast(FormatFeatures)vkFff; 36 } 37 38 static assert(Format.rgba8_uNorm.toVk() == VK_FORMAT_R8G8B8A8_UNORM); 39 40 VkImageType toVk(in ImageType it) { 41 final switch (it) { 42 case ImageType.d1: 43 case ImageType.d1Array: 44 return VK_IMAGE_TYPE_1D; 45 case ImageType.d2: 46 case ImageType.d2Array: 47 case ImageType.cube: 48 case ImageType.cubeArray: 49 return VK_IMAGE_TYPE_2D; 50 case ImageType.d3: 51 return VK_IMAGE_TYPE_3D; 52 } 53 } 54 55 VkImageViewType toVkView(in ImageType it) { 56 final switch (it) { 57 case ImageType.d1: 58 return VK_IMAGE_VIEW_TYPE_1D; 59 case ImageType.d1Array: 60 return VK_IMAGE_VIEW_TYPE_1D_ARRAY; 61 case ImageType.d2: 62 return VK_IMAGE_VIEW_TYPE_2D; 63 case ImageType.d2Array: 64 return VK_IMAGE_VIEW_TYPE_2D_ARRAY; 65 case ImageType.cube: 66 return VK_IMAGE_VIEW_TYPE_CUBE; 67 case ImageType.cubeArray: 68 return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; 69 case ImageType.d3: 70 return VK_IMAGE_VIEW_TYPE_3D; 71 } 72 } 73 74 VkImageLayout toVk(in ImageLayout layout) 75 { 76 return cast(VkImageLayout)layout; 77 } 78 79 MemoryRequirements toGfx(in VkMemoryRequirements mr) { 80 return MemoryRequirements( 81 mr.size, mr.alignment, memPropsToGfx(mr.memoryTypeBits) 82 ); 83 } 84 85 VkComponentSwizzle toVk(in CompSwizzle cs) { 86 final switch (cs) { 87 case CompSwizzle.identity : return VK_COMPONENT_SWIZZLE_IDENTITY; 88 case CompSwizzle.zero : return VK_COMPONENT_SWIZZLE_ZERO; 89 case CompSwizzle.one : return VK_COMPONENT_SWIZZLE_ONE; 90 case CompSwizzle.r : return VK_COMPONENT_SWIZZLE_R; 91 case CompSwizzle.g : return VK_COMPONENT_SWIZZLE_G; 92 case CompSwizzle.b : return VK_COMPONENT_SWIZZLE_B; 93 case CompSwizzle.a : return VK_COMPONENT_SWIZZLE_A; 94 } 95 } 96 97 VkComponentMapping toVk(in Swizzle swizzle) { 98 return VkComponentMapping( 99 swizzle[0].toVk(), swizzle[1].toVk(), swizzle[2].toVk(), swizzle[3].toVk(), 100 ); 101 } 102 103 VkImageSubresourceRange toVk(in ImageSubresourceRange isr) { 104 return VkImageSubresourceRange( 105 isr.aspect.aspectToVk(), 106 cast(uint)isr.firstLevel, cast(uint)isr.levels, 107 cast(uint)isr.firstLayer, cast(uint)isr.layers, 108 ); 109 } 110 111 SurfaceCaps toGfx(in VkSurfaceCapabilitiesKHR vkCaps) { 112 return SurfaceCaps( 113 vkCaps.minImageCount, vkCaps.maxImageCount, 114 [ vkCaps.minImageExtent.width, vkCaps.minImageExtent.height ], 115 [ vkCaps.maxImageExtent.width, vkCaps.maxImageExtent.height ], 116 vkCaps.maxImageArrayLayers, 117 imageUsageToGfx(vkCaps.supportedUsageFlags), 118 compositeAlphaToGfx(vkCaps.supportedCompositeAlpha), 119 ); 120 } 121 122 PresentMode toGfx(in VkPresentModeKHR pm) { 123 switch (pm) { 124 case VK_PRESENT_MODE_IMMEDIATE_KHR: 125 return PresentMode.immediate; 126 case VK_PRESENT_MODE_FIFO_KHR: 127 return PresentMode.fifo; 128 case VK_PRESENT_MODE_MAILBOX_KHR: 129 return PresentMode.mailbox; 130 default: 131 assert(false); 132 } 133 } 134 135 VkPresentModeKHR toVk(in PresentMode pm) { 136 final switch (pm) { 137 case PresentMode.immediate: 138 return VK_PRESENT_MODE_IMMEDIATE_KHR; 139 case PresentMode.fifo: 140 return VK_PRESENT_MODE_FIFO_KHR; 141 case PresentMode.mailbox: 142 return VK_PRESENT_MODE_MAILBOX_KHR; 143 } 144 } 145 146 @property bool hasGfxSupport(in VkPresentModeKHR pm) { 147 switch (pm) { 148 case VK_PRESENT_MODE_IMMEDIATE_KHR: 149 case VK_PRESENT_MODE_FIFO_KHR: 150 case VK_PRESENT_MODE_MAILBOX_KHR: 151 return true; 152 default: 153 return false; 154 } 155 } 156 157 VkAttachmentLoadOp toVk(in LoadOp op) { 158 final switch (op) { 159 case LoadOp.load: return VK_ATTACHMENT_LOAD_OP_LOAD; 160 case LoadOp.clear: return VK_ATTACHMENT_LOAD_OP_CLEAR; 161 case LoadOp.dontCare: return VK_ATTACHMENT_LOAD_OP_DONT_CARE; 162 } 163 } 164 165 VkAttachmentStoreOp toVk(in StoreOp op) { 166 final switch (op) { 167 case StoreOp.store: return VK_ATTACHMENT_STORE_OP_STORE; 168 case StoreOp.dontCare: return VK_ATTACHMENT_STORE_OP_DONT_CARE; 169 } 170 } 171 172 VkPrimitiveTopology toVk(in Primitive p) { 173 return cast(VkPrimitiveTopology)p; 174 } 175 176 VkFrontFace toVk(in FrontFace ff) { 177 return cast(VkFrontFace)ff; 178 } 179 180 VkPolygonMode toVk(in PolygonMode pm) { 181 return cast(VkPolygonMode)pm; 182 } 183 184 VkBlendFactor toVk(in BlendFactor bf) { 185 return cast(VkBlendFactor)bf; 186 } 187 188 VkBlendOp toVk(in BlendOp op) { 189 return cast(VkBlendOp)op; 190 } 191 192 VkLogicOp toVk(in LogicOp op) { 193 return cast(VkLogicOp)op; 194 } 195 196 VkDynamicState toVk(in DynamicState ds) { 197 return cast(VkDynamicState)ds; 198 } 199 200 VkRect2D toVk(in Rect r) { 201 return VkRect2D(VkOffset2D(r.x, r.y), VkExtent2D(r.width, r.height)); 202 } 203 204 VkFilter toVk(in Filter f) { 205 return cast(VkFilter)f; 206 } 207 208 VkSamplerMipmapMode toVkMipmapMode(in Filter f) { 209 return cast(VkSamplerMipmapMode)f; 210 } 211 212 VkSamplerAddressMode toVk(in WrapMode wm) { 213 return cast(VkSamplerAddressMode)wm; 214 } 215 216 VkBorderColor toVk(in BorderColor bc) { 217 return cast(VkBorderColor)bc; 218 } 219 220 VkCompareOp toVk(in CompareOp op) { 221 return cast(VkCompareOp)op; 222 } 223 224 225 // flags conversion 226 227 MemProps memPropsToGfx(in VkMemoryPropertyFlags vkFlags) 228 { 229 MemProps props = cast(MemProps)0; 230 if (vkFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) { 231 props |= MemProps.deviceLocal; 232 } 233 if (vkFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { 234 props |= MemProps.hostVisible; 235 } 236 if (vkFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { 237 props |= MemProps.hostCoherent; 238 } 239 if (vkFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) { 240 props |= MemProps.hostCached; 241 } 242 if (vkFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) { 243 props |= MemProps.lazilyAllocated; 244 } 245 return props; 246 } 247 248 QueueCap queueCapToGfx(in VkQueueFlags vkFlags) 249 { 250 QueueCap caps = cast(QueueCap)0; 251 if (vkFlags & VK_QUEUE_GRAPHICS_BIT) { 252 caps |= QueueCap.graphics; 253 } 254 if (vkFlags & VK_QUEUE_COMPUTE_BIT) { 255 caps |= QueueCap.compute; 256 } 257 return caps; 258 } 259 260 ImageUsage imageUsageToGfx(in VkImageUsageFlags usage) 261 { 262 return cast(ImageUsage)usage; 263 } 264 265 CompositeAlpha compositeAlphaToGfx(in VkCompositeAlphaFlagsKHR ca) 266 { 267 return cast(CompositeAlpha)ca; 268 } 269 270 VkBufferUsageFlags bufferUsageToVk(in BufferUsage usage) { 271 return cast(VkBufferUsageFlags)usage; 272 } 273 274 VkImageUsageFlags imageUsageToVk(in ImageUsage usage) 275 { 276 return cast(VkImageUsageFlags)usage; 277 } 278 279 VkImageAspectFlags aspectToVk(in ImageAspect aspect) 280 { 281 return cast(VkImageAspectFlags)aspect; 282 } 283 284 VkAccessFlags accessToVk(in Access access) 285 { 286 return cast(VkAccessFlags)access; 287 } 288 289 VkPipelineStageFlags pipelineStageToVk(in PipelineStage stage) 290 { 291 return cast(VkPipelineStageFlags)stage; 292 } 293 294 VkCompositeAlphaFlagBitsKHR compositeAlphaToVk(in CompositeAlpha ca) 295 { 296 return cast(VkCompositeAlphaFlagBitsKHR)ca; 297 } 298 299 VkShaderStageFlagBits shaderStageToVk(in ShaderStage ss) 300 { 301 return cast(VkShaderStageFlagBits)ss; 302 } 303 304 VkCullModeFlagBits cullModeToVk(in Cull c) { 305 return cast(VkCullModeFlagBits)c; 306 }