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 }