1#[macro_use]
18mod extension_structs;
19
20mod buffer;
21mod buffer_view;
22mod command_buffer;
23mod command_pool;
24mod descriptor_pool;
25mod descriptor_set;
26mod descriptor_set_layout;
27mod device;
28mod device_memory;
29mod event;
30mod fence;
31mod framebuffer;
32mod image;
33mod image_view;
34mod instance;
35mod physical_device;
36mod pipeline;
37mod pipeline_cache;
38mod pipeline_layout;
39mod query_pool;
40mod queue;
41mod render_pass;
42mod sampler;
43mod semaphore;
44mod shader_module;
45
46pub(crate) mod allocator_helper;
47
48use amd_rasterization_order;
49use ext_debug_report;
50use ext_validation_flags;
51use khr_get_physical_device_properties2;
52use libc::{c_char, c_void};
53use nv_dedicated_allocation;
54use nv_external_memory;
55use nv_external_memory_win32;
56use nv_win32_keyed_mutex;
57use std::cmp;
58use std::collections::{HashMap, HashSet};
59use std::ffi::{CStr, CString};
60use std::fmt;
61use std::mem;
62use std::ptr;
63use std::slice;
64use std::time::Duration;
65use utils;
66use vks;
67
68pub use self::buffer::{Buffer, FromNativeBufferParameters};
69pub use self::buffer_view::{BufferView, FromNativeBufferViewParameters};
70pub use self::command_buffer::{CommandBuffer, FromNativeCommandBufferParameters};
71pub use self::command_pool::{CommandPool, FromNativeCommandPoolParameters};
72pub use self::descriptor_pool::{DescriptorPool, FromNativeDescriptorPoolParameters};
73pub use self::descriptor_set::DescriptorSet;
74pub use self::descriptor_set_layout::{DescriptorSetLayout, FromNativeDescriptorSetLayoutParameters};
75pub use self::device::Device;
76pub use self::device_memory::{DeviceMemory, MappedMemory, FromNativeDeviceMemoryParameters};
77pub use self::event::{Event, FromNativeEventParameters};
78pub use self::fence::{Fence, FromNativeFenceParameters};
79pub use self::framebuffer::{Framebuffer, FromNativeFramebufferParameters};
80pub use self::image::{Image, FromNativeImageParameters};
81pub use self::image_view::{ImageView, FromNativeImageViewParameters};
82pub use self::instance::{EarlyInstanceError, Instance};
83pub use self::physical_device::PhysicalDevice;
84pub use self::pipeline::{Pipeline, FromNativePipelineParameters};
85pub use self::pipeline_cache::{PipelineCache, FromNativePipelineCacheParameters};
86pub use self::pipeline_layout::{PipelineLayout, FromNativePipelineLayoutParameters};
87pub use self::query_pool::{QueryPool, FromNativeQueryPoolParameters};
88pub use self::queue::Queue;
89pub use self::render_pass::{RenderPass, FromNativeRenderPassParameters};
90pub use self::sampler::{Sampler, FromNativeSamplerParameters};
91pub use self::semaphore::{Semaphore, FromNativeSemaphoreParameters};
92pub use self::shader_module::{ShaderModule, FromNativeShaderModuleParameters};
93
94dacite_bitflags! {
95 pub struct InstanceCreateFlags: vks::core::VkInstanceCreateFlags;
97 pub enum InstanceCreateFlagBits: vks::core::VkInstanceCreateFlagBits;
98 max_enum: vks::core::VK_INSTANCE_CREATE_FLAG_BITS_MAX_ENUM;
99
100 flags {}
101 no_bits {}
102}
103
104dacite_bitflags! {
105 pub struct FormatFeatureFlags: vks::core::VkFormatFeatureFlags;
107 pub enum FormatFeatureFlagBits: vks::core::VkFormatFeatureFlagBits;
108 max_enum: vks::core::VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM;
109
110 flags {
111 const SAMPLED_IMAGE [SampledImage] = vks::core::VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
112 const STORAGE_IMAGE [StorageImage] = vks::core::VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
113 const STORAGE_IMAGE_ATOMIC [StorageImageAtomic] = vks::core::VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT;
114 const UNIFORM_TEXEL_BUFFER [UniformTexelBuffer] = vks::core::VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
115 const STORAGE_TEXEL_BUFFER [StorageTexelBuffer] = vks::core::VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
116 const STORAGE_TEXEL_BUFFER_ATOMIC [StorageTexelBufferAtomic] = vks::core::VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT;
117 const VERTEX_BUFFER [VertexBuffer] = vks::core::VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT;
118 const COLOR_ATTACHMENT [ColorAttachment] = vks::core::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
119 const COLOR_ATTACHMENT_BLEND [ColorAttachmentBlend] = vks::core::VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT;
120 const DEPTH_STENCIL_ATTACHMENT [DepthStencilAttachment] = vks::core::VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
121 const BLIT_SRC [BlitSrc] = vks::core::VK_FORMAT_FEATURE_BLIT_SRC_BIT;
122 const BLIT_DST [BlitDst] = vks::core::VK_FORMAT_FEATURE_BLIT_DST_BIT;
123 const SAMPLED_IMAGE_FILTER_LINEAR [SampledImageFilterLinear] = vks::core::VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
124
125 const SAMPLED_IMAGE_FILTER_CUBIC_BIT [SampledImageFilterCubicImg] = vks::core::VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG;
127 }
128
129 no_bits {}
130}
131
132dacite_bitflags! {
133 pub struct ImageUsageFlags: vks::core::VkImageUsageFlags;
135 pub enum ImageUsageFlagBits: vks::core::VkImageUsageFlagBits;
136 max_enum: vks::core::VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM;
137
138 flags {
139 const TRANSFER_SRC [TransferSrc] = vks::core::VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
140 const TRANSFER_DST [TransferDst] = vks::core::VK_IMAGE_USAGE_TRANSFER_DST_BIT;
141 const SAMPLED [Sampled] = vks::core::VK_IMAGE_USAGE_SAMPLED_BIT;
142 const STORAGE [Storage] = vks::core::VK_IMAGE_USAGE_STORAGE_BIT;
143 const COLOR_ATTACHMENT [ColorAttachment] = vks::core::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
144 const DEPTH_STENCIL_ATTACHMENT [DepthStencilAttachment] = vks::core::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
145 const TRANSIENT_ATTACHMENT [TransientAttachment] = vks::core::VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
146 const INPUT_ATTACHMENT [InputAttachment] = vks::core::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
147 }
148
149 no_bits {}
150}
151
152dacite_bitflags! {
153 pub struct ImageCreateFlags: vks::core::VkImageCreateFlags;
155 pub enum ImageCreateFlagBits: vks::core::VkImageCreateFlagBits;
156 max_enum: vks::core::VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM;
157
158 flags {
159 const SPARSE_BINDING [SparseBinding] = vks::core::VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
160 const SPARSE_RESIDENCY [SparseResidency] = vks::core::VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT;
161 const SPARSE_ALIASED [SparseAliased] = vks::core::VK_IMAGE_CREATE_SPARSE_ALIASED_BIT;
162 const MUTABLE_FORMAT [MutableFormat] = vks::core::VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
163 const CUBE_COMPATIBLE [CubeCompatible] = vks::core::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
164 }
165
166 no_bits {}
167}
168
169dacite_bitflags! {
170 pub struct SampleCountFlags: vks::core::VkSampleCountFlags;
172 pub enum SampleCountFlagBits: vks::core::VkSampleCountFlagBits;
173 max_enum: vks::core::VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM;
174
175 flags {
176 const SAMPLE_COUNT_1 [SampleCount1] = vks::core::VK_SAMPLE_COUNT_1_BIT;
177 const SAMPLE_COUNT_2 [SampleCount2] = vks::core::VK_SAMPLE_COUNT_2_BIT;
178 const SAMPLE_COUNT_4 [SampleCount4] = vks::core::VK_SAMPLE_COUNT_4_BIT;
179 const SAMPLE_COUNT_8 [SampleCount8] = vks::core::VK_SAMPLE_COUNT_8_BIT;
180 const SAMPLE_COUNT_16 [SampleCount16] = vks::core::VK_SAMPLE_COUNT_16_BIT;
181 const SAMPLE_COUNT_32 [SampleCount32] = vks::core::VK_SAMPLE_COUNT_32_BIT;
182 const SAMPLE_COUNT_64 [SampleCount64] = vks::core::VK_SAMPLE_COUNT_64_BIT;
183 }
184
185 no_bits {}
186}
187
188dacite_bitflags! {
189 pub struct QueueFlags: vks::core::VkQueueFlags;
191 pub enum QueueFlagBits: vks::core::VkQueueFlagBits;
192 max_enum: vks::core::VK_QUEUE_FLAG_BITS_MAX_ENUM;
193
194 flags {
195 const GRAPHICS [Graphics] = vks::core::VK_QUEUE_GRAPHICS_BIT;
196 const COMPUTE [Compute] = vks::core::VK_QUEUE_COMPUTE_BIT;
197 const TRANSFER [Transfer] = vks::core::VK_QUEUE_TRANSFER_BIT;
198 const SPARSE_BINDING [SparseBinding] = vks::core::VK_QUEUE_SPARSE_BINDING_BIT;
199 }
200
201 no_bits {}
202}
203
204dacite_bitflags! {
205 pub struct MemoryPropertyFlags: vks::core::VkMemoryPropertyFlags;
207 pub enum MemoryPropertyFlagBits: vks::core::VkMemoryPropertyFlagBits;
208 max_enum: vks::core::VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM;
209
210 flags {
211 const DEVICE_LOCAL [DeviceLocal] = vks::core::VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
212 const HOST_VISIBLE [HostVisible] = vks::core::VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
213 const HOST_COHERENT [HostCoherent] = vks::core::VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
214 const HOST_CACHED [HostCached] = vks::core::VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
215 const LAZILY_ALLOCATED [LazilyAllocated] = vks::core::VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT;
216 }
217
218 no_bits {}
219}
220
221dacite_bitflags! {
222 pub struct MemoryHeapFlags: vks::core::VkMemoryHeapFlags;
224 pub enum MemoryHeapFlagBits: vks::core::VkMemoryHeapFlagBits;
225 max_enum: vks::core::VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM;
226
227 flags {
228 const DEVICE_LOCAL [DeviceLocal] = vks::core::VK_MEMORY_HEAP_DEVICE_LOCAL_BIT;
229 }
230
231 no_bits {}
232}
233
234dacite_bitflags! {
235 pub struct DeviceCreateFlags: vks::core::VkDeviceCreateFlags;
237 pub enum DeviceCreateFlagBits: vks::core::VkDeviceCreateFlagBits;
238 max_enum: vks::core::VK_DEVICE_CREATE_FLAG_BITS_MAX_ENUM;
239
240 flags {}
241 no_bits {}
242}
243
244dacite_bitflags! {
245 pub struct DeviceQueueCreateFlags: vks::core::VkDeviceQueueCreateFlags;
247 pub enum DeviceQueueCreateFlagBits: vks::core::VkDeviceQueueCreateFlagBits;
248 max_enum: vks::core::VK_DEVICE_QUEUE_CREATE_FLAG_BITS_MAX_ENUM;
249
250 flags {}
251 no_bits {}
252}
253
254dacite_bitflags! {
255 pub struct PipelineStageFlags: vks::core::VkPipelineStageFlags;
257 pub enum PipelineStageFlagBits: vks::core::VkPipelineStageFlagBits;
258 max_enum: vks::core::VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM;
259
260 flags {
261 const TOP_OF_PIPE [TopOfPipe] = vks::core::VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
262 const DRAW_INDIRECT [DrawIndirect] = vks::core::VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
263 const VERTEX_INPUT [VertexInput] = vks::core::VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
264 const VERTEX_SHADER [VertexShader] = vks::core::VK_PIPELINE_STAGE_VERTEX_SHADER_BIT;
265 const TESSELLATION_CONTROL_SHADER [TessellationControlShader] = vks::core::VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT;
266 const TESSELLATION_EVALUATION_SHADER [TessellationEvaluationShader] = vks::core::VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;
267 const GEOMETRY_SHADER [GeometryShader] = vks::core::VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
268 const FRAGMENT_SHADER [FragmentShader] = vks::core::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
269 const EARLY_FRAGMENT_TESTS [EarlyFragmentTests] = vks::core::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
270 const LATE_FRAGMENT_TESTS [LateFragmentTests] = vks::core::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
271 const COLOR_ATTACHMENT_OUTPUT [ColorAttachmentOutput] = vks::core::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
272 const COMPUTE_SHADER [ComputeShader] = vks::core::VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
273 const TRANSFER [Transfer] = vks::core::VK_PIPELINE_STAGE_TRANSFER_BIT;
274 const BOTTOM_OF_PIPE [BottomOfPipe] = vks::core::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
275 const HOST [Host] = vks::core::VK_PIPELINE_STAGE_HOST_BIT;
276 const ALL_GRAPHICS [AllGraphics] = vks::core::VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
277 const ALL_COMMANDS [AllCommands] = vks::core::VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
278 }
279
280 no_bits {}
281}
282
283dacite_bitflags! {
284 pub struct MemoryMapFlags: vks::core::VkMemoryMapFlags;
286 pub enum MemoryMapFlagBits: vks::core::VkMemoryMapFlagBits;
287 max_enum: vks::core::VK_MEMORY_MAP_FLAG_BITS_MAX_ENUM;
288
289 flags {}
290 no_bits {}
291}
292
293dacite_bitflags! {
294 pub struct ImageAspectFlags: vks::core::VkImageAspectFlags;
296 pub enum ImageAspectFlagBits: vks::core::VkImageAspectFlagBits;
297 max_enum: vks::core::VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM;
298
299 flags {
300 const COLOR [Color] = vks::core::VK_IMAGE_ASPECT_COLOR_BIT;
301 const DEPTH [Depth] = vks::core::VK_IMAGE_ASPECT_DEPTH_BIT;
302 const STENCIL [Stencil] = vks::core::VK_IMAGE_ASPECT_STENCIL_BIT;
303 const METADATA [Metadata] = vks::core::VK_IMAGE_ASPECT_METADATA_BIT;
304 }
305
306 no_bits {}
307}
308
309dacite_bitflags! {
310 pub struct SparseImageFormatFlags: vks::core::VkSparseImageFormatFlags;
312 pub enum SparseImageFormatFlagBits: vks::core::VkSparseImageFormatFlagBits;
313 max_enum: vks::core::VK_SPARSE_IMAGE_FORMAT_FLAG_BITS_MAX_ENUM;
314
315 flags {
316 const SINGLE_MIPTAIL [SingleMiptail] = vks::core::VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT;
317 const ALIGNED_MIP_SIZE [AlignedMipSize] = vks::core::VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT;
318 const NONSTANDARD_BLOCK_SIZE [NonstandardBlockSize] = vks::core::VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT;
319 }
320
321 no_bits {}
322}
323
324dacite_bitflags! {
325 pub struct SparseMemoryBindFlags: vks::core::VkSparseMemoryBindFlags;
327 pub enum SparseMemoryBindFlagBits: vks::core::VkSparseMemoryBindFlagBits;
328 max_enum: vks::core::VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM;
329
330 flags {
331 const METADATA [Metadata] = vks::core::VK_SPARSE_MEMORY_BIND_METADATA_BIT;
332 }
333
334 no_bits {}
335}
336
337dacite_bitflags! {
338 pub struct FenceCreateFlags: vks::core::VkFenceCreateFlags;
340 pub enum FenceCreateFlagBits: vks::core::VkFenceCreateFlagBits;
341 max_enum: vks::core::VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM;
342
343 flags {
344 const SIGNALED [Signaled] = vks::core::VK_FENCE_CREATE_SIGNALED_BIT;
345 }
346
347 no_bits {}
348}
349
350dacite_bitflags! {
351 pub struct SemaphoreCreateFlags: vks::core::VkSemaphoreCreateFlags;
353 pub enum SemaphoreCreateFlagBits: vks::core::VkSemaphoreCreateFlagBits;
354 max_enum: vks::core::VK_SEMAPHORE_CREATE_FLAG_BITS_MAX_ENUM;
355
356 flags {}
357 no_bits {}
358}
359
360dacite_bitflags! {
361 pub struct EventCreateFlags: vks::core::VkEventCreateFlags;
363 pub enum EventCreateFlagBits: vks::core::VkEventCreateFlagBits;
364 max_enum: vks::core::VK_EVENT_CREATE_FLAG_BITS_MAX_ENUM;
365
366 flags {}
367 no_bits {}
368}
369
370dacite_bitflags! {
371 pub struct QueryPoolCreateFlags: vks::core::VkQueryPoolCreateFlags;
373 pub enum QueryPoolCreateFlagBits: vks::core::VkQueryPoolCreateFlagBits;
374 max_enum: vks::core::VK_QUERY_POOL_CREATE_FLAG_BITS_MAX_ENUM;
375
376 flags {}
377 no_bits {}
378}
379
380dacite_bitflags! {
381 pub struct QueryPipelineStatisticFlags: vks::core::VkQueryPipelineStatisticFlags;
383 pub enum QueryPipelineStatisticFlagBits: vks::core::VkQueryPipelineStatisticFlagBits;
384 max_enum: vks::core::VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM;
385
386 flags {
387 const INPUT_ASSEMBLY_VERTICES [InputAssemblyVertices] = vks::core::VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT;
388 const INPUT_ASSEMBLY_PRIMITIVES [InputAssemblyPrimitives] = vks::core::VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT;
389 const VERTEX_SHADER_INVOCATIONS [VertexShaderInvocations] = vks::core::VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT;
390 const GEOMETRY_SHADER_INVOCATIONS [GeometryShaderInvocations] = vks::core::VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT;
391 const GEOMETRY_SHADER_PRIMITIVES [GeometryShaderPrimitives] = vks::core::VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT;
392 const CLIPPING_INVOCATIONS [ClippingInvocations] = vks::core::VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT;
393 const CLIPPING_PRIMITIVES [ClippingPrimitives] = vks::core::VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT;
394 const FRAGMENT_SHADER_INVOCATIONS [FragmentShaderInvocations] = vks::core::VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT;
395 const TESSELLATION_CONTROL_SHADER_PATCHES [TessellationControlShaderPatches] = vks::core::VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT;
396 const TESSELLATION_EVALUATION_SHADER_INVOCATIONS [TessellationEvaluationShaderInvocations] = vks::core::VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT;
397 const COMPUTE_SHADER_INVOCATIONS [ComputeShaderInvocations] = vks::core::VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT;
398 }
399
400 no_bits {}
401}
402
403dacite_bitflags! {
404 pub struct QueryResultFlags: vks::core::VkQueryResultFlags;
406 pub enum QueryResultFlagBits: vks::core::VkQueryResultFlagBits;
407 max_enum: vks::core::VK_QUERY_RESULT_FLAG_BITS_MAX_ENUM;
408
409 flags {
410 const RESULT_64 [Result64] = vks::core::VK_QUERY_RESULT_64_BIT;
411 const WAIT [Wait] = vks::core::VK_QUERY_RESULT_WAIT_BIT;
412 const WITH_AVAILABILITY [WithAvailability] = vks::core::VK_QUERY_RESULT_WITH_AVAILABILITY_BIT;
413 const PARTIAL [Partial] = vks::core::VK_QUERY_RESULT_PARTIAL_BIT;
414 }
415
416 no_bits {}
417}
418
419dacite_bitflags! {
420 pub struct BufferCreateFlags: vks::core::VkBufferCreateFlags;
422 pub enum BufferCreateFlagBits: vks::core::VkBufferCreateFlagBits;
423 max_enum: vks::core::VK_BUFFER_CREATE_FLAG_BITS_MAX_ENUM;
424
425 flags {
426 const SPARSE_BINDING [SparseBinding] = vks::core::VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
427 const SPARSE_RESIDENCY [SparseResidency] = vks::core::VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
428 const SPARSE_ALIASED [SparseAliased] = vks::core::VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
429 }
430
431 no_bits {}
432}
433
434dacite_bitflags! {
435 pub struct BufferUsageFlags: vks::core::VkBufferUsageFlags;
437 pub enum BufferUsageFlagBits: vks::core::VkBufferUsageFlagBits;
438 max_enum: vks::core::VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM;
439
440 flags {
441 const TRANSFER_SRC [TransferSrc] = vks::core::VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
442 const TRANSFER_DST [TransferDst] = vks::core::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
443 const UNIFORM_TEXEL_BUFFER [UniformTexelBuffer] = vks::core::VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
444 const STORAGE_TEXEL_BUFFER [StorageTexelBuffer] = vks::core::VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
445 const UNIFORM_BUFFER [UniformBuffer] = vks::core::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
446 const STORAGE_BUFFER [StorageBuffer] = vks::core::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
447 const INDEX_BUFFER [IndexBuffer] = vks::core::VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
448 const VERTEX_BUFFER [VertexBuffer] = vks::core::VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
449 const INDIRECT_BUFFER [IndirectBuffer] = vks::core::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
450 }
451
452 no_bits {}
453}
454
455dacite_bitflags! {
456 pub struct BufferViewCreateFlags: vks::core::VkBufferViewCreateFlags;
458 pub enum BufferViewCreateFlagBits: vks::core::VkBufferViewCreateFlagBits;
459 max_enum: vks::core::VK_BUFFER_VIEW_CREATE_FLAG_BITS_MAX_ENUM;
460
461 flags {}
462 no_bits {}
463}
464
465dacite_bitflags! {
466 pub struct ImageViewCreateFlags: vks::core::VkImageViewCreateFlags;
468 pub enum ImageViewCreateFlagBits: vks::core::VkImageViewCreateFlagBits;
469 max_enum: vks::core::VK_IMAGE_VIEW_CREATE_FLAG_BITS_MAX_ENUM;
470
471 flags {}
472 no_bits {}
473}
474
475dacite_bitflags! {
476 pub struct ShaderModuleCreateFlags: vks::core::VkShaderModuleCreateFlags;
478 pub enum ShaderModuleCreateFlagBits: vks::core::VkShaderModuleCreateFlagBits;
479 max_enum: vks::core::VK_SHADER_MODULE_CREATE_FLAG_BITS_MAX_ENUM;
480
481 flags {}
482 no_bits {}
483}
484
485dacite_bitflags! {
486 pub struct PipelineCacheCreateFlags: vks::core::VkPipelineCacheCreateFlags;
488 pub enum PipelineCacheCreateFlagBits: vks::core::VkPipelineCacheCreateFlagBits;
489 max_enum: vks::core::VK_PIPELINE_CACHE_CREATE_FLAG_BITS_MAX_ENUM;
490
491 flags {}
492 no_bits {}
493}
494
495dacite_bitflags! {
496 pub struct PipelineCreateFlags: vks::core::VkPipelineCreateFlags;
498 pub enum PipelineCreateFlagBits: vks::core::VkPipelineCreateFlagBits;
499 max_enum: vks::core::VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM;
500
501 flags {
502 const DISABLE_OPTIMIZATION [DisableOptimization] = vks::core::VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
503 const ALLOW_DERIVATIVES [AllowDerivatives] = vks::core::VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;
504 const DERIVATIVE [Derivative] = vks::core::VK_PIPELINE_CREATE_DERIVATIVE_BIT;
505 }
506
507 no_bits {}
508}
509
510dacite_bitflags! {
511 pub struct PipelineShaderStageCreateFlags: vks::core::VkPipelineShaderStageCreateFlags;
513 pub enum PipelineShaderStageCreateFlagBits: vks::core::VkPipelineShaderStageCreateFlagBits;
514 max_enum: vks::core::VK_PIPELINE_SHADER_STAGE_CREATE_FLAG_BITS_MAX_ENUM;
515
516 flags {}
517 no_bits {}
518}
519
520dacite_bitflags! {
521 pub struct ShaderStageFlags: vks::core::VkShaderStageFlags;
523 pub enum ShaderStageFlagBits: vks::core::VkShaderStageFlagBits;
524 max_enum: vks::core::VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM;
525
526 flags {
527 const VERTEX [Vertex] = vks::core::VK_SHADER_STAGE_VERTEX_BIT;
528 const TESSELLATION_CONTROL [TessellationControl] = vks::core::VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
529 const TESSELLATION_EVALUATION [TessellationEvaluation] = vks::core::VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
530 const GEOMETRY [Geometry] = vks::core::VK_SHADER_STAGE_GEOMETRY_BIT;
531 const FRAGMENT [Fragment] = vks::core::VK_SHADER_STAGE_FRAGMENT_BIT;
532 const COMPUTE [Compute] = vks::core::VK_SHADER_STAGE_COMPUTE_BIT;
533 }
534
535 no_bits {
536 const ALL_GRAPHICS = vks::core::VK_SHADER_STAGE_ALL_GRAPHICS;
537 const ALL = vks::core::VK_SHADER_STAGE_ALL;
538 }
539}
540
541dacite_bitflags! {
542 pub struct PipelineVertexInputStateCreateFlags: vks::core::VkPipelineVertexInputStateCreateFlags;
544 pub enum PipelineVertexInputStateCreateFlagBits: vks::core::VkPipelineVertexInputStateCreateFlagBits;
545 max_enum: vks::core::VK_PIPELINE_VERTEX_INPUT_STATE_CREATE_FLAG_BITS_MAX_ENUM;
546
547 flags {}
548 no_bits {}
549}
550
551dacite_bitflags! {
552 pub struct PipelineInputAssemblyStateCreateFlags: vks::core::VkPipelineInputAssemblyStateCreateFlags;
554 pub enum PipelineInputAssemblyStateCreateFlagBits: vks::core::VkPipelineInputAssemblyStateCreateFlagBits;
555 max_enum: vks::core::VK_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_FLAG_BITS_MAX_ENUM;
556
557 flags {}
558 no_bits {}
559}
560
561dacite_bitflags! {
562 pub struct PipelineTessellationStateCreateFlags: vks::core::VkPipelineTessellationStateCreateFlags;
564 pub enum PipelineTessellationStateCreateFlagBits: vks::core::VkPipelineTessellationStateCreateFlagBits;
565 max_enum: vks::core::VK_PIPELINE_TESSELLATION_STATE_CREATE_FLAG_BITS_MAX_ENUM;
566
567 flags {}
568 no_bits {}
569}
570
571dacite_bitflags! {
572 pub struct PipelineViewportStateCreateFlags: vks::core::VkPipelineViewportStateCreateFlags;
574 pub enum PipelineViewportStateCreateFlagBits: vks::core::VkPipelineViewportStateCreateFlagBits;
575 max_enum: vks::core::VK_PIPELINE_VIEWPORT_STATE_CREATE_FLAG_BITS_MAX_ENUM;
576
577 flags {}
578 no_bits {}
579}
580
581dacite_bitflags! {
582 pub struct PipelineRasterizationStateCreateFlags: vks::core::VkPipelineRasterizationStateCreateFlags;
584 pub enum PipelineRasterizationStateCreateFlagBits: vks::core::VkPipelineRasterizationStateCreateFlagBits;
585 max_enum: vks::core::VK_PIPELINE_RASTERIZATION_STATE_CREATE_FLAG_BITS_MAX_ENUM;
586
587 flags {}
588 no_bits {}
589}
590
591dacite_bitflags! {
592 pub struct CullModeFlags: vks::core::VkCullModeFlags;
594 pub enum CullModeFlagBits: vks::core::VkCullModeFlagBits;
595 max_enum: vks::core::VK_CULL_MODE_FLAG_BITS_MAX_ENUM;
596
597 flags {
598 const FRONT [Front] = vks::core::VK_CULL_MODE_FRONT_BIT;
599 const BACK [Back] = vks::core::VK_CULL_MODE_BACK_BIT;
600 }
601
602 no_bits {
603 const NONE = vks::core::VK_CULL_MODE_NONE;
604 const FRONT_AND_BACK = vks::core::VK_CULL_MODE_FRONT_AND_BACK;
605 }
606}
607
608dacite_bitflags! {
609 pub struct PipelineMultisampleStateCreateFlags: vks::core::VkPipelineMultisampleStateCreateFlags;
611 pub enum PipelineMultisampleStateCreateFlagBits: vks::core::VkPipelineMultisampleStateCreateFlagBits;
612 max_enum: vks::core::VK_PIPELINE_MULTISAMPLE_STATE_CREATE_FLAG_BITS_MAX_ENUM;
613
614 flags {}
615 no_bits {}
616}
617
618dacite_bitflags! {
619 pub struct PipelineDepthStencilStateCreateFlags: vks::core::VkPipelineDepthStencilStateCreateFlags;
621 pub enum PipelineDepthStencilStateCreateFlagBits: vks::core::VkPipelineDepthStencilStateCreateFlagBits;
622 max_enum: vks::core::VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_FLAG_BITS_MAX_ENUM;
623
624 flags {}
625 no_bits {}
626}
627
628dacite_bitflags! {
629 pub struct PipelineColorBlendStateCreateFlags: vks::core::VkPipelineColorBlendStateCreateFlags;
631 pub enum PipelineColorBlendStateCreateFlagBits: vks::core::VkPipelineColorBlendStateCreateFlagBits;
632 max_enum: vks::core::VK_PIPELINE_COLOR_BLEND_STATE_CREATE_FLAG_BITS_MAX_ENUM;
633
634 flags {}
635 no_bits {}
636}
637
638dacite_bitflags! {
639 pub struct ColorComponentFlags: vks::core::VkColorComponentFlags;
641 pub enum ColorComponentFlagBits: vks::core::VkColorComponentFlagBits;
642 max_enum: vks::core::VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM;
643
644 flags {
645 const R [R] = vks::core::VK_COLOR_COMPONENT_R_BIT;
646 const G [G] = vks::core::VK_COLOR_COMPONENT_G_BIT;
647 const B [B] = vks::core::VK_COLOR_COMPONENT_B_BIT;
648 const A [A] = vks::core::VK_COLOR_COMPONENT_A_BIT;
649 }
650
651 no_bits {}
652}
653
654dacite_bitflags! {
655 pub struct PipelineDynamicStateCreateFlags: vks::core::VkPipelineDynamicStateCreateFlags;
657 pub enum PipelineDynamicStateCreateFlagBits: vks::core::VkPipelineDynamicStateCreateFlagBits;
658 max_enum: vks::core::VK_PIPELINE_DYNAMIC_STATE_CREATE_FLAG_BITS_MAX_ENUM;
659
660 flags {}
661 no_bits {}
662}
663
664dacite_bitflags! {
665 pub struct PipelineLayoutCreateFlags: vks::core::VkPipelineLayoutCreateFlags;
667 pub enum PipelineLayoutCreateFlagBits: vks::core::VkPipelineLayoutCreateFlagBits;
668 max_enum: vks::core::VK_PIPELINE_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM;
669
670 flags {}
671 no_bits {}
672}
673
674dacite_bitflags! {
675 pub struct SamplerCreateFlags: vks::core::VkSamplerCreateFlags;
677 pub enum SamplerCreateFlagBits: vks::core::VkSamplerCreateFlagBits;
678 max_enum: vks::core::VK_SAMPLER_CREATE_FLAG_BITS_MAX_ENUM;
679
680 flags {}
681 no_bits {}
682}
683
684dacite_bitflags! {
685 pub struct DescriptorSetLayoutCreateFlags: vks::core::VkDescriptorSetLayoutCreateFlags;
687 pub enum DescriptorSetLayoutCreateFlagBits: vks::core::VkDescriptorSetLayoutCreateFlagBits;
688 max_enum: vks::core::VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM;
689
690 flags {}
691 no_bits {}
692}
693
694dacite_bitflags! {
695 pub struct DescriptorPoolCreateFlags: vks::core::VkDescriptorPoolCreateFlags;
697 pub enum DescriptorPoolCreateFlagBits: vks::core::VkDescriptorPoolCreateFlagBits;
698 max_enum: vks::core::VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM;
699
700 flags {
701 const FREE_DESCRIPTOR_SET [FreeDescriptorSet] = vks::core::VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
702 }
703
704 no_bits {}
705}
706
707dacite_bitflags! {
708 pub struct DescriptorPoolResetFlags: vks::core::VkDescriptorPoolResetFlags;
710 pub enum DescriptorPoolResetFlagBits: vks::core::VkDescriptorPoolResetFlagBits;
711 max_enum: vks::core::VK_DESCRIPTOR_POOL_RESET_FLAG_BITS_MAX_ENUM;
712
713 flags {}
714 no_bits {}
715}
716
717dacite_bitflags! {
718 pub struct FramebufferCreateFlags: vks::core::VkFramebufferCreateFlags;
720 pub enum FramebufferCreateFlagBits: vks::core::VkFramebufferCreateFlagBits;
721 max_enum: vks::core::VK_FRAMEBUFFER_CREATE_FLAG_BITS_MAX_ENUM;
722
723 flags {}
724 no_bits {}
725}
726
727dacite_bitflags! {
728 pub struct RenderPassCreateFlags: vks::core::VkRenderPassCreateFlags;
730 pub enum RenderPassCreateFlagBits: vks::core::VkRenderPassCreateFlagBits;
731 max_enum: vks::core::VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM;
732
733 flags {}
734 no_bits {}
735}
736
737dacite_bitflags! {
738 pub struct AttachmentDescriptionFlags: vks::core::VkAttachmentDescriptionFlags;
740 pub enum AttachmentDescriptionFlagBits: vks::core::VkAttachmentDescriptionFlagBits;
741 max_enum: vks::core::VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM;
742
743 flags {
744 const MAY_ALIAS [MayAlias] = vks::core::VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT;
745 }
746
747 no_bits {}
748}
749
750dacite_bitflags! {
751 pub struct SubpassDescriptionFlags: vks::core::VkSubpassDescriptionFlags;
753 pub enum SubpassDescriptionFlagBits: vks::core::VkSubpassDescriptionFlagBits;
754 max_enum: vks::core::VK_SUBPASS_DESCRIPTION_FLAG_BITS_MAX_ENUM;
755
756 flags {}
757 no_bits {}
758}
759
760dacite_bitflags! {
761 pub struct AccessFlags: vks::core::VkAccessFlags;
763 pub enum AccessFlagBits: vks::core::VkAccessFlagBits;
764 max_enum: vks::core::VK_ACCESS_FLAG_BITS_MAX_ENUM;
765
766 flags {
767 const INDIRECT_COMMAND_READ [IndirectCommandRead] = vks::core::VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
768 const INDEX_READ [IndexRead] = vks::core::VK_ACCESS_INDEX_READ_BIT;
769 const VERTEX_ATTRIBUTE_READ [VertexAttributeRead] = vks::core::VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
770 const UNIFORM_READ [UniformRead] = vks::core::VK_ACCESS_UNIFORM_READ_BIT;
771 const INPUT_ATTACHMENT_READ [InputAttachmentRead] = vks::core::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
772 const SHADER_READ [ShaderRead] = vks::core::VK_ACCESS_SHADER_READ_BIT;
773 const SHADER_WRITE [ShaderWrite] = vks::core::VK_ACCESS_SHADER_WRITE_BIT;
774 const COLOR_ATTACHMENT_READ [ColorAttachmentRead] = vks::core::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
775 const COLOR_ATTACHMENT_WRITE [ColorAttachmentWrite] = vks::core::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
776 const DEPTH_STENCIL_ATTACHMENT_READ [DepthStencilAttachmentRead] = vks::core::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
777 const DEPTH_STENCIL_ATTACHMENT_WRITE [DepthStencilAttachmentWrite] = vks::core::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
778 const TRANSFER_READ [TransferRead] = vks::core::VK_ACCESS_TRANSFER_READ_BIT;
779 const TRANSFER_WRITE [TransferWrite] = vks::core::VK_ACCESS_TRANSFER_WRITE_BIT;
780 const HOST_READ [HostRead] = vks::core::VK_ACCESS_HOST_READ_BIT;
781 const HOST_WRITE [HostWrite] = vks::core::VK_ACCESS_HOST_WRITE_BIT;
782 const MEMORY_READ [MemoryRead] = vks::core::VK_ACCESS_MEMORY_READ_BIT;
783 const MEMORY_WRITE [MemoryWrite] = vks::core::VK_ACCESS_MEMORY_WRITE_BIT;
784 }
785
786 no_bits {}
787}
788
789dacite_bitflags! {
790 pub struct DependencyFlags: vks::core::VkDependencyFlags;
792 pub enum DependencyFlagBits: vks::core::VkDependencyFlagBits;
793 max_enum: vks::core::VK_DEPENDENCY_FLAG_BITS_MAX_ENUM;
794
795 flags {
796 const BY_REGION [ByRegion] = vks::core::VK_DEPENDENCY_BY_REGION_BIT;
797 }
798
799 no_bits {}
800}
801
802dacite_bitflags! {
803 pub struct CommandPoolCreateFlags: vks::core::VkCommandPoolCreateFlags;
805 pub enum CommandPoolCreateFlagBits: vks::core::VkCommandPoolCreateFlagBits;
806 max_enum: vks::core::VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM;
807
808 flags {
809 const TRANSIENT [Transient] = vks::core::VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;
810 const RESET_COMMAND_BUFFER [ResetCommandBuffer] = vks::core::VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
811 }
812
813 no_bits {}
814}
815
816dacite_bitflags! {
817 pub struct CommandPoolResetFlags: vks::core::VkCommandPoolResetFlags;
819 pub enum CommandPoolResetFlagBits: vks::core::VkCommandPoolResetFlagBits;
820 max_enum: vks::core::VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM;
821
822 flags {
823 const RELEASE_RESOURCES [ReleaseResources] = vks::core::VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT;
824 }
825
826 no_bits {}
827}
828
829dacite_bitflags! {
830 pub struct CommandBufferUsageFlags: vks::core::VkCommandBufferUsageFlags;
832 pub enum CommandBufferUsageFlagBits: vks::core::VkCommandBufferUsageFlagBits;
833 max_enum: vks::core::VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM;
834
835 flags {
836 const ONE_TIME_SUBMIT [OneTimeSubmit] = vks::core::VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
837 const RENDER_PASS_CONTINUE [RenderPassContinue] = vks::core::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
838 const SIMULTANEOUS_USE [SimultaneousUse] = vks::core::VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
839 }
840
841 no_bits {}
842}
843
844dacite_bitflags! {
845 pub struct QueryControlFlags: vks::core::VkQueryControlFlags;
847 pub enum QueryControlFlagBits: vks::core::VkQueryControlFlagBits;
848 max_enum: vks::core::VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM;
849
850 flags {
851 const PRECISE [Precise] = vks::core::VK_QUERY_CONTROL_PRECISE_BIT;
852 }
853
854 no_bits {}
855}
856
857dacite_bitflags! {
858 pub struct CommandBufferResetFlags: vks::core::VkCommandBufferResetFlags;
860 pub enum CommandBufferResetFlagBits: vks::core::VkCommandBufferResetFlagBits;
861 max_enum: vks::core::VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM;
862
863 flags {
864 const RELEASE_RESOURCES [ReleaseResources] = vks::core::VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT;
865 }
866
867 no_bits {}
868}
869
870dacite_bitflags! {
871 pub struct StencilFaceFlags: vks::core::VkStencilFaceFlags;
873 pub enum StencilFaceFlagBits: vks::core::VkStencilFaceFlagBits;
874 max_enum: vks::core::VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM;
875
876 flags {
877 const FRONT [Front] = vks::core::VK_STENCIL_FACE_FRONT_BIT;
878 const BACK [Back] = vks::core::VK_STENCIL_FACE_BACK_BIT;
879 }
880
881 no_bits {
882 const FRONT_AND_BACK = vks::core::VK_STENCIL_FRONT_AND_BACK;
883 }
884}
885
886#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
887pub enum OptionalDeviceSize {
888 Size(u64),
889 WholeSize,
890}
891
892impl From<OptionalDeviceSize> for u64 {
893 fn from(size: OptionalDeviceSize) -> Self {
894 match size {
895 OptionalDeviceSize::Size(size) => size,
896 OptionalDeviceSize::WholeSize => vks::core::VK_WHOLE_SIZE,
897 }
898 }
899}
900
901#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
902pub enum OptionalMipLevels {
903 MipLevels(u32),
904 Remaining,
905}
906
907impl From<OptionalMipLevels> for u32 {
908 fn from(mip_levels: OptionalMipLevels) -> Self {
909 match mip_levels {
910 OptionalMipLevels::MipLevels(mip_levels) => mip_levels,
911 OptionalMipLevels::Remaining => vks::core::VK_REMAINING_MIP_LEVELS,
912 }
913 }
914}
915
916#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
917pub enum OptionalArrayLayers {
918 ArrayLayers(u32),
919 Remaining,
920}
921
922impl From<OptionalArrayLayers> for u32 {
923 fn from(array_layers: OptionalArrayLayers) -> Self {
924 match array_layers {
925 OptionalArrayLayers::ArrayLayers(array_layers) => array_layers,
926 OptionalArrayLayers::Remaining => vks::core::VK_REMAINING_ARRAY_LAYERS,
927 }
928 }
929}
930
931#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
932pub enum AttachmentIndex {
933 Index(u32),
934 Unused,
935}
936
937impl From<AttachmentIndex> for u32 {
938 fn from(index: AttachmentIndex) -> Self {
939 match index {
940 AttachmentIndex::Index(index) => index,
941 AttachmentIndex::Unused => vks::core::VK_ATTACHMENT_UNUSED
942 }
943 }
944}
945
946impl From<u32> for AttachmentIndex {
947 fn from(index: u32) -> Self {
948 match index {
949 vks::core::VK_ATTACHMENT_UNUSED => AttachmentIndex::Unused,
950 _ => AttachmentIndex::Index(index),
951 }
952 }
953}
954
955#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
956pub enum QueueFamilyIndex {
957 Index(u32),
958 Ignored,
959}
960
961impl From<QueueFamilyIndex> for u32 {
962 fn from(index: QueueFamilyIndex) -> Self {
963 match index {
964 QueueFamilyIndex::Index(index) => index,
965 QueueFamilyIndex::Ignored => vks::core::VK_QUEUE_FAMILY_IGNORED,
966 }
967 }
968}
969
970#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
971pub enum SubpassIndex {
972 Index(u32),
973 External,
974}
975
976impl From<SubpassIndex> for u32 {
977 fn from(index: SubpassIndex) -> Self {
978 match index {
979 SubpassIndex::Index(index) => index,
980 SubpassIndex::External => vks::core::VK_SUBPASS_EXTERNAL,
981 }
982 }
983}
984
985impl From<u32> for SubpassIndex {
986 fn from(index: u32) -> Self {
987 match index {
988 vks::core::VK_SUBPASS_EXTERNAL => SubpassIndex::External,
989 _ => SubpassIndex::Index(index),
990 }
991 }
992}
993
994#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
995pub enum QueryResult {
996 U32(u32),
997 U64(u64),
998}
999
1000#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1001pub enum Timeout {
1002 None,
1003 Some(Duration),
1004 Infinite,
1005}
1006
1007impl Timeout {
1008 #[inline]
1009 pub fn as_nanoseconds(&self) -> u64 {
1010 match *self {
1011 Timeout::None => 0,
1012 Timeout::Some(ref d) => 1_000_000_000u64 * d.as_secs() + u64::from(d.subsec_nanos()),
1013 Timeout::Infinite => u64::max_value(),
1014 }
1015 }
1016}
1017
1018#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1020pub struct Version {
1021 pub major: u32,
1022 pub minor: u32,
1023 pub patch: u32,
1024}
1025
1026impl fmt::Display for Version {
1027 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1028 write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
1029 }
1030}
1031
1032impl Version {
1033 pub fn from_api_version(version: u32) -> Self {
1034 Version {
1035 major: vks::vk_version_major(version),
1036 minor: vks::vk_version_minor(version),
1037 patch: vks::vk_version_patch(version),
1038 }
1039 }
1040
1041 pub fn from_optional_api_version(version: u32) -> Option<Self> {
1042 if version != 0 {
1043 Some(Version::from_api_version(version))
1044 }
1045 else {
1046 None
1047 }
1048 }
1049
1050 pub fn as_api_version(&self) -> u32 {
1051 vks::vk_make_version(self.major, self.minor, self.patch)
1052 }
1053
1054 pub fn api_version_from_optional(version: Option<Version>) -> u32 {
1055 match version {
1056 Some(version) => version.as_api_version(),
1057 None => 0,
1058 }
1059 }
1060}
1061
1062pub const LOD_CLAMP_NONE: f32 = vks::core::VK_LOD_CLAMP_NONE;
1063pub const REMAINING_MIP_LEVELS: u32 = vks::core::VK_REMAINING_MIP_LEVELS;
1064pub const REMAINING_ARRAY_LAYERS: u32 = vks::core::VK_REMAINING_ARRAY_LAYERS;
1065pub const WHOLE_SIZE: u64 = vks::core::VK_WHOLE_SIZE;
1066pub const ATTACHMENT_UNUSED: u32 = vks::core::VK_ATTACHMENT_UNUSED;
1067pub const QUEUE_FAMILY_IGNORED: u32 = vks::core::VK_QUEUE_FAMILY_IGNORED;
1068pub const SUBPASS_EXTERNAL: u32 = vks::core::VK_SUBPASS_EXTERNAL;
1069pub const MAX_PHYSICAL_DEVICE_NAME_SIZE: usize = vks::core::VK_MAX_PHYSICAL_DEVICE_NAME_SIZE;
1070pub const UUID_SIZE: usize = vks::core::VK_UUID_SIZE;
1071pub const MAX_MEMORY_TYPES: usize = vks::core::VK_MAX_MEMORY_TYPES;
1072pub const MAX_MEMORY_HEAPS: usize = vks::core::VK_MAX_MEMORY_HEAPS;
1073pub const MAX_EXTENSION_NAME_SIZE: usize = vks::core::VK_MAX_EXTENSION_NAME_SIZE;
1074pub const MAX_DESCRIPTION_SIZE: usize = vks::core::VK_MAX_DESCRIPTION_SIZE;
1075
1076#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1078pub enum PipelineCacheHeaderVersion {
1079 One,
1080 Unknown(vks::core::VkPipelineCacheHeaderVersion),
1081}
1082
1083#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1085pub enum Error {
1086 OutOfHostMemory,
1087 OutOfDeviceMemory,
1088 InitializationFailed,
1089 DeviceLost,
1090 MemoryMapFailed,
1091 LayerNotPresent,
1092 ExtensionNotPresent,
1093 FeatureNotPresent,
1094 IncompatibleDriver,
1095 TooManyObjects,
1096 FormatNotSupported,
1097 FragmentedPool,
1098
1099 SurfaceLostKhr,
1101
1102 NativeWindowInUseKhr,
1104
1105 ValidationFailedExt,
1107
1108 OutOfDateKhr,
1110
1111 IncompatibleDisplayKhr,
1113
1114 InvalidShaderNv,
1116
1117 Unknown(vks::core::VkResult),
1118}
1119
1120impl fmt::Display for Error {
1121 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1122 write!(f, "{}", ::std::error::Error::description(self))
1123 }
1124}
1125
1126impl ::std::error::Error for Error {
1127 fn description(&self) -> &str {
1128 match *self {
1129 Error::OutOfHostMemory => "OutOfHostMemory",
1130 Error::OutOfDeviceMemory => "OutOfDeviceMemory",
1131 Error::InitializationFailed => "InitializationFailed",
1132 Error::DeviceLost => "DeviceLost",
1133 Error::MemoryMapFailed => "MemoryMapFailed",
1134 Error::LayerNotPresent => "LayerNotPresent",
1135 Error::ExtensionNotPresent => "ExtensionNotPresent",
1136 Error::FeatureNotPresent => "FeatureNotPresent",
1137 Error::IncompatibleDriver => "IncompatibleDriver",
1138 Error::TooManyObjects => "TooManyObjects",
1139 Error::FormatNotSupported => "FormatNotSupported",
1140 Error::FragmentedPool => "FragmentedPool",
1141 Error::SurfaceLostKhr => "SurfaceLost",
1142 Error::NativeWindowInUseKhr => "NativeWindowInUse",
1143 Error::ValidationFailedExt => "ValidationFailed",
1144 Error::OutOfDateKhr => "OutOfDate",
1145 Error::IncompatibleDisplayKhr => "IncompatibleDisplay",
1146 Error::InvalidShaderNv => "InvalidShader",
1147 Error::Unknown(_) => "unknown error",
1148 }
1149 }
1150}
1151
1152impl From<vks::core::VkResult> for Error {
1153 fn from(res: vks::core::VkResult) -> Self {
1154 debug_assert!(res < 0);
1155
1156 match res {
1157 vks::core::VK_ERROR_OUT_OF_HOST_MEMORY => Error::OutOfHostMemory,
1158 vks::core::VK_ERROR_OUT_OF_DEVICE_MEMORY => Error::OutOfDeviceMemory,
1159 vks::core::VK_ERROR_INITIALIZATION_FAILED => Error::InitializationFailed,
1160 vks::core::VK_ERROR_DEVICE_LOST => Error::DeviceLost,
1161 vks::core::VK_ERROR_MEMORY_MAP_FAILED => Error::MemoryMapFailed,
1162 vks::core::VK_ERROR_LAYER_NOT_PRESENT => Error::LayerNotPresent,
1163 vks::core::VK_ERROR_EXTENSION_NOT_PRESENT => Error::ExtensionNotPresent,
1164 vks::core::VK_ERROR_FEATURE_NOT_PRESENT => Error::FeatureNotPresent,
1165 vks::core::VK_ERROR_INCOMPATIBLE_DRIVER => Error::IncompatibleDriver,
1166 vks::core::VK_ERROR_TOO_MANY_OBJECTS => Error::TooManyObjects,
1167 vks::core::VK_ERROR_FORMAT_NOT_SUPPORTED => Error::FormatNotSupported,
1168 vks::core::VK_ERROR_FRAGMENTED_POOL => Error::FragmentedPool,
1169 vks::core::VK_ERROR_SURFACE_LOST_KHR => Error::SurfaceLostKhr,
1170 vks::core::VK_ERROR_NATIVE_WINDOW_IN_USE_KHR => Error::NativeWindowInUseKhr,
1171 vks::core::VK_ERROR_VALIDATION_FAILED_EXT => Error::ValidationFailedExt,
1172 vks::core::VK_ERROR_OUT_OF_DATE_KHR => Error::OutOfDateKhr,
1173 vks::core::VK_ERROR_INCOMPATIBLE_DISPLAY_KHR => Error::IncompatibleDisplayKhr,
1174 vks::core::VK_ERROR_INVALID_SHADER_NV => Error::InvalidShaderNv,
1175 _ => Error::Unknown(res),
1176 }
1177 }
1178}
1179
1180impl From<Error> for vks::core::VkResult {
1181 fn from(e: Error) -> Self {
1182 match e {
1183 Error::OutOfHostMemory => vks::core::VK_ERROR_OUT_OF_HOST_MEMORY,
1184 Error::OutOfDeviceMemory => vks::core::VK_ERROR_OUT_OF_DEVICE_MEMORY,
1185 Error::InitializationFailed => vks::core::VK_ERROR_INITIALIZATION_FAILED,
1186 Error::DeviceLost => vks::core::VK_ERROR_DEVICE_LOST,
1187 Error::MemoryMapFailed => vks::core::VK_ERROR_MEMORY_MAP_FAILED,
1188 Error::LayerNotPresent => vks::core::VK_ERROR_LAYER_NOT_PRESENT,
1189 Error::ExtensionNotPresent => vks::core::VK_ERROR_EXTENSION_NOT_PRESENT,
1190 Error::FeatureNotPresent => vks::core::VK_ERROR_FEATURE_NOT_PRESENT,
1191 Error::IncompatibleDriver => vks::core::VK_ERROR_INCOMPATIBLE_DRIVER,
1192 Error::TooManyObjects => vks::core::VK_ERROR_TOO_MANY_OBJECTS,
1193 Error::FormatNotSupported => vks::core::VK_ERROR_FORMAT_NOT_SUPPORTED,
1194 Error::FragmentedPool => vks::core::VK_ERROR_FRAGMENTED_POOL,
1195 Error::SurfaceLostKhr => vks::core::VK_ERROR_SURFACE_LOST_KHR,
1196 Error::NativeWindowInUseKhr => vks::core::VK_ERROR_NATIVE_WINDOW_IN_USE_KHR,
1197 Error::ValidationFailedExt => vks::core::VK_ERROR_VALIDATION_FAILED_EXT,
1198 Error::OutOfDateKhr => vks::core::VK_ERROR_OUT_OF_DATE_KHR,
1199 Error::IncompatibleDisplayKhr => vks::core::VK_ERROR_INCOMPATIBLE_DISPLAY_KHR,
1200 Error::InvalidShaderNv => vks::core::VK_ERROR_INVALID_SHADER_NV,
1201 Error::Unknown(res) => res,
1202 }
1203 }
1204}
1205
1206#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1208pub enum SystemAllocationSope {
1209 Command,
1210 Object,
1211 Cache,
1212 Device,
1213 Instance,
1214 Unknown(vks::core::VkSystemAllocationScope),
1215}
1216
1217impl From<vks::core::VkSystemAllocationScope> for SystemAllocationSope {
1218 fn from(scope: vks::core::VkSystemAllocationScope) -> Self {
1219 match scope {
1220 vks::core::VK_SYSTEM_ALLOCATION_SCOPE_COMMAND => SystemAllocationSope::Command,
1221 vks::core::VK_SYSTEM_ALLOCATION_SCOPE_OBJECT => SystemAllocationSope::Object,
1222 vks::core::VK_SYSTEM_ALLOCATION_SCOPE_CACHE => SystemAllocationSope::Cache,
1223 vks::core::VK_SYSTEM_ALLOCATION_SCOPE_DEVICE => SystemAllocationSope::Device,
1224 vks::core::VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE => SystemAllocationSope::Instance,
1225 _ => SystemAllocationSope::Unknown(scope),
1226 }
1227 }
1228}
1229
1230#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1232pub enum InternalAllocationType {
1233 Executable,
1234 Unknown(vks::core::VkInternalAllocationType),
1235}
1236
1237impl From<vks::core::VkInternalAllocationType> for InternalAllocationType {
1238 fn from(allocation_type: vks::core::VkInternalAllocationType) -> Self {
1239 match allocation_type {
1240 vks::core::VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE => InternalAllocationType::Executable,
1241 _ => InternalAllocationType::Unknown(allocation_type),
1242 }
1243 }
1244}
1245
1246#[allow(non_camel_case_types)]
1248#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1249pub enum Format {
1250 Undefined,
1251 R4G4_UNorm_Pack8,
1252 R4G4B4A4_UNorm_Pack16,
1253 B4G4R4A4_UNorm_Pack16,
1254 R5G6B5_UNorm_Pack16,
1255 B5G6R5_UNorm_Pack16,
1256 R5G5B5A1_UNorm_Pack16,
1257 B5G5R5A1_UNorm_Pack16,
1258 A1R5G5B5_UNorm_Pack16,
1259 R8_UNorm,
1260 R8_SNorm,
1261 R8_UScaled,
1262 R8_SScaled,
1263 R8_UInt,
1264 R8_SInt,
1265 R8_sRGB,
1266 R8G8_UNorm,
1267 R8G8_SNorm,
1268 R8G8_UScaled,
1269 R8G8_SScaled,
1270 R8G8_UInt,
1271 R8G8_SInt,
1272 R8G8_sRGB,
1273 R8G8B8_UNorm,
1274 R8G8B8_SNorm,
1275 R8G8B8_UScaled,
1276 R8G8B8_SScaled,
1277 R8G8B8_UInt,
1278 R8G8B8_SInt,
1279 R8G8B8_sRGB,
1280 B8G8R8_UNorm,
1281 B8G8R8_SNorm,
1282 B8G8R8_UScaled,
1283 B8G8R8_SScaled,
1284 B8G8R8_UInt,
1285 B8G8R8_SInt,
1286 B8G8R8_sRGB,
1287 R8G8B8A8_UNorm,
1288 R8G8B8A8_SNorm,
1289 R8G8B8A8_UScaled,
1290 R8G8B8A8_SScaled,
1291 R8G8B8A8_UInt,
1292 R8G8B8A8_SInt,
1293 R8G8B8A8_sRGB,
1294 B8G8R8A8_UNorm,
1295 B8G8R8A8_SNorm,
1296 B8G8R8A8_UScaled,
1297 B8G8R8A8_SScaled,
1298 B8G8R8A8_UInt,
1299 B8G8R8A8_SInt,
1300 B8G8R8A8_sRGB,
1301 A8B8G8R8_UNorm_Pack32,
1302 A8B8G8R8_SNorm_Pack32,
1303 A8B8G8R8_UScaled_Pack32,
1304 A8B8G8R8_SScaled_Pack32,
1305 A8B8G8R8_UInt_Pack32,
1306 A8B8G8R8_SInt_Pack32,
1307 A8B8G8R8_sRGB_Pack32,
1308 A2R10G10B10_UNorm_Pack32,
1309 A2R10G10B10_SNorm_Pack32,
1310 A2R10G10B10_UScaled_Pack32,
1311 A2R10G10B10_SScaled_Pack32,
1312 A2R10G10B10_UInt_Pack32,
1313 A2R10G10B10_SInt_Pack32,
1314 A2B10G10R10_UNorm_Pack32,
1315 A2B10G10R10_SNorm_Pack32,
1316 A2B10G10R10_UScaled_Pack32,
1317 A2B10G10R10_SScaled_Pack32,
1318 A2B10G10R10_UInt_Pack32,
1319 A2B10G10R10_SInt_Pack32,
1320 R16_UNorm,
1321 R16_SNorm,
1322 R16_UScaled,
1323 R16_SScaled,
1324 R16_UInt,
1325 R16_SInt,
1326 R16_SFloat,
1327 R16G16_UNorm,
1328 R16G16_SNorm,
1329 R16G16_UScaled,
1330 R16G16_SScaled,
1331 R16G16_UInt,
1332 R16G16_SInt,
1333 R16G16_SFloat,
1334 R16G16B16_UNorm,
1335 R16G16B16_SNorm,
1336 R16G16B16_UScaled,
1337 R16G16B16_SScaled,
1338 R16G16B16_UInt,
1339 R16G16B16_SInt,
1340 R16G16B16_SFloat,
1341 R16G16B16A16_UNorm,
1342 R16G16B16A16_SNorm,
1343 R16G16B16A16_UScaled,
1344 R16G16B16A16_SScaled,
1345 R16G16B16A16_UInt,
1346 R16G16B16A16_SInt,
1347 R16G16B16A16_SFloat,
1348 R32_UInt,
1349 R32_SInt,
1350 R32_SFloat,
1351 R32G32_UInt,
1352 R32G32_SInt,
1353 R32G32_SFloat,
1354 R32G32B32_UInt,
1355 R32G32B32_SInt,
1356 R32G32B32_SFloat,
1357 R32G32B32A32_UInt,
1358 R32G32B32A32_SInt,
1359 R32G32B32A32_SFloat,
1360 R64_UInt,
1361 R64_SInt,
1362 R64_SFloat,
1363 R64G64_UInt,
1364 R64G64_SInt,
1365 R64G64_SFloat,
1366 R64G64B64_UInt,
1367 R64G64B64_SInt,
1368 R64G64B64_SFloat,
1369 R64G64B64A64_UInt,
1370 R64G64B64A64_SInt,
1371 R64G64B64A64_SFloat,
1372 B10G11R11_UFloat_Pack32,
1373 E5B9G9R9_UFloat_Pack32,
1374 D16_UNorm,
1375 X8_D24_UNorm_Pack32,
1376 D32_SFloat,
1377 S8_UInt,
1378 D16_UNorm_S8_UInt,
1379 D24_UNorm_S8_UInt,
1380 D32_SFloat_S8_UInt,
1381 BC1_RGB_UNorm_Block,
1382 BC1_RGB_sRGB_Block,
1383 BC1_RGBA_UNorm_Block,
1384 BC1_RGBA_sRGB_Block,
1385 BC2_UNorm_Block,
1386 BC2_sRGB_Block,
1387 BC3_UNorm_Block,
1388 BC3_sRGB_Block,
1389 BC4_UNorm_Block,
1390 BC4_SNorm_Block,
1391 BC5_UNorm_Block,
1392 BC5_SNorm_Block,
1393 BC6H_UFloat_Block,
1394 BC6H_SFloat_Block,
1395 BC7_UNorm_Block,
1396 BC7_sRGB_Block,
1397 ETC2_R8G8B8_UNorm_Block,
1398 ETC2_R8G8B8_sRGB_Block,
1399 ETC2_R8G8B8A1_UNorm_Block,
1400 ETC2_R8G8B8A1_sRGB_Block,
1401 ETC2_R8G8B8A8_UNorm_Block,
1402 ETC2_R8G8B8A8_sRGB_Block,
1403 EAC_R11_UNorm_Block,
1404 EAC_R11_SNorm_Block,
1405 EAC_R11G11_UNorm_Block,
1406 EAC_R11G11_SNorm_Block,
1407 ASTC_4x4_UNorm_Block,
1408 ASTC_4x4_sRGB_Block,
1409 ASTC_5x4_UNorm_Block,
1410 ASTC_5x4_sRGB_Block,
1411 ASTC_5x5_UNorm_Block,
1412 ASTC_5x5_sRGB_Block,
1413 ASTC_6x5_UNorm_Block,
1414 ASTC_6x5_sRGB_Block,
1415 ASTC_6x6_UNorm_Block,
1416 ASTC_6x6_sRGB_Block,
1417 ASTC_8x5_UNorm_Block,
1418 ASTC_8x5_sRGB_Block,
1419 ASTC_8x6_UNorm_Block,
1420 ASTC_8x6_sRGB_Block,
1421 ASTC_8x8_UNorm_Block,
1422 ASTC_8x8_sRGB_Block,
1423 ASTC_10x5_UNorm_Block,
1424 ASTC_10x5_sRGB_Block,
1425 ASTC_10x6_UNorm_Block,
1426 ASTC_10x6_sRGB_Block,
1427 ASTC_10x8_UNorm_Block,
1428 ASTC_10x8_sRGB_Block,
1429 ASTC_10x10_UNorm_Block,
1430 ASTC_10x10_sRGB_Block,
1431 ASTC_12x10_UNorm_Block,
1432 ASTC_12x10_sRGB_Block,
1433 ASTC_12x12_UNorm_Block,
1434 ASTC_12x12_sRGB_Block,
1435
1436 PVRTC1_2BPP_UNorm_Block_Img,
1438
1439 PVRTC1_4BPP_UNorm_Block_Img,
1441
1442 PVRTC2_2BPP_UNorm_Block_Img,
1444
1445 PVRTC2_4BPP_UNorm_Block_Img,
1447
1448 PVRTC1_2BPP_sRGB_Block_Img,
1450
1451 PVRTC1_4BPP_sRGB_Block_Img,
1453
1454 PVRTC2_2BPP_sRGB_Block_Img,
1456
1457 PVRTC2_4BPP_sRGB_Block_Img,
1459
1460 Unknown(vks::core::VkFormat),
1461}
1462
1463impl From<vks::core::VkFormat> for Format {
1464 fn from(format: vks::core::VkFormat) -> Self {
1465 match format {
1466 vks::core::VK_FORMAT_UNDEFINED => Format::Undefined,
1467 vks::core::VK_FORMAT_R4G4_UNORM_PACK8 => Format::R4G4_UNorm_Pack8,
1468 vks::core::VK_FORMAT_R4G4B4A4_UNORM_PACK16 => Format::R4G4B4A4_UNorm_Pack16,
1469 vks::core::VK_FORMAT_B4G4R4A4_UNORM_PACK16 => Format::B4G4R4A4_UNorm_Pack16,
1470 vks::core::VK_FORMAT_R5G6B5_UNORM_PACK16 => Format::R5G6B5_UNorm_Pack16,
1471 vks::core::VK_FORMAT_B5G6R5_UNORM_PACK16 => Format::B5G6R5_UNorm_Pack16,
1472 vks::core::VK_FORMAT_R5G5B5A1_UNORM_PACK16 => Format::R5G5B5A1_UNorm_Pack16,
1473 vks::core::VK_FORMAT_B5G5R5A1_UNORM_PACK16 => Format::B5G5R5A1_UNorm_Pack16,
1474 vks::core::VK_FORMAT_A1R5G5B5_UNORM_PACK16 => Format::A1R5G5B5_UNorm_Pack16,
1475 vks::core::VK_FORMAT_R8_UNORM => Format::R8_UNorm,
1476 vks::core::VK_FORMAT_R8_SNORM => Format::R8_SNorm,
1477 vks::core::VK_FORMAT_R8_USCALED => Format::R8_UScaled,
1478 vks::core::VK_FORMAT_R8_SSCALED => Format::R8_SScaled,
1479 vks::core::VK_FORMAT_R8_UINT => Format::R8_UInt,
1480 vks::core::VK_FORMAT_R8_SINT => Format::R8_SInt,
1481 vks::core::VK_FORMAT_R8_SRGB => Format::R8_sRGB,
1482 vks::core::VK_FORMAT_R8G8_UNORM => Format::R8G8_UNorm,
1483 vks::core::VK_FORMAT_R8G8_SNORM => Format::R8G8_SNorm,
1484 vks::core::VK_FORMAT_R8G8_USCALED => Format::R8G8_UScaled,
1485 vks::core::VK_FORMAT_R8G8_SSCALED => Format::R8G8_SScaled,
1486 vks::core::VK_FORMAT_R8G8_UINT => Format::R8G8_UInt,
1487 vks::core::VK_FORMAT_R8G8_SINT => Format::R8G8_SInt,
1488 vks::core::VK_FORMAT_R8G8_SRGB => Format::R8G8_sRGB,
1489 vks::core::VK_FORMAT_R8G8B8_UNORM => Format::R8G8B8_UNorm,
1490 vks::core::VK_FORMAT_R8G8B8_SNORM => Format::R8G8B8_SNorm,
1491 vks::core::VK_FORMAT_R8G8B8_USCALED => Format::R8G8B8_UScaled,
1492 vks::core::VK_FORMAT_R8G8B8_SSCALED => Format::R8G8B8_SScaled,
1493 vks::core::VK_FORMAT_R8G8B8_UINT => Format::R8G8B8_UInt,
1494 vks::core::VK_FORMAT_R8G8B8_SINT => Format::R8G8B8_SInt,
1495 vks::core::VK_FORMAT_R8G8B8_SRGB => Format::R8G8B8_sRGB,
1496 vks::core::VK_FORMAT_B8G8R8_UNORM => Format::B8G8R8_UNorm,
1497 vks::core::VK_FORMAT_B8G8R8_SNORM => Format::B8G8R8_SNorm,
1498 vks::core::VK_FORMAT_B8G8R8_USCALED => Format::B8G8R8_UScaled,
1499 vks::core::VK_FORMAT_B8G8R8_SSCALED => Format::B8G8R8_SScaled,
1500 vks::core::VK_FORMAT_B8G8R8_UINT => Format::B8G8R8_UInt,
1501 vks::core::VK_FORMAT_B8G8R8_SINT => Format::B8G8R8_SInt,
1502 vks::core::VK_FORMAT_B8G8R8_SRGB => Format::B8G8R8_sRGB,
1503 vks::core::VK_FORMAT_R8G8B8A8_UNORM => Format::R8G8B8A8_UNorm,
1504 vks::core::VK_FORMAT_R8G8B8A8_SNORM => Format::R8G8B8A8_SNorm,
1505 vks::core::VK_FORMAT_R8G8B8A8_USCALED => Format::R8G8B8A8_UScaled,
1506 vks::core::VK_FORMAT_R8G8B8A8_SSCALED => Format::R8G8B8A8_SScaled,
1507 vks::core::VK_FORMAT_R8G8B8A8_UINT => Format::R8G8B8A8_UInt,
1508 vks::core::VK_FORMAT_R8G8B8A8_SINT => Format::R8G8B8A8_SInt,
1509 vks::core::VK_FORMAT_R8G8B8A8_SRGB => Format::R8G8B8A8_sRGB,
1510 vks::core::VK_FORMAT_B8G8R8A8_UNORM => Format::B8G8R8A8_UNorm,
1511 vks::core::VK_FORMAT_B8G8R8A8_SNORM => Format::B8G8R8A8_SNorm,
1512 vks::core::VK_FORMAT_B8G8R8A8_USCALED => Format::B8G8R8A8_UScaled,
1513 vks::core::VK_FORMAT_B8G8R8A8_SSCALED => Format::B8G8R8A8_SScaled,
1514 vks::core::VK_FORMAT_B8G8R8A8_UINT => Format::B8G8R8A8_UInt,
1515 vks::core::VK_FORMAT_B8G8R8A8_SINT => Format::B8G8R8A8_SInt,
1516 vks::core::VK_FORMAT_B8G8R8A8_SRGB => Format::B8G8R8A8_sRGB,
1517 vks::core::VK_FORMAT_A8B8G8R8_UNORM_PACK32 => Format::A8B8G8R8_UNorm_Pack32,
1518 vks::core::VK_FORMAT_A8B8G8R8_SNORM_PACK32 => Format::A8B8G8R8_SNorm_Pack32,
1519 vks::core::VK_FORMAT_A8B8G8R8_USCALED_PACK32 => Format::A8B8G8R8_UScaled_Pack32,
1520 vks::core::VK_FORMAT_A8B8G8R8_SSCALED_PACK32 => Format::A8B8G8R8_SScaled_Pack32,
1521 vks::core::VK_FORMAT_A8B8G8R8_UINT_PACK32 => Format::A8B8G8R8_UInt_Pack32,
1522 vks::core::VK_FORMAT_A8B8G8R8_SINT_PACK32 => Format::A8B8G8R8_SInt_Pack32,
1523 vks::core::VK_FORMAT_A8B8G8R8_SRGB_PACK32 => Format::A8B8G8R8_sRGB_Pack32,
1524 vks::core::VK_FORMAT_A2R10G10B10_UNORM_PACK32 => Format::A2R10G10B10_UNorm_Pack32,
1525 vks::core::VK_FORMAT_A2R10G10B10_SNORM_PACK32 => Format::A2R10G10B10_SNorm_Pack32,
1526 vks::core::VK_FORMAT_A2R10G10B10_USCALED_PACK32 => Format::A2R10G10B10_UScaled_Pack32,
1527 vks::core::VK_FORMAT_A2R10G10B10_SSCALED_PACK32 => Format::A2R10G10B10_SScaled_Pack32,
1528 vks::core::VK_FORMAT_A2R10G10B10_UINT_PACK32 => Format::A2R10G10B10_UInt_Pack32,
1529 vks::core::VK_FORMAT_A2R10G10B10_SINT_PACK32 => Format::A2R10G10B10_SInt_Pack32,
1530 vks::core::VK_FORMAT_A2B10G10R10_UNORM_PACK32 => Format::A2B10G10R10_UNorm_Pack32,
1531 vks::core::VK_FORMAT_A2B10G10R10_SNORM_PACK32 => Format::A2B10G10R10_SNorm_Pack32,
1532 vks::core::VK_FORMAT_A2B10G10R10_USCALED_PACK32 => Format::A2B10G10R10_UScaled_Pack32,
1533 vks::core::VK_FORMAT_A2B10G10R10_SSCALED_PACK32 => Format::A2B10G10R10_SScaled_Pack32,
1534 vks::core::VK_FORMAT_A2B10G10R10_UINT_PACK32 => Format::A2B10G10R10_UInt_Pack32,
1535 vks::core::VK_FORMAT_A2B10G10R10_SINT_PACK32 => Format::A2B10G10R10_SInt_Pack32,
1536 vks::core::VK_FORMAT_R16_UNORM => Format::R16_UNorm,
1537 vks::core::VK_FORMAT_R16_SNORM => Format::R16_SNorm,
1538 vks::core::VK_FORMAT_R16_USCALED => Format::R16_UScaled,
1539 vks::core::VK_FORMAT_R16_SSCALED => Format::R16_SScaled,
1540 vks::core::VK_FORMAT_R16_UINT => Format::R16_UInt,
1541 vks::core::VK_FORMAT_R16_SINT => Format::R16_SInt,
1542 vks::core::VK_FORMAT_R16_SFLOAT => Format::R16_SFloat,
1543 vks::core::VK_FORMAT_R16G16_UNORM => Format::R16G16_UNorm,
1544 vks::core::VK_FORMAT_R16G16_SNORM => Format::R16G16_SNorm,
1545 vks::core::VK_FORMAT_R16G16_USCALED => Format::R16G16_UScaled,
1546 vks::core::VK_FORMAT_R16G16_SSCALED => Format::R16G16_SScaled,
1547 vks::core::VK_FORMAT_R16G16_UINT => Format::R16G16_UInt,
1548 vks::core::VK_FORMAT_R16G16_SINT => Format::R16G16_SInt,
1549 vks::core::VK_FORMAT_R16G16_SFLOAT => Format::R16G16_SFloat,
1550 vks::core::VK_FORMAT_R16G16B16_UNORM => Format::R16G16B16_UNorm,
1551 vks::core::VK_FORMAT_R16G16B16_SNORM => Format::R16G16B16_SNorm,
1552 vks::core::VK_FORMAT_R16G16B16_USCALED => Format::R16G16B16_UScaled,
1553 vks::core::VK_FORMAT_R16G16B16_SSCALED => Format::R16G16B16_SScaled,
1554 vks::core::VK_FORMAT_R16G16B16_UINT => Format::R16G16B16_UInt,
1555 vks::core::VK_FORMAT_R16G16B16_SINT => Format::R16G16B16_SInt,
1556 vks::core::VK_FORMAT_R16G16B16_SFLOAT => Format::R16G16B16_SFloat,
1557 vks::core::VK_FORMAT_R16G16B16A16_UNORM => Format::R16G16B16A16_UNorm,
1558 vks::core::VK_FORMAT_R16G16B16A16_SNORM => Format::R16G16B16A16_SNorm,
1559 vks::core::VK_FORMAT_R16G16B16A16_USCALED => Format::R16G16B16A16_UScaled,
1560 vks::core::VK_FORMAT_R16G16B16A16_SSCALED => Format::R16G16B16A16_SScaled,
1561 vks::core::VK_FORMAT_R16G16B16A16_UINT => Format::R16G16B16A16_UInt,
1562 vks::core::VK_FORMAT_R16G16B16A16_SINT => Format::R16G16B16A16_SInt,
1563 vks::core::VK_FORMAT_R16G16B16A16_SFLOAT => Format::R16G16B16A16_SFloat,
1564 vks::core::VK_FORMAT_R32_UINT => Format::R32_UInt,
1565 vks::core::VK_FORMAT_R32_SINT => Format::R32_SInt,
1566 vks::core::VK_FORMAT_R32_SFLOAT => Format::R32_SFloat,
1567 vks::core::VK_FORMAT_R32G32_UINT => Format::R32G32_UInt,
1568 vks::core::VK_FORMAT_R32G32_SINT => Format::R32G32_SInt,
1569 vks::core::VK_FORMAT_R32G32_SFLOAT => Format::R32G32_SFloat,
1570 vks::core::VK_FORMAT_R32G32B32_UINT => Format::R32G32B32_UInt,
1571 vks::core::VK_FORMAT_R32G32B32_SINT => Format::R32G32B32_SInt,
1572 vks::core::VK_FORMAT_R32G32B32_SFLOAT => Format::R32G32B32_SFloat,
1573 vks::core::VK_FORMAT_R32G32B32A32_UINT => Format::R32G32B32A32_UInt,
1574 vks::core::VK_FORMAT_R32G32B32A32_SINT => Format::R32G32B32A32_SInt,
1575 vks::core::VK_FORMAT_R32G32B32A32_SFLOAT => Format::R32G32B32A32_SFloat,
1576 vks::core::VK_FORMAT_R64_UINT => Format::R64_UInt,
1577 vks::core::VK_FORMAT_R64_SINT => Format::R64_SInt,
1578 vks::core::VK_FORMAT_R64_SFLOAT => Format::R64_SFloat,
1579 vks::core::VK_FORMAT_R64G64_UINT => Format::R64G64_UInt,
1580 vks::core::VK_FORMAT_R64G64_SINT => Format::R64G64_SInt,
1581 vks::core::VK_FORMAT_R64G64_SFLOAT => Format::R64G64_SFloat,
1582 vks::core::VK_FORMAT_R64G64B64_UINT => Format::R64G64B64_UInt,
1583 vks::core::VK_FORMAT_R64G64B64_SINT => Format::R64G64B64_SInt,
1584 vks::core::VK_FORMAT_R64G64B64_SFLOAT => Format::R64G64B64_SFloat,
1585 vks::core::VK_FORMAT_R64G64B64A64_UINT => Format::R64G64B64A64_UInt,
1586 vks::core::VK_FORMAT_R64G64B64A64_SINT => Format::R64G64B64A64_SInt,
1587 vks::core::VK_FORMAT_R64G64B64A64_SFLOAT => Format::R64G64B64A64_SFloat,
1588 vks::core::VK_FORMAT_B10G11R11_UFLOAT_PACK32 => Format::B10G11R11_UFloat_Pack32,
1589 vks::core::VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 => Format::E5B9G9R9_UFloat_Pack32,
1590 vks::core::VK_FORMAT_D16_UNORM => Format::D16_UNorm,
1591 vks::core::VK_FORMAT_X8_D24_UNORM_PACK32 => Format::X8_D24_UNorm_Pack32,
1592 vks::core::VK_FORMAT_D32_SFLOAT => Format::D32_SFloat,
1593 vks::core::VK_FORMAT_S8_UINT => Format::S8_UInt,
1594 vks::core::VK_FORMAT_D16_UNORM_S8_UINT => Format::D16_UNorm_S8_UInt,
1595 vks::core::VK_FORMAT_D24_UNORM_S8_UINT => Format::D24_UNorm_S8_UInt,
1596 vks::core::VK_FORMAT_D32_SFLOAT_S8_UINT => Format::D32_SFloat_S8_UInt,
1597 vks::core::VK_FORMAT_BC1_RGB_UNORM_BLOCK => Format::BC1_RGB_UNorm_Block,
1598 vks::core::VK_FORMAT_BC1_RGB_SRGB_BLOCK => Format::BC1_RGB_sRGB_Block,
1599 vks::core::VK_FORMAT_BC1_RGBA_UNORM_BLOCK => Format::BC1_RGBA_UNorm_Block,
1600 vks::core::VK_FORMAT_BC1_RGBA_SRGB_BLOCK => Format::BC1_RGBA_sRGB_Block,
1601 vks::core::VK_FORMAT_BC2_UNORM_BLOCK => Format::BC2_UNorm_Block,
1602 vks::core::VK_FORMAT_BC2_SRGB_BLOCK => Format::BC2_sRGB_Block,
1603 vks::core::VK_FORMAT_BC3_UNORM_BLOCK => Format::BC3_UNorm_Block,
1604 vks::core::VK_FORMAT_BC3_SRGB_BLOCK => Format::BC3_sRGB_Block,
1605 vks::core::VK_FORMAT_BC4_UNORM_BLOCK => Format::BC4_UNorm_Block,
1606 vks::core::VK_FORMAT_BC4_SNORM_BLOCK => Format::BC4_SNorm_Block,
1607 vks::core::VK_FORMAT_BC5_UNORM_BLOCK => Format::BC5_UNorm_Block,
1608 vks::core::VK_FORMAT_BC5_SNORM_BLOCK => Format::BC5_SNorm_Block,
1609 vks::core::VK_FORMAT_BC6H_UFLOAT_BLOCK => Format::BC6H_UFloat_Block,
1610 vks::core::VK_FORMAT_BC6H_SFLOAT_BLOCK => Format::BC6H_SFloat_Block,
1611 vks::core::VK_FORMAT_BC7_UNORM_BLOCK => Format::BC7_UNorm_Block,
1612 vks::core::VK_FORMAT_BC7_SRGB_BLOCK => Format::BC7_sRGB_Block,
1613 vks::core::VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK => Format::ETC2_R8G8B8_UNorm_Block,
1614 vks::core::VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK => Format::ETC2_R8G8B8_sRGB_Block,
1615 vks::core::VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK => Format::ETC2_R8G8B8A1_UNorm_Block,
1616 vks::core::VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK => Format::ETC2_R8G8B8A1_sRGB_Block,
1617 vks::core::VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK => Format::ETC2_R8G8B8A8_UNorm_Block,
1618 vks::core::VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK => Format::ETC2_R8G8B8A8_sRGB_Block,
1619 vks::core::VK_FORMAT_EAC_R11_UNORM_BLOCK => Format::EAC_R11_UNorm_Block,
1620 vks::core::VK_FORMAT_EAC_R11_SNORM_BLOCK => Format::EAC_R11_SNorm_Block,
1621 vks::core::VK_FORMAT_EAC_R11G11_UNORM_BLOCK => Format::EAC_R11G11_UNorm_Block,
1622 vks::core::VK_FORMAT_EAC_R11G11_SNORM_BLOCK => Format::EAC_R11G11_SNorm_Block,
1623 vks::core::VK_FORMAT_ASTC_4x4_UNORM_BLOCK => Format::ASTC_4x4_UNorm_Block,
1624 vks::core::VK_FORMAT_ASTC_4x4_SRGB_BLOCK => Format::ASTC_4x4_sRGB_Block,
1625 vks::core::VK_FORMAT_ASTC_5x4_UNORM_BLOCK => Format::ASTC_5x4_UNorm_Block,
1626 vks::core::VK_FORMAT_ASTC_5x4_SRGB_BLOCK => Format::ASTC_5x4_sRGB_Block,
1627 vks::core::VK_FORMAT_ASTC_5x5_UNORM_BLOCK => Format::ASTC_5x5_UNorm_Block,
1628 vks::core::VK_FORMAT_ASTC_5x5_SRGB_BLOCK => Format::ASTC_5x5_sRGB_Block,
1629 vks::core::VK_FORMAT_ASTC_6x5_UNORM_BLOCK => Format::ASTC_6x5_UNorm_Block,
1630 vks::core::VK_FORMAT_ASTC_6x5_SRGB_BLOCK => Format::ASTC_6x5_sRGB_Block,
1631 vks::core::VK_FORMAT_ASTC_6x6_UNORM_BLOCK => Format::ASTC_6x6_UNorm_Block,
1632 vks::core::VK_FORMAT_ASTC_6x6_SRGB_BLOCK => Format::ASTC_6x6_sRGB_Block,
1633 vks::core::VK_FORMAT_ASTC_8x5_UNORM_BLOCK => Format::ASTC_8x5_UNorm_Block,
1634 vks::core::VK_FORMAT_ASTC_8x5_SRGB_BLOCK => Format::ASTC_8x5_sRGB_Block,
1635 vks::core::VK_FORMAT_ASTC_8x6_UNORM_BLOCK => Format::ASTC_8x6_UNorm_Block,
1636 vks::core::VK_FORMAT_ASTC_8x6_SRGB_BLOCK => Format::ASTC_8x6_sRGB_Block,
1637 vks::core::VK_FORMAT_ASTC_8x8_UNORM_BLOCK => Format::ASTC_8x8_UNorm_Block,
1638 vks::core::VK_FORMAT_ASTC_8x8_SRGB_BLOCK => Format::ASTC_8x8_sRGB_Block,
1639 vks::core::VK_FORMAT_ASTC_10x5_UNORM_BLOCK => Format::ASTC_10x5_UNorm_Block,
1640 vks::core::VK_FORMAT_ASTC_10x5_SRGB_BLOCK => Format::ASTC_10x5_sRGB_Block,
1641 vks::core::VK_FORMAT_ASTC_10x6_UNORM_BLOCK => Format::ASTC_10x6_UNorm_Block,
1642 vks::core::VK_FORMAT_ASTC_10x6_SRGB_BLOCK => Format::ASTC_10x6_sRGB_Block,
1643 vks::core::VK_FORMAT_ASTC_10x8_UNORM_BLOCK => Format::ASTC_10x8_UNorm_Block,
1644 vks::core::VK_FORMAT_ASTC_10x8_SRGB_BLOCK => Format::ASTC_10x8_sRGB_Block,
1645 vks::core::VK_FORMAT_ASTC_10x10_UNORM_BLOCK => Format::ASTC_10x10_UNorm_Block,
1646 vks::core::VK_FORMAT_ASTC_10x10_SRGB_BLOCK => Format::ASTC_10x10_sRGB_Block,
1647 vks::core::VK_FORMAT_ASTC_12x10_UNORM_BLOCK => Format::ASTC_12x10_UNorm_Block,
1648 vks::core::VK_FORMAT_ASTC_12x10_SRGB_BLOCK => Format::ASTC_12x10_sRGB_Block,
1649 vks::core::VK_FORMAT_ASTC_12x12_UNORM_BLOCK => Format::ASTC_12x12_UNorm_Block,
1650 vks::core::VK_FORMAT_ASTC_12x12_SRGB_BLOCK => Format::ASTC_12x12_sRGB_Block,
1651 vks::core::VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG => Format::PVRTC1_2BPP_UNorm_Block_Img,
1652 vks::core::VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG => Format::PVRTC1_4BPP_UNorm_Block_Img,
1653 vks::core::VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG => Format::PVRTC2_2BPP_UNorm_Block_Img,
1654 vks::core::VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG => Format::PVRTC2_4BPP_UNorm_Block_Img,
1655 vks::core::VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG => Format::PVRTC1_2BPP_sRGB_Block_Img,
1656 vks::core::VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG => Format::PVRTC1_4BPP_sRGB_Block_Img,
1657 vks::core::VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG => Format::PVRTC2_2BPP_sRGB_Block_Img,
1658 vks::core::VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG => Format::PVRTC2_4BPP_sRGB_Block_Img,
1659 _ => Format::Unknown(format),
1660 }
1661 }
1662}
1663
1664impl From<Format> for vks::core::VkFormat {
1665 fn from(format: Format) -> Self {
1666 match format {
1667 Format::Undefined => vks::core::VK_FORMAT_UNDEFINED,
1668 Format::R4G4_UNorm_Pack8 => vks::core::VK_FORMAT_R4G4_UNORM_PACK8,
1669 Format::R4G4B4A4_UNorm_Pack16 => vks::core::VK_FORMAT_R4G4B4A4_UNORM_PACK16,
1670 Format::B4G4R4A4_UNorm_Pack16 => vks::core::VK_FORMAT_B4G4R4A4_UNORM_PACK16,
1671 Format::R5G6B5_UNorm_Pack16 => vks::core::VK_FORMAT_R5G6B5_UNORM_PACK16,
1672 Format::B5G6R5_UNorm_Pack16 => vks::core::VK_FORMAT_B5G6R5_UNORM_PACK16,
1673 Format::R5G5B5A1_UNorm_Pack16 => vks::core::VK_FORMAT_R5G5B5A1_UNORM_PACK16,
1674 Format::B5G5R5A1_UNorm_Pack16 => vks::core::VK_FORMAT_B5G5R5A1_UNORM_PACK16,
1675 Format::A1R5G5B5_UNorm_Pack16 => vks::core::VK_FORMAT_A1R5G5B5_UNORM_PACK16,
1676 Format::R8_UNorm => vks::core::VK_FORMAT_R8_UNORM,
1677 Format::R8_SNorm => vks::core::VK_FORMAT_R8_SNORM,
1678 Format::R8_UScaled => vks::core::VK_FORMAT_R8_USCALED,
1679 Format::R8_SScaled => vks::core::VK_FORMAT_R8_SSCALED,
1680 Format::R8_UInt => vks::core::VK_FORMAT_R8_UINT,
1681 Format::R8_SInt => vks::core::VK_FORMAT_R8_SINT,
1682 Format::R8_sRGB => vks::core::VK_FORMAT_R8_SRGB,
1683 Format::R8G8_UNorm => vks::core::VK_FORMAT_R8G8_UNORM,
1684 Format::R8G8_SNorm => vks::core::VK_FORMAT_R8G8_SNORM,
1685 Format::R8G8_UScaled => vks::core::VK_FORMAT_R8G8_USCALED,
1686 Format::R8G8_SScaled => vks::core::VK_FORMAT_R8G8_SSCALED,
1687 Format::R8G8_UInt => vks::core::VK_FORMAT_R8G8_UINT,
1688 Format::R8G8_SInt => vks::core::VK_FORMAT_R8G8_SINT,
1689 Format::R8G8_sRGB => vks::core::VK_FORMAT_R8G8_SRGB,
1690 Format::R8G8B8_UNorm => vks::core::VK_FORMAT_R8G8B8_UNORM,
1691 Format::R8G8B8_SNorm => vks::core::VK_FORMAT_R8G8B8_SNORM,
1692 Format::R8G8B8_UScaled => vks::core::VK_FORMAT_R8G8B8_USCALED,
1693 Format::R8G8B8_SScaled => vks::core::VK_FORMAT_R8G8B8_SSCALED,
1694 Format::R8G8B8_UInt => vks::core::VK_FORMAT_R8G8B8_UINT,
1695 Format::R8G8B8_SInt => vks::core::VK_FORMAT_R8G8B8_SINT,
1696 Format::R8G8B8_sRGB => vks::core::VK_FORMAT_R8G8B8_SRGB,
1697 Format::B8G8R8_UNorm => vks::core::VK_FORMAT_B8G8R8_UNORM,
1698 Format::B8G8R8_SNorm => vks::core::VK_FORMAT_B8G8R8_SNORM,
1699 Format::B8G8R8_UScaled => vks::core::VK_FORMAT_B8G8R8_USCALED,
1700 Format::B8G8R8_SScaled => vks::core::VK_FORMAT_B8G8R8_SSCALED,
1701 Format::B8G8R8_UInt => vks::core::VK_FORMAT_B8G8R8_UINT,
1702 Format::B8G8R8_SInt => vks::core::VK_FORMAT_B8G8R8_SINT,
1703 Format::B8G8R8_sRGB => vks::core::VK_FORMAT_B8G8R8_SRGB,
1704 Format::R8G8B8A8_UNorm => vks::core::VK_FORMAT_R8G8B8A8_UNORM,
1705 Format::R8G8B8A8_SNorm => vks::core::VK_FORMAT_R8G8B8A8_SNORM,
1706 Format::R8G8B8A8_UScaled => vks::core::VK_FORMAT_R8G8B8A8_USCALED,
1707 Format::R8G8B8A8_SScaled => vks::core::VK_FORMAT_R8G8B8A8_SSCALED,
1708 Format::R8G8B8A8_UInt => vks::core::VK_FORMAT_R8G8B8A8_UINT,
1709 Format::R8G8B8A8_SInt => vks::core::VK_FORMAT_R8G8B8A8_SINT,
1710 Format::R8G8B8A8_sRGB => vks::core::VK_FORMAT_R8G8B8A8_SRGB,
1711 Format::B8G8R8A8_UNorm => vks::core::VK_FORMAT_B8G8R8A8_UNORM,
1712 Format::B8G8R8A8_SNorm => vks::core::VK_FORMAT_B8G8R8A8_SNORM,
1713 Format::B8G8R8A8_UScaled => vks::core::VK_FORMAT_B8G8R8A8_USCALED,
1714 Format::B8G8R8A8_SScaled => vks::core::VK_FORMAT_B8G8R8A8_SSCALED,
1715 Format::B8G8R8A8_UInt => vks::core::VK_FORMAT_B8G8R8A8_UINT,
1716 Format::B8G8R8A8_SInt => vks::core::VK_FORMAT_B8G8R8A8_SINT,
1717 Format::B8G8R8A8_sRGB => vks::core::VK_FORMAT_B8G8R8A8_SRGB,
1718 Format::A8B8G8R8_UNorm_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_UNORM_PACK32,
1719 Format::A8B8G8R8_SNorm_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_SNORM_PACK32,
1720 Format::A8B8G8R8_UScaled_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_USCALED_PACK32,
1721 Format::A8B8G8R8_SScaled_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
1722 Format::A8B8G8R8_UInt_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_UINT_PACK32,
1723 Format::A8B8G8R8_SInt_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_SINT_PACK32,
1724 Format::A8B8G8R8_sRGB_Pack32 => vks::core::VK_FORMAT_A8B8G8R8_SRGB_PACK32,
1725 Format::A2R10G10B10_UNorm_Pack32 => vks::core::VK_FORMAT_A2R10G10B10_UNORM_PACK32,
1726 Format::A2R10G10B10_SNorm_Pack32 => vks::core::VK_FORMAT_A2R10G10B10_SNORM_PACK32,
1727 Format::A2R10G10B10_UScaled_Pack32 => vks::core::VK_FORMAT_A2R10G10B10_USCALED_PACK32,
1728 Format::A2R10G10B10_SScaled_Pack32 => vks::core::VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
1729 Format::A2R10G10B10_UInt_Pack32 => vks::core::VK_FORMAT_A2R10G10B10_UINT_PACK32,
1730 Format::A2R10G10B10_SInt_Pack32 => vks::core::VK_FORMAT_A2R10G10B10_SINT_PACK32,
1731 Format::A2B10G10R10_UNorm_Pack32 => vks::core::VK_FORMAT_A2B10G10R10_UNORM_PACK32,
1732 Format::A2B10G10R10_SNorm_Pack32 => vks::core::VK_FORMAT_A2B10G10R10_SNORM_PACK32,
1733 Format::A2B10G10R10_UScaled_Pack32 => vks::core::VK_FORMAT_A2B10G10R10_USCALED_PACK32,
1734 Format::A2B10G10R10_SScaled_Pack32 => vks::core::VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
1735 Format::A2B10G10R10_UInt_Pack32 => vks::core::VK_FORMAT_A2B10G10R10_UINT_PACK32,
1736 Format::A2B10G10R10_SInt_Pack32 => vks::core::VK_FORMAT_A2B10G10R10_SINT_PACK32,
1737 Format::R16_UNorm => vks::core::VK_FORMAT_R16_UNORM,
1738 Format::R16_SNorm => vks::core::VK_FORMAT_R16_SNORM,
1739 Format::R16_UScaled => vks::core::VK_FORMAT_R16_USCALED,
1740 Format::R16_SScaled => vks::core::VK_FORMAT_R16_SSCALED,
1741 Format::R16_UInt => vks::core::VK_FORMAT_R16_UINT,
1742 Format::R16_SInt => vks::core::VK_FORMAT_R16_SINT,
1743 Format::R16_SFloat => vks::core::VK_FORMAT_R16_SFLOAT,
1744 Format::R16G16_UNorm => vks::core::VK_FORMAT_R16G16_UNORM,
1745 Format::R16G16_SNorm => vks::core::VK_FORMAT_R16G16_SNORM,
1746 Format::R16G16_UScaled => vks::core::VK_FORMAT_R16G16_USCALED,
1747 Format::R16G16_SScaled => vks::core::VK_FORMAT_R16G16_SSCALED,
1748 Format::R16G16_UInt => vks::core::VK_FORMAT_R16G16_UINT,
1749 Format::R16G16_SInt => vks::core::VK_FORMAT_R16G16_SINT,
1750 Format::R16G16_SFloat => vks::core::VK_FORMAT_R16G16_SFLOAT,
1751 Format::R16G16B16_UNorm => vks::core::VK_FORMAT_R16G16B16_UNORM,
1752 Format::R16G16B16_SNorm => vks::core::VK_FORMAT_R16G16B16_SNORM,
1753 Format::R16G16B16_UScaled => vks::core::VK_FORMAT_R16G16B16_USCALED,
1754 Format::R16G16B16_SScaled => vks::core::VK_FORMAT_R16G16B16_SSCALED,
1755 Format::R16G16B16_UInt => vks::core::VK_FORMAT_R16G16B16_UINT,
1756 Format::R16G16B16_SInt => vks::core::VK_FORMAT_R16G16B16_SINT,
1757 Format::R16G16B16_SFloat => vks::core::VK_FORMAT_R16G16B16_SFLOAT,
1758 Format::R16G16B16A16_UNorm => vks::core::VK_FORMAT_R16G16B16A16_UNORM,
1759 Format::R16G16B16A16_SNorm => vks::core::VK_FORMAT_R16G16B16A16_SNORM,
1760 Format::R16G16B16A16_UScaled => vks::core::VK_FORMAT_R16G16B16A16_USCALED,
1761 Format::R16G16B16A16_SScaled => vks::core::VK_FORMAT_R16G16B16A16_SSCALED,
1762 Format::R16G16B16A16_UInt => vks::core::VK_FORMAT_R16G16B16A16_UINT,
1763 Format::R16G16B16A16_SInt => vks::core::VK_FORMAT_R16G16B16A16_SINT,
1764 Format::R16G16B16A16_SFloat => vks::core::VK_FORMAT_R16G16B16A16_SFLOAT,
1765 Format::R32_UInt => vks::core::VK_FORMAT_R32_UINT,
1766 Format::R32_SInt => vks::core::VK_FORMAT_R32_SINT,
1767 Format::R32_SFloat => vks::core::VK_FORMAT_R32_SFLOAT,
1768 Format::R32G32_UInt => vks::core::VK_FORMAT_R32G32_UINT,
1769 Format::R32G32_SInt => vks::core::VK_FORMAT_R32G32_SINT,
1770 Format::R32G32_SFloat => vks::core::VK_FORMAT_R32G32_SFLOAT,
1771 Format::R32G32B32_UInt => vks::core::VK_FORMAT_R32G32B32_UINT,
1772 Format::R32G32B32_SInt => vks::core::VK_FORMAT_R32G32B32_SINT,
1773 Format::R32G32B32_SFloat => vks::core::VK_FORMAT_R32G32B32_SFLOAT,
1774 Format::R32G32B32A32_UInt => vks::core::VK_FORMAT_R32G32B32A32_UINT,
1775 Format::R32G32B32A32_SInt => vks::core::VK_FORMAT_R32G32B32A32_SINT,
1776 Format::R32G32B32A32_SFloat => vks::core::VK_FORMAT_R32G32B32A32_SFLOAT,
1777 Format::R64_UInt => vks::core::VK_FORMAT_R64_UINT,
1778 Format::R64_SInt => vks::core::VK_FORMAT_R64_SINT,
1779 Format::R64_SFloat => vks::core::VK_FORMAT_R64_SFLOAT,
1780 Format::R64G64_UInt => vks::core::VK_FORMAT_R64G64_UINT,
1781 Format::R64G64_SInt => vks::core::VK_FORMAT_R64G64_SINT,
1782 Format::R64G64_SFloat => vks::core::VK_FORMAT_R64G64_SFLOAT,
1783 Format::R64G64B64_UInt => vks::core::VK_FORMAT_R64G64B64_UINT,
1784 Format::R64G64B64_SInt => vks::core::VK_FORMAT_R64G64B64_SINT,
1785 Format::R64G64B64_SFloat => vks::core::VK_FORMAT_R64G64B64_SFLOAT,
1786 Format::R64G64B64A64_UInt => vks::core::VK_FORMAT_R64G64B64A64_UINT,
1787 Format::R64G64B64A64_SInt => vks::core::VK_FORMAT_R64G64B64A64_SINT,
1788 Format::R64G64B64A64_SFloat => vks::core::VK_FORMAT_R64G64B64A64_SFLOAT,
1789 Format::B10G11R11_UFloat_Pack32 => vks::core::VK_FORMAT_B10G11R11_UFLOAT_PACK32,
1790 Format::E5B9G9R9_UFloat_Pack32 => vks::core::VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
1791 Format::D16_UNorm => vks::core::VK_FORMAT_D16_UNORM,
1792 Format::X8_D24_UNorm_Pack32 => vks::core::VK_FORMAT_X8_D24_UNORM_PACK32,
1793 Format::D32_SFloat => vks::core::VK_FORMAT_D32_SFLOAT,
1794 Format::S8_UInt => vks::core::VK_FORMAT_S8_UINT,
1795 Format::D16_UNorm_S8_UInt => vks::core::VK_FORMAT_D16_UNORM_S8_UINT,
1796 Format::D24_UNorm_S8_UInt => vks::core::VK_FORMAT_D24_UNORM_S8_UINT,
1797 Format::D32_SFloat_S8_UInt => vks::core::VK_FORMAT_D32_SFLOAT_S8_UINT,
1798 Format::BC1_RGB_UNorm_Block => vks::core::VK_FORMAT_BC1_RGB_UNORM_BLOCK,
1799 Format::BC1_RGB_sRGB_Block => vks::core::VK_FORMAT_BC1_RGB_SRGB_BLOCK,
1800 Format::BC1_RGBA_UNorm_Block => vks::core::VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
1801 Format::BC1_RGBA_sRGB_Block => vks::core::VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
1802 Format::BC2_UNorm_Block => vks::core::VK_FORMAT_BC2_UNORM_BLOCK,
1803 Format::BC2_sRGB_Block => vks::core::VK_FORMAT_BC2_SRGB_BLOCK,
1804 Format::BC3_UNorm_Block => vks::core::VK_FORMAT_BC3_UNORM_BLOCK,
1805 Format::BC3_sRGB_Block => vks::core::VK_FORMAT_BC3_SRGB_BLOCK,
1806 Format::BC4_UNorm_Block => vks::core::VK_FORMAT_BC4_UNORM_BLOCK,
1807 Format::BC4_SNorm_Block => vks::core::VK_FORMAT_BC4_SNORM_BLOCK,
1808 Format::BC5_UNorm_Block => vks::core::VK_FORMAT_BC5_UNORM_BLOCK,
1809 Format::BC5_SNorm_Block => vks::core::VK_FORMAT_BC5_SNORM_BLOCK,
1810 Format::BC6H_UFloat_Block => vks::core::VK_FORMAT_BC6H_UFLOAT_BLOCK,
1811 Format::BC6H_SFloat_Block => vks::core::VK_FORMAT_BC6H_SFLOAT_BLOCK,
1812 Format::BC7_UNorm_Block => vks::core::VK_FORMAT_BC7_UNORM_BLOCK,
1813 Format::BC7_sRGB_Block => vks::core::VK_FORMAT_BC7_SRGB_BLOCK,
1814 Format::ETC2_R8G8B8_UNorm_Block => vks::core::VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
1815 Format::ETC2_R8G8B8_sRGB_Block => vks::core::VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
1816 Format::ETC2_R8G8B8A1_UNorm_Block => vks::core::VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
1817 Format::ETC2_R8G8B8A1_sRGB_Block => vks::core::VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
1818 Format::ETC2_R8G8B8A8_UNorm_Block => vks::core::VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
1819 Format::ETC2_R8G8B8A8_sRGB_Block => vks::core::VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
1820 Format::EAC_R11_UNorm_Block => vks::core::VK_FORMAT_EAC_R11_UNORM_BLOCK,
1821 Format::EAC_R11_SNorm_Block => vks::core::VK_FORMAT_EAC_R11_SNORM_BLOCK,
1822 Format::EAC_R11G11_UNorm_Block => vks::core::VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
1823 Format::EAC_R11G11_SNorm_Block => vks::core::VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
1824 Format::ASTC_4x4_UNorm_Block => vks::core::VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
1825 Format::ASTC_4x4_sRGB_Block => vks::core::VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
1826 Format::ASTC_5x4_UNorm_Block => vks::core::VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
1827 Format::ASTC_5x4_sRGB_Block => vks::core::VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
1828 Format::ASTC_5x5_UNorm_Block => vks::core::VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
1829 Format::ASTC_5x5_sRGB_Block => vks::core::VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
1830 Format::ASTC_6x5_UNorm_Block => vks::core::VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
1831 Format::ASTC_6x5_sRGB_Block => vks::core::VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
1832 Format::ASTC_6x6_UNorm_Block => vks::core::VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
1833 Format::ASTC_6x6_sRGB_Block => vks::core::VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
1834 Format::ASTC_8x5_UNorm_Block => vks::core::VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
1835 Format::ASTC_8x5_sRGB_Block => vks::core::VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
1836 Format::ASTC_8x6_UNorm_Block => vks::core::VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
1837 Format::ASTC_8x6_sRGB_Block => vks::core::VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
1838 Format::ASTC_8x8_UNorm_Block => vks::core::VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
1839 Format::ASTC_8x8_sRGB_Block => vks::core::VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
1840 Format::ASTC_10x5_UNorm_Block => vks::core::VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
1841 Format::ASTC_10x5_sRGB_Block => vks::core::VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
1842 Format::ASTC_10x6_UNorm_Block => vks::core::VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
1843 Format::ASTC_10x6_sRGB_Block => vks::core::VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
1844 Format::ASTC_10x8_UNorm_Block => vks::core::VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
1845 Format::ASTC_10x8_sRGB_Block => vks::core::VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
1846 Format::ASTC_10x10_UNorm_Block => vks::core::VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
1847 Format::ASTC_10x10_sRGB_Block => vks::core::VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
1848 Format::ASTC_12x10_UNorm_Block => vks::core::VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
1849 Format::ASTC_12x10_sRGB_Block => vks::core::VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
1850 Format::ASTC_12x12_UNorm_Block => vks::core::VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
1851 Format::ASTC_12x12_sRGB_Block => vks::core::VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
1852 Format::PVRTC1_2BPP_UNorm_Block_Img => vks::core::VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,
1853 Format::PVRTC1_4BPP_UNorm_Block_Img => vks::core::VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,
1854 Format::PVRTC2_2BPP_UNorm_Block_Img => vks::core::VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,
1855 Format::PVRTC2_4BPP_UNorm_Block_Img => vks::core::VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,
1856 Format::PVRTC1_2BPP_sRGB_Block_Img => vks::core::VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,
1857 Format::PVRTC1_4BPP_sRGB_Block_Img => vks::core::VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,
1858 Format::PVRTC2_2BPP_sRGB_Block_Img => vks::core::VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,
1859 Format::PVRTC2_4BPP_sRGB_Block_Img => vks::core::VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,
1860 Format::Unknown(format) => format,
1861 }
1862 }
1863}
1864
1865#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1867pub enum ImageType {
1868 Type1D,
1869 Type2D,
1870 Type3D,
1871 Unknown(vks::core::VkImageType),
1872}
1873
1874impl From<ImageType> for vks::core::VkImageType {
1875 fn from(image_type: ImageType) -> Self {
1876 match image_type {
1877 ImageType::Type1D => vks::core::VK_IMAGE_TYPE_1D,
1878 ImageType::Type2D => vks::core::VK_IMAGE_TYPE_2D,
1879 ImageType::Type3D => vks::core::VK_IMAGE_TYPE_3D,
1880 ImageType::Unknown(image_type) => image_type,
1881 }
1882 }
1883}
1884
1885impl From<vks::core::VkImageType> for ImageType {
1886 fn from(image_type: vks::core::VkImageType) -> Self {
1887 match image_type {
1888 vks::core::VK_IMAGE_TYPE_1D => ImageType::Type1D,
1889 vks::core::VK_IMAGE_TYPE_2D => ImageType::Type2D,
1890 vks::core::VK_IMAGE_TYPE_3D => ImageType::Type3D,
1891 _ => ImageType::Unknown(image_type),
1892 }
1893 }
1894}
1895
1896#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1898pub enum ImageTiling {
1899 Optimal,
1900 Linear,
1901 Unknown(vks::core::VkImageTiling),
1902}
1903
1904impl From<ImageTiling> for vks::core::VkImageTiling {
1905 fn from(tiling: ImageTiling) -> Self {
1906 match tiling {
1907 ImageTiling::Optimal => vks::core::VK_IMAGE_TILING_OPTIMAL,
1908 ImageTiling::Linear => vks::core::VK_IMAGE_TILING_LINEAR,
1909 ImageTiling::Unknown(tiling) => tiling,
1910 }
1911 }
1912}
1913
1914impl From<vks::core::VkImageTiling> for ImageTiling {
1915 fn from(tiling: vks::core::VkImageTiling) -> Self {
1916 match tiling {
1917 vks::core::VK_IMAGE_TILING_OPTIMAL => ImageTiling::Optimal,
1918 vks::core::VK_IMAGE_TILING_LINEAR => ImageTiling::Linear,
1919 _ => ImageTiling::Unknown(tiling),
1920 }
1921 }
1922}
1923
1924#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1926pub enum PhysicalDeviceType {
1927 Other,
1928 IntegratedGpu,
1929 DiscreteGpu,
1930 VirtualGpu,
1931 Cpu,
1932 Unknown(vks::core::VkPhysicalDeviceType),
1933}
1934
1935impl From<vks::core::VkPhysicalDeviceType> for PhysicalDeviceType {
1936 fn from(physical_device_type: vks::core::VkPhysicalDeviceType) -> Self {
1937 match physical_device_type {
1938 vks::core::VK_PHYSICAL_DEVICE_TYPE_OTHER => PhysicalDeviceType::Other,
1939 vks::core::VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU => PhysicalDeviceType::IntegratedGpu,
1940 vks::core::VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU => PhysicalDeviceType::DiscreteGpu,
1941 vks::core::VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU => PhysicalDeviceType::VirtualGpu,
1942 vks::core::VK_PHYSICAL_DEVICE_TYPE_CPU => PhysicalDeviceType::Cpu,
1943 _ => PhysicalDeviceType::Unknown(physical_device_type),
1944 }
1945 }
1946}
1947
1948impl From<PhysicalDeviceType> for vks::core::VkPhysicalDeviceType {
1949 fn from(physical_device_type: PhysicalDeviceType) -> Self {
1950 match physical_device_type {
1951 PhysicalDeviceType::Other => vks::core::VK_PHYSICAL_DEVICE_TYPE_OTHER,
1952 PhysicalDeviceType::IntegratedGpu => vks::core::VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
1953 PhysicalDeviceType::DiscreteGpu => vks::core::VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
1954 PhysicalDeviceType::VirtualGpu => vks::core::VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU,
1955 PhysicalDeviceType::Cpu => vks::core::VK_PHYSICAL_DEVICE_TYPE_CPU,
1956 PhysicalDeviceType::Unknown(physical_device_type) => physical_device_type,
1957 }
1958 }
1959}
1960
1961#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1963pub enum QueryType {
1964 Occlusion,
1965 PipelineStatistics,
1966 Timestamp,
1967 Unknown(vks::core::VkQueryType),
1968}
1969
1970impl From<QueryType> for vks::core::VkQueryType {
1971 fn from(query_type: QueryType) -> Self {
1972 match query_type {
1973 QueryType::Occlusion => vks::core::VK_QUERY_TYPE_OCCLUSION,
1974 QueryType::PipelineStatistics => vks::core::VK_QUERY_TYPE_PIPELINE_STATISTICS,
1975 QueryType::Timestamp => vks::core::VK_QUERY_TYPE_TIMESTAMP,
1976 QueryType::Unknown(query_type) => query_type,
1977 }
1978 }
1979}
1980
1981#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
1983pub enum SharingMode {
1984 Exclusive,
1985 Concurrent,
1986 Unknown(vks::core::VkSharingMode),
1987}
1988
1989impl From<SharingMode> for vks::core::VkSharingMode {
1990 fn from(mode: SharingMode) -> Self {
1991 match mode {
1992 SharingMode::Exclusive => vks::core::VK_SHARING_MODE_EXCLUSIVE,
1993 SharingMode::Concurrent => vks::core::VK_SHARING_MODE_CONCURRENT,
1994 SharingMode::Unknown(mode) => mode,
1995 }
1996 }
1997}
1998
1999impl From<vks::core::VkSharingMode> for SharingMode {
2000 fn from(mode: vks::core::VkSharingMode) -> Self {
2001 match mode {
2002 vks::core::VK_SHARING_MODE_EXCLUSIVE => SharingMode::Exclusive,
2003 vks::core::VK_SHARING_MODE_CONCURRENT => SharingMode::Concurrent,
2004 _ => SharingMode::Unknown(mode),
2005 }
2006 }
2007}
2008
2009#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2011pub enum ImageLayout {
2012 Undefined,
2013 General,
2014 ColorAttachmentOptimal,
2015 DepthStencilAttachmentOptimal,
2016 DepthStencilReadOnlyOptimal,
2017 ShaderReadOnlyOptimal,
2018 TransferSrcOptimal,
2019 TransferDstOptimal,
2020 Preinitialized,
2021
2022 PresentSrcKhr,
2024
2025 Unknown(vks::core::VkImageLayout),
2026}
2027
2028impl From<ImageLayout> for vks::core::VkImageLayout {
2029 fn from(layout: ImageLayout) -> Self {
2030 match layout {
2031 ImageLayout::Undefined => vks::core::VK_IMAGE_LAYOUT_UNDEFINED,
2032 ImageLayout::General => vks::core::VK_IMAGE_LAYOUT_GENERAL,
2033 ImageLayout::ColorAttachmentOptimal => vks::core::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
2034 ImageLayout::DepthStencilAttachmentOptimal => vks::core::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
2035 ImageLayout::DepthStencilReadOnlyOptimal => vks::core::VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
2036 ImageLayout::ShaderReadOnlyOptimal => vks::core::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
2037 ImageLayout::TransferSrcOptimal => vks::core::VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2038 ImageLayout::TransferDstOptimal => vks::core::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
2039 ImageLayout::Preinitialized => vks::core::VK_IMAGE_LAYOUT_PREINITIALIZED,
2040 ImageLayout::PresentSrcKhr => vks::core::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
2041 ImageLayout::Unknown(layout) => layout,
2042 }
2043 }
2044}
2045
2046impl From<vks::core::VkImageLayout> for ImageLayout {
2047 fn from(layout: vks::core::VkImageLayout) -> Self {
2048 match layout {
2049 vks::core::VK_IMAGE_LAYOUT_UNDEFINED => ImageLayout::Undefined,
2050 vks::core::VK_IMAGE_LAYOUT_GENERAL => ImageLayout::General,
2051 vks::core::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL => ImageLayout::ColorAttachmentOptimal,
2052 vks::core::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL => ImageLayout::DepthStencilAttachmentOptimal,
2053 vks::core::VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL => ImageLayout::DepthStencilReadOnlyOptimal,
2054 vks::core::VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL => ImageLayout::ShaderReadOnlyOptimal,
2055 vks::core::VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL => ImageLayout::TransferSrcOptimal,
2056 vks::core::VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL => ImageLayout::TransferDstOptimal,
2057 vks::core::VK_IMAGE_LAYOUT_PREINITIALIZED => ImageLayout::Preinitialized,
2058 vks::core::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR => ImageLayout::PresentSrcKhr,
2059 _ => ImageLayout::Unknown(layout),
2060 }
2061 }
2062}
2063
2064#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2066pub enum ImageViewType {
2067 Type1D,
2068 Type2D,
2069 Type3D,
2070 TypeCube,
2071 Type1DArray,
2072 Type2DArray,
2073 TypeCubeArray,
2074 Unknown(vks::core::VkImageViewType),
2075}
2076
2077impl From<ImageViewType> for vks::core::VkImageViewType {
2078 fn from(view_type: ImageViewType) -> Self {
2079 match view_type {
2080 ImageViewType::Type1D => vks::core::VK_IMAGE_VIEW_TYPE_1D,
2081 ImageViewType::Type2D => vks::core::VK_IMAGE_VIEW_TYPE_2D,
2082 ImageViewType::Type3D => vks::core::VK_IMAGE_VIEW_TYPE_3D,
2083 ImageViewType::TypeCube => vks::core::VK_IMAGE_VIEW_TYPE_CUBE,
2084 ImageViewType::Type1DArray => vks::core::VK_IMAGE_VIEW_TYPE_1D_ARRAY,
2085 ImageViewType::Type2DArray => vks::core::VK_IMAGE_VIEW_TYPE_2D_ARRAY,
2086 ImageViewType::TypeCubeArray => vks::core::VK_IMAGE_VIEW_TYPE_CUBE_ARRAY,
2087 ImageViewType::Unknown(view_type) => view_type,
2088 }
2089 }
2090}
2091
2092#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2094pub enum ComponentSwizzle {
2095 Identity,
2096 Zero,
2097 One,
2098 R,
2099 G,
2100 B,
2101 A,
2102 Unknown(vks::core::VkComponentSwizzle),
2103}
2104
2105impl From<ComponentSwizzle> for vks::core::VkComponentSwizzle {
2106 fn from(swizzle: ComponentSwizzle) -> Self {
2107 match swizzle {
2108 ComponentSwizzle::Identity => vks::core::VK_COMPONENT_SWIZZLE_IDENTITY,
2109 ComponentSwizzle::Zero => vks::core::VK_COMPONENT_SWIZZLE_ZERO,
2110 ComponentSwizzle::One => vks::core::VK_COMPONENT_SWIZZLE_ONE,
2111 ComponentSwizzle::R => vks::core::VK_COMPONENT_SWIZZLE_R,
2112 ComponentSwizzle::G => vks::core::VK_COMPONENT_SWIZZLE_G,
2113 ComponentSwizzle::B => vks::core::VK_COMPONENT_SWIZZLE_B,
2114 ComponentSwizzle::A => vks::core::VK_COMPONENT_SWIZZLE_A,
2115 ComponentSwizzle::Unknown(swizzle) => swizzle,
2116 }
2117 }
2118}
2119
2120#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2122pub enum VertexInputRate {
2123 Vertex,
2124 Instance,
2125 Unknown(vks::core::VkVertexInputRate),
2126}
2127
2128impl From<VertexInputRate> for vks::core::VkVertexInputRate {
2129 fn from(rate: VertexInputRate) -> Self {
2130 match rate {
2131 VertexInputRate::Vertex => vks::core::VK_VERTEX_INPUT_RATE_VERTEX,
2132 VertexInputRate::Instance => vks::core::VK_VERTEX_INPUT_RATE_INSTANCE,
2133 VertexInputRate::Unknown(rate) => rate,
2134 }
2135 }
2136}
2137
2138#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2140pub enum PrimitiveTopology {
2141 PointList,
2142 LineList,
2143 LineStrip,
2144 TriangleList,
2145 TriangleStrip,
2146 TriangleFan,
2147 LineListWithAdjacency,
2148 LineStripWithAdjacency,
2149 TriangleListWithAdjacency,
2150 TriangleStripWithAdjacency,
2151 PatchList,
2152 Unknown(vks::core::VkPrimitiveTopology)
2153}
2154
2155impl From<PrimitiveTopology> for vks::core::VkPrimitiveTopology {
2156 fn from(topology: PrimitiveTopology) -> Self {
2157 match topology {
2158 PrimitiveTopology::PointList => vks::core::VK_PRIMITIVE_TOPOLOGY_POINT_LIST,
2159 PrimitiveTopology::LineList => vks::core::VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
2160 PrimitiveTopology::LineStrip => vks::core::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,
2161 PrimitiveTopology::TriangleList => vks::core::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
2162 PrimitiveTopology::TriangleStrip => vks::core::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
2163 PrimitiveTopology::TriangleFan => vks::core::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,
2164 PrimitiveTopology::LineListWithAdjacency => vks::core::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,
2165 PrimitiveTopology::LineStripWithAdjacency => vks::core::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY,
2166 PrimitiveTopology::TriangleListWithAdjacency => vks::core::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY,
2167 PrimitiveTopology::TriangleStripWithAdjacency => vks::core::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY,
2168 PrimitiveTopology::PatchList => vks::core::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,
2169 PrimitiveTopology::Unknown(topology) => topology,
2170 }
2171 }
2172}
2173
2174#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2176pub enum PolygonMode {
2177 Fill,
2178 Line,
2179 Point,
2180 Unknown(vks::core::VkPolygonMode),
2181}
2182
2183impl From<PolygonMode> for vks::core::VkPolygonMode {
2184 fn from(mode: PolygonMode) -> Self {
2185 match mode {
2186 PolygonMode::Fill => vks::core::VK_POLYGON_MODE_FILL,
2187 PolygonMode::Line => vks::core::VK_POLYGON_MODE_LINE,
2188 PolygonMode::Point => vks::core::VK_POLYGON_MODE_POINT,
2189 PolygonMode::Unknown(mode) => mode,
2190 }
2191 }
2192}
2193
2194#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2196pub enum FrontFace {
2197 CounterClockwise,
2198 Clockwise,
2199 Unknown(vks::core::VkFrontFace),
2200}
2201
2202impl From<FrontFace> for vks::core::VkFrontFace {
2203 fn from(face: FrontFace) -> Self {
2204 match face {
2205 FrontFace::CounterClockwise => vks::core::VK_FRONT_FACE_COUNTER_CLOCKWISE,
2206 FrontFace::Clockwise => vks::core::VK_FRONT_FACE_CLOCKWISE,
2207 FrontFace::Unknown(face) => face,
2208 }
2209 }
2210}
2211
2212#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2214pub enum CompareOp {
2215 Never,
2216 Less,
2217 Equal,
2218 LessOrEqual,
2219 Greater,
2220 NotEqual,
2221 GreaterOrEqual,
2222 Always,
2223 Unknown(vks::core::VkCompareOp),
2224}
2225
2226impl From<CompareOp> for vks::core::VkCompareOp {
2227 fn from(op: CompareOp) -> Self {
2228 match op {
2229 CompareOp::Never => vks::core::VK_COMPARE_OP_NEVER,
2230 CompareOp::Less => vks::core::VK_COMPARE_OP_LESS,
2231 CompareOp::Equal => vks::core::VK_COMPARE_OP_EQUAL,
2232 CompareOp::LessOrEqual => vks::core::VK_COMPARE_OP_LESS_OR_EQUAL,
2233 CompareOp::Greater => vks::core::VK_COMPARE_OP_GREATER,
2234 CompareOp::NotEqual => vks::core::VK_COMPARE_OP_NOT_EQUAL,
2235 CompareOp::GreaterOrEqual => vks::core::VK_COMPARE_OP_GREATER_OR_EQUAL,
2236 CompareOp::Always => vks::core::VK_COMPARE_OP_ALWAYS,
2237 CompareOp::Unknown(op) => op,
2238 }
2239 }
2240}
2241
2242#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2244pub enum StencilOp {
2245 Keep,
2246 Zero,
2247 Replace,
2248 IncrementAndClamp,
2249 DecrementAndClamp,
2250 Invert,
2251 IncrementAndWrap,
2252 DecrementAndWrap,
2253 Unknown(vks::core::VkStencilOp),
2254}
2255
2256impl From<StencilOp> for vks::core::VkStencilOp {
2257 fn from(op: StencilOp) -> Self {
2258 match op {
2259 StencilOp::Keep => vks::core::VK_STENCIL_OP_KEEP,
2260 StencilOp::Zero => vks::core::VK_STENCIL_OP_ZERO,
2261 StencilOp::Replace => vks::core::VK_STENCIL_OP_REPLACE,
2262 StencilOp::IncrementAndClamp => vks::core::VK_STENCIL_OP_INCREMENT_AND_CLAMP,
2263 StencilOp::DecrementAndClamp => vks::core::VK_STENCIL_OP_DECREMENT_AND_CLAMP,
2264 StencilOp::Invert => vks::core::VK_STENCIL_OP_INVERT,
2265 StencilOp::IncrementAndWrap => vks::core::VK_STENCIL_OP_INCREMENT_AND_WRAP,
2266 StencilOp::DecrementAndWrap => vks::core::VK_STENCIL_OP_DECREMENT_AND_WRAP,
2267 StencilOp::Unknown(op) => op,
2268 }
2269 }
2270}
2271
2272#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2274pub enum LogicOp {
2275 Clear,
2276 And,
2277 AndReverse,
2278 Copy,
2279 AndInverted,
2280 NoOp,
2281 Xor,
2282 Or,
2283 Nor,
2284 Equivalent,
2285 Invert,
2286 OrReverse,
2287 CopyInverted,
2288 OrInverted,
2289 Nand,
2290 Set,
2291 Unknown(vks::core::VkLogicOp),
2292}
2293
2294impl From<LogicOp> for vks::core::VkLogicOp {
2295 fn from(op: LogicOp) -> Self {
2296 match op {
2297 LogicOp::Clear => vks::core::VK_LOGIC_OP_CLEAR,
2298 LogicOp::And => vks::core::VK_LOGIC_OP_AND,
2299 LogicOp::AndReverse => vks::core::VK_LOGIC_OP_AND_REVERSE,
2300 LogicOp::Copy => vks::core::VK_LOGIC_OP_COPY,
2301 LogicOp::AndInverted => vks::core::VK_LOGIC_OP_AND_INVERTED,
2302 LogicOp::NoOp => vks::core::VK_LOGIC_OP_NO_OP,
2303 LogicOp::Xor => vks::core::VK_LOGIC_OP_XOR,
2304 LogicOp::Or => vks::core::VK_LOGIC_OP_OR,
2305 LogicOp::Nor => vks::core::VK_LOGIC_OP_NOR,
2306 LogicOp::Equivalent => vks::core::VK_LOGIC_OP_EQUIVALENT,
2307 LogicOp::Invert => vks::core::VK_LOGIC_OP_INVERT,
2308 LogicOp::OrReverse => vks::core::VK_LOGIC_OP_OR_REVERSE,
2309 LogicOp::CopyInverted => vks::core::VK_LOGIC_OP_COPY_INVERTED,
2310 LogicOp::OrInverted => vks::core::VK_LOGIC_OP_OR_INVERTED,
2311 LogicOp::Nand => vks::core::VK_LOGIC_OP_NAND,
2312 LogicOp::Set => vks::core::VK_LOGIC_OP_SET,
2313 LogicOp::Unknown(op) => op,
2314 }
2315 }
2316}
2317
2318#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2320pub enum BlendFactor {
2321 Zero,
2322 One,
2323 SrcColor,
2324 OneMinusSrcColor,
2325 DstColor,
2326 OneMinusDstColor,
2327 SrcAlpha,
2328 OneMinusSrcAlpha,
2329 DstAlpha,
2330 OneMinusDstAlpha,
2331 ConstantColor,
2332 OneMinusConstantColor,
2333 ConstantAlpha,
2334 OneMinusConstantAlpha,
2335 SrcAlphaSaturate,
2336 Src1Color,
2337 OneMinusSrc1Color,
2338 Src1Alpha,
2339 OneMinusSrc1Alpha,
2340 Unknown(vks::core::VkBlendFactor),
2341}
2342
2343impl From<BlendFactor> for vks::core::VkBlendFactor {
2344 fn from(factor: BlendFactor) -> Self {
2345 match factor {
2346 BlendFactor::Zero => vks::core::VK_BLEND_FACTOR_ZERO,
2347 BlendFactor::One => vks::core::VK_BLEND_FACTOR_ONE,
2348 BlendFactor::SrcColor => vks::core::VK_BLEND_FACTOR_SRC_COLOR,
2349 BlendFactor::OneMinusSrcColor => vks::core::VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR,
2350 BlendFactor::DstColor => vks::core::VK_BLEND_FACTOR_DST_COLOR,
2351 BlendFactor::OneMinusDstColor => vks::core::VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR,
2352 BlendFactor::SrcAlpha => vks::core::VK_BLEND_FACTOR_SRC_ALPHA,
2353 BlendFactor::OneMinusSrcAlpha => vks::core::VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
2354 BlendFactor::DstAlpha => vks::core::VK_BLEND_FACTOR_DST_ALPHA,
2355 BlendFactor::OneMinusDstAlpha => vks::core::VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA,
2356 BlendFactor::ConstantColor => vks::core::VK_BLEND_FACTOR_CONSTANT_COLOR,
2357 BlendFactor::OneMinusConstantColor => vks::core::VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR,
2358 BlendFactor::ConstantAlpha => vks::core::VK_BLEND_FACTOR_CONSTANT_ALPHA,
2359 BlendFactor::OneMinusConstantAlpha => vks::core::VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA,
2360 BlendFactor::SrcAlphaSaturate => vks::core::VK_BLEND_FACTOR_SRC_ALPHA_SATURATE,
2361 BlendFactor::Src1Color => vks::core::VK_BLEND_FACTOR_SRC1_COLOR,
2362 BlendFactor::OneMinusSrc1Color => vks::core::VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR,
2363 BlendFactor::Src1Alpha => vks::core::VK_BLEND_FACTOR_SRC1_ALPHA,
2364 BlendFactor::OneMinusSrc1Alpha => vks::core::VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA,
2365 BlendFactor::Unknown(factor) => factor,
2366 }
2367 }
2368}
2369
2370#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2372pub enum BlendOp {
2373 Add,
2374 Subtract,
2375 ReverseSubtract,
2376 Min,
2377 Max,
2378 Unknown(vks::core::VkBlendOp),
2379}
2380
2381impl From<BlendOp> for vks::core::VkBlendOp {
2382 fn from(op: BlendOp) -> Self {
2383 match op {
2384 BlendOp::Add => vks::core::VK_BLEND_OP_ADD,
2385 BlendOp::Subtract => vks::core::VK_BLEND_OP_SUBTRACT,
2386 BlendOp::ReverseSubtract => vks::core::VK_BLEND_OP_REVERSE_SUBTRACT,
2387 BlendOp::Min => vks::core::VK_BLEND_OP_MIN,
2388 BlendOp::Max => vks::core::VK_BLEND_OP_MAX,
2389 BlendOp::Unknown(op) => op,
2390 }
2391 }
2392}
2393
2394#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2396pub enum DynamicState {
2397 Viewport,
2398 Scissor,
2399 LineWidth,
2400 DepthBias,
2401 BlendConstants,
2402 DepthBounds,
2403 StencilCompareMask,
2404 StencilWriteMask,
2405 StencilReference,
2406 Unknown(vks::core::VkDynamicState),
2407}
2408
2409impl From<DynamicState> for vks::core::VkDynamicState {
2410 fn from(state: DynamicState) -> Self {
2411 match state {
2412 DynamicState::Viewport => vks::core::VK_DYNAMIC_STATE_VIEWPORT,
2413 DynamicState::Scissor => vks::core::VK_DYNAMIC_STATE_SCISSOR,
2414 DynamicState::LineWidth => vks::core::VK_DYNAMIC_STATE_LINE_WIDTH,
2415 DynamicState::DepthBias => vks::core::VK_DYNAMIC_STATE_DEPTH_BIAS,
2416 DynamicState::BlendConstants => vks::core::VK_DYNAMIC_STATE_BLEND_CONSTANTS,
2417 DynamicState::DepthBounds => vks::core::VK_DYNAMIC_STATE_DEPTH_BOUNDS,
2418 DynamicState::StencilCompareMask => vks::core::VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
2419 DynamicState::StencilWriteMask => vks::core::VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
2420 DynamicState::StencilReference => vks::core::VK_DYNAMIC_STATE_STENCIL_REFERENCE,
2421 DynamicState::Unknown(state) => state,
2422 }
2423 }
2424}
2425
2426#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2428pub enum Filter {
2429 Nearest,
2430 Linear,
2431 CubicImg,
2432 Unknown(vks::core::VkFilter),
2433}
2434
2435impl From<Filter> for vks::core::VkFilter {
2436 fn from(filter: Filter) -> Self {
2437 match filter {
2438 Filter::Nearest => vks::core::VK_FILTER_NEAREST,
2439 Filter::Linear => vks::core::VK_FILTER_LINEAR,
2440 Filter::CubicImg => vks::core::VK_FILTER_CUBIC_IMG,
2441 Filter::Unknown(filter) => filter,
2442 }
2443 }
2444}
2445
2446#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2448pub enum SamplerMipmapMode {
2449 Nearest,
2450 Linear,
2451 Unknown(vks::core::VkSamplerMipmapMode),
2452}
2453
2454impl From<SamplerMipmapMode> for vks::core::VkSamplerMipmapMode {
2455 fn from(mode: SamplerMipmapMode) -> Self {
2456 match mode {
2457 SamplerMipmapMode::Nearest => vks::core::VK_SAMPLER_MIPMAP_MODE_NEAREST,
2458 SamplerMipmapMode::Linear => vks::core::VK_SAMPLER_MIPMAP_MODE_LINEAR,
2459 SamplerMipmapMode::Unknown(mode) => mode,
2460 }
2461 }
2462}
2463
2464#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2466pub enum SamplerAddressMode {
2467 Repeat,
2468 MirroredRepeat,
2469 ClampToEdge,
2470 ClampToBorder,
2471 MirrorClampToEdge,
2472 Unknown(vks::core::VkSamplerAddressMode),
2473}
2474
2475impl From<SamplerAddressMode> for vks::core::VkSamplerAddressMode {
2476 fn from(mode: SamplerAddressMode) -> Self {
2477 match mode {
2478 SamplerAddressMode::Repeat => vks::core::VK_SAMPLER_ADDRESS_MODE_REPEAT,
2479 SamplerAddressMode::MirroredRepeat => vks::core::VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,
2480 SamplerAddressMode::ClampToEdge => vks::core::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
2481 SamplerAddressMode::ClampToBorder => vks::core::VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
2482 SamplerAddressMode::MirrorClampToEdge => vks::core::VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,
2483 SamplerAddressMode::Unknown(mode) => mode,
2484 }
2485 }
2486}
2487
2488#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2490pub enum BorderColor {
2491 FloatTransparentBlack,
2492 IntTransparentBlack,
2493 FloatOpaqueBlack,
2494 IntOpaqueBlack,
2495 FloatOpaqueWhite,
2496 IntOpaqueWhite,
2497 Unknown(vks::core::VkBorderColor),
2498}
2499
2500impl From<BorderColor> for vks::core::VkBorderColor {
2501 fn from(color: BorderColor) -> Self {
2502 match color {
2503 BorderColor::FloatTransparentBlack => vks::core::VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
2504 BorderColor::IntTransparentBlack => vks::core::VK_BORDER_COLOR_INT_TRANSPARENT_BLACK,
2505 BorderColor::FloatOpaqueBlack => vks::core::VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK,
2506 BorderColor::IntOpaqueBlack => vks::core::VK_BORDER_COLOR_INT_OPAQUE_BLACK,
2507 BorderColor::FloatOpaqueWhite => vks::core::VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE,
2508 BorderColor::IntOpaqueWhite => vks::core::VK_BORDER_COLOR_INT_OPAQUE_WHITE,
2509 BorderColor::Unknown(color) => color,
2510 }
2511 }
2512}
2513
2514#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2516pub enum DescriptorType {
2517 Sampler,
2518 CombinedImageSampler,
2519 SampledImage,
2520 StorageImage,
2521 UniformTexelBuffer,
2522 StorageTexelBuffer,
2523 UniformBuffer,
2524 StorageBuffer,
2525 UniformBufferDynamic,
2526 StorageBufferDynamic,
2527 InputAttachment,
2528 Unknown(vks::core::VkDescriptorType),
2529}
2530
2531impl From<DescriptorType> for vks::core::VkDescriptorType {
2532 fn from(descriptor_type: DescriptorType) -> Self {
2533 match descriptor_type {
2534 DescriptorType::Sampler => vks::core::VK_DESCRIPTOR_TYPE_SAMPLER,
2535 DescriptorType::CombinedImageSampler => vks::core::VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
2536 DescriptorType::SampledImage => vks::core::VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
2537 DescriptorType::StorageImage => vks::core::VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
2538 DescriptorType::UniformTexelBuffer => vks::core::VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
2539 DescriptorType::StorageTexelBuffer => vks::core::VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
2540 DescriptorType::UniformBuffer => vks::core::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2541 DescriptorType::StorageBuffer => vks::core::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
2542 DescriptorType::UniformBufferDynamic => vks::core::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
2543 DescriptorType::StorageBufferDynamic => vks::core::VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC,
2544 DescriptorType::InputAttachment => vks::core::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
2545 DescriptorType::Unknown(descriptor_type) => descriptor_type,
2546 }
2547 }
2548}
2549
2550#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2552pub enum AttachmentLoadOp {
2553 Load,
2554 Clear,
2555 DontCare,
2556 Unknown(vks::core::VkAttachmentLoadOp),
2557}
2558
2559impl From<AttachmentLoadOp> for vks::core::VkAttachmentLoadOp {
2560 fn from(op: AttachmentLoadOp) -> Self {
2561 match op {
2562 AttachmentLoadOp::Load => vks::core::VK_ATTACHMENT_LOAD_OP_LOAD,
2563 AttachmentLoadOp::Clear => vks::core::VK_ATTACHMENT_LOAD_OP_CLEAR,
2564 AttachmentLoadOp::DontCare => vks::core::VK_ATTACHMENT_LOAD_OP_DONT_CARE,
2565 AttachmentLoadOp::Unknown(op) => op,
2566 }
2567 }
2568}
2569
2570impl From<vks::core::VkAttachmentLoadOp> for AttachmentLoadOp {
2571 fn from(op: vks::core::VkAttachmentLoadOp) -> Self {
2572 match op {
2573 vks::core::VK_ATTACHMENT_LOAD_OP_LOAD => AttachmentLoadOp::Load,
2574 vks::core::VK_ATTACHMENT_LOAD_OP_CLEAR => AttachmentLoadOp::Clear,
2575 vks::core::VK_ATTACHMENT_LOAD_OP_DONT_CARE => AttachmentLoadOp::DontCare,
2576 _ => AttachmentLoadOp::Unknown(op),
2577 }
2578 }
2579}
2580
2581#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2583pub enum AttachmentStoreOp {
2584 Store,
2585 DontCare,
2586 Unknown(vks::core::VkAttachmentStoreOp),
2587}
2588
2589impl From<AttachmentStoreOp> for vks::core::VkAttachmentStoreOp {
2590 fn from(op: AttachmentStoreOp) -> Self {
2591 match op {
2592 AttachmentStoreOp::Store => vks::core::VK_ATTACHMENT_STORE_OP_STORE,
2593 AttachmentStoreOp::DontCare => vks::core::VK_ATTACHMENT_STORE_OP_DONT_CARE,
2594 AttachmentStoreOp::Unknown(op) => op,
2595 }
2596 }
2597}
2598
2599impl From<vks::core::VkAttachmentStoreOp> for AttachmentStoreOp {
2600 fn from(op: vks::core::VkAttachmentStoreOp) -> Self {
2601 match op {
2602 vks::core::VK_ATTACHMENT_STORE_OP_STORE => AttachmentStoreOp::Store,
2603 vks::core::VK_ATTACHMENT_STORE_OP_DONT_CARE => AttachmentStoreOp::DontCare,
2604 _ => AttachmentStoreOp::Unknown(op),
2605 }
2606 }
2607}
2608
2609#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2611pub enum PipelineBindPoint {
2612 Graphics,
2613 Compute,
2614 Unknown(vks::core::VkPipelineBindPoint),
2615}
2616
2617impl From<PipelineBindPoint> for vks::core::VkPipelineBindPoint {
2618 fn from(bind_point: PipelineBindPoint) -> Self {
2619 match bind_point {
2620 PipelineBindPoint::Graphics => vks::core::VK_PIPELINE_BIND_POINT_GRAPHICS,
2621 PipelineBindPoint::Compute => vks::core::VK_PIPELINE_BIND_POINT_COMPUTE,
2622 PipelineBindPoint::Unknown(bind_point) => bind_point,
2623 }
2624 }
2625}
2626
2627impl From<vks::core::VkPipelineBindPoint> for PipelineBindPoint {
2628 fn from(bind_point: vks::core::VkPipelineBindPoint) -> Self {
2629 match bind_point {
2630 vks::core::VK_PIPELINE_BIND_POINT_GRAPHICS => PipelineBindPoint::Graphics,
2631 vks::core::VK_PIPELINE_BIND_POINT_COMPUTE => PipelineBindPoint::Compute,
2632 _ => PipelineBindPoint::Unknown(bind_point),
2633 }
2634 }
2635}
2636
2637#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2639pub enum CommandBufferLevel {
2640 Primary,
2641 Secondary,
2642 Unknown(vks::core::VkCommandBufferLevel),
2643}
2644
2645impl From<CommandBufferLevel> for vks::core::VkCommandBufferLevel {
2646 fn from(level: CommandBufferLevel) -> Self {
2647 match level {
2648 CommandBufferLevel::Primary => vks::core::VK_COMMAND_BUFFER_LEVEL_PRIMARY,
2649 CommandBufferLevel::Secondary => vks::core::VK_COMMAND_BUFFER_LEVEL_SECONDARY,
2650 CommandBufferLevel::Unknown(level) => level,
2651 }
2652 }
2653}
2654
2655#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2657pub enum IndexType {
2658 UInt16,
2659 UInt32,
2660 Unknown(vks::core::VkIndexType),
2661}
2662
2663impl From<IndexType> for vks::core::VkIndexType {
2664 fn from(index_type: IndexType) -> Self {
2665 match index_type {
2666 IndexType::UInt16 => vks::core::VK_INDEX_TYPE_UINT16,
2667 IndexType::UInt32 => vks::core::VK_INDEX_TYPE_UINT32,
2668 IndexType::Unknown(index_type) => index_type,
2669 }
2670 }
2671}
2672
2673#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2675pub enum SubpassContents {
2676 Inline,
2677 SecondaryCommandBuffers,
2678 Unknown(vks::core::VkSubpassContents),
2679}
2680
2681impl From<SubpassContents> for vks::core::VkSubpassContents {
2682 fn from(contents: SubpassContents) -> Self {
2683 match contents {
2684 SubpassContents::Inline => vks::core::VK_SUBPASS_CONTENTS_INLINE,
2685 SubpassContents::SecondaryCommandBuffers => vks::core::VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS,
2686 SubpassContents::Unknown(contents) => contents,
2687 }
2688 }
2689}
2690
2691gen_chain_struct! {
2692 name: ApplicationInfoChain [ApplicationInfoChainWrapper],
2693 query: ApplicationInfoChainQuery [ApplicationInfoChainQueryWrapper],
2694 vks: vks::core::VkApplicationInfo,
2695 input: true,
2696 output: false,
2697}
2698
2699#[derive(Debug, Clone, PartialEq)]
2701pub struct ApplicationInfo {
2702 pub application_name: Option<String>,
2703 pub application_version: u32,
2704 pub engine_name: Option<String>,
2705 pub engine_version: u32,
2706 pub api_version: Option<Version>,
2707 pub chain: Option<ApplicationInfoChain>,
2708}
2709
2710#[derive(Debug)]
2711struct VkApplicationInfoWrapper {
2712 pub vks_struct: vks::core::VkApplicationInfo,
2713 application_name_cstr: Option<CString>,
2714 engine_name_cstr: Option<CString>,
2715 chain: Option<ApplicationInfoChainWrapper>,
2716}
2717
2718impl VkApplicationInfoWrapper {
2719 pub fn new(info: &ApplicationInfo, with_chain: bool) -> Self {
2720 let application_name_cstr = utils::cstr_from_string(info.application_name.clone());
2721 let engine_name_cstr = utils::cstr_from_string(info.engine_name.clone());
2722 let (pnext, chain) = ApplicationInfoChainWrapper::new_optional(&info.chain, with_chain);
2723
2724 VkApplicationInfoWrapper {
2725 vks_struct: vks::core::VkApplicationInfo {
2726 sType: vks::core::VK_STRUCTURE_TYPE_APPLICATION_INFO,
2727 pNext: pnext,
2728 pApplicationName: application_name_cstr.1,
2729 applicationVersion: info.application_version,
2730 pEngineName: engine_name_cstr.1,
2731 engineVersion: info.engine_version,
2732 apiVersion: Version::api_version_from_optional(info.api_version),
2733 },
2734 application_name_cstr: application_name_cstr.0,
2735 engine_name_cstr: engine_name_cstr.0,
2736 chain: chain,
2737 }
2738 }
2739}
2740
2741gen_chain_struct! {
2742 name: InstanceCreateInfoChain [InstanceCreateInfoChainWrapper],
2743 query: InstanceCreateInfoChainQuery [InstanceCreateInfoChainQueryWrapper],
2744 vks: vks::core::VkInstanceCreateInfo,
2745 input: true,
2746 output: false,
2747
2748 debug_report_callback_create_info_ext: ext_debug_report::DebugReportCallbackCreateInfoExt {
2749 fn_add: add_debug_report_callback_create_info_ext,
2750 fn_has: has_debug_report_callback_create_info_ext,
2751 fn_get: get_debug_report_callback_create_info_ext,
2752 wrapper: ext_debug_report::VkDebugReportCallbackCreateInfoEXTWrapper,
2753 vks: vks::ext_debug_report::VkDebugReportCallbackCreateInfoEXT,
2754 stype: vks::core::VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
2755 }
2756
2757 validation_flags_ext: ext_validation_flags::ValidationFlagsExt {
2758 fn_add: add_validation_flags_ext,
2759 fn_has: has_validation_flags_ext,
2760 fn_get: get_validation_flags_ext,
2761 wrapper: ext_validation_flags::VkValidationFlagsEXTWrapper,
2762 vks: vks::ext_validation_flags::VkValidationFlagsEXT,
2763 stype: vks::core::VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT,
2764 }
2765}
2766
2767#[derive(Debug, Clone, PartialEq)]
2769pub struct InstanceCreateInfo {
2770 pub flags: InstanceCreateFlags,
2771 pub application_info: Option<ApplicationInfo>,
2772 pub enabled_layers: Vec<String>,
2773 pub enabled_extensions: InstanceExtensions,
2774 pub chain: Option<InstanceCreateInfoChain>,
2775}
2776
2777#[derive(Debug)]
2778struct VkInstanceCreateInfoWrapper {
2779 pub vks_struct: vks::core::VkInstanceCreateInfo,
2780 application_info: Option<Box<VkApplicationInfoWrapper>>,
2781 enabled_layers: Vec<CString>,
2782 enabled_layers_ptrs: Vec<*const c_char>,
2783 enabled_extensions: Vec<CString>,
2784 enabled_extensions_ptrs: Vec<*const c_char>,
2785 chain: Option<InstanceCreateInfoChainWrapper>,
2786}
2787
2788impl VkInstanceCreateInfoWrapper {
2789 pub fn new(create_info: &InstanceCreateInfo, with_chain: bool) -> Self {
2790 let (application_info_ptr, application_info) = match create_info.application_info {
2791 Some(ref application_info) => {
2792 let application_info: Box<_> = Box::new(VkApplicationInfoWrapper::new(application_info, true));
2793 (&application_info.vks_struct as *const _, Some(application_info))
2794 }
2795
2796 None => (ptr::null(), None),
2797 };
2798
2799 let enabled_layers: Vec<_> = create_info.enabled_layers.iter()
2800 .cloned()
2801 .map(CString::new)
2802 .map(Result::unwrap)
2803 .collect();
2804 let enabled_layers_ptrs: Vec<_> = enabled_layers
2805 .iter()
2806 .map(|l| l.as_ptr())
2807 .collect();
2808 let enabled_layers_ptr = if !enabled_layers_ptrs.is_empty() {
2809 enabled_layers_ptrs.as_ptr()
2810 }
2811 else {
2812 ptr::null()
2813 };
2814
2815 let enabled_extensions = create_info.enabled_extensions.to_cstring_vec();
2816 let enabled_extensions_ptrs: Vec<_> = enabled_extensions
2817 .iter()
2818 .map(|l| l.as_ptr())
2819 .collect();
2820 let enabled_extensions_ptr = if !enabled_extensions_ptrs.is_empty() {
2821 enabled_extensions_ptrs.as_ptr()
2822 }
2823 else {
2824 ptr::null()
2825 };
2826
2827 let (pnext, chain) = InstanceCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
2828
2829 VkInstanceCreateInfoWrapper {
2830 vks_struct: vks::core::VkInstanceCreateInfo {
2831 sType: vks::core::VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
2832 pNext: pnext,
2833 flags: create_info.flags.bits,
2834 pApplicationInfo: application_info_ptr,
2835 enabledLayerCount: enabled_layers_ptrs.len() as u32,
2836 ppEnabledLayerNames: enabled_layers_ptr,
2837 enabledExtensionCount: enabled_extensions_ptrs.len() as u32,
2838 ppEnabledExtensionNames: enabled_extensions_ptr,
2839 },
2840 application_info: application_info,
2841 enabled_layers: enabled_layers,
2842 enabled_layers_ptrs: enabled_layers_ptrs,
2843 enabled_extensions: enabled_extensions,
2844 enabled_extensions_ptrs: enabled_extensions_ptrs,
2845 chain: chain,
2846 }
2847 }
2848}
2849
2850pub trait Allocator: Send + Sync + fmt::Debug {
2852 fn alloc(&self, size: usize, alignment: usize, allocation_scope: SystemAllocationSope) -> *mut c_void;
2853 fn realloc(&self, original: *mut c_void, size: usize, alignment: usize, allocation_scope: SystemAllocationSope) -> *mut c_void;
2854 fn free(&self, memory: *mut c_void);
2855
2856 fn has_internal_alloc(&self) -> bool {
2857 false
2858 }
2859
2860 #[allow(unused_variables)]
2861 fn internal_alloc(&self, size: usize, allocation_type: InternalAllocationType, allocation_scope: SystemAllocationSope) {
2862 panic!("Default dummy implementation of Allocator::internal_alloc called. Make sure to either implement all three of has_internal_alloc, internal_alloc, and internal_free, or none of them.");
2863 }
2864
2865 #[allow(unused_variables)]
2866 fn internal_free(&self, size: usize, allocation_type: InternalAllocationType, allocation_scope: SystemAllocationSope) {
2867 panic!("Default dummy implementation of Allocator::internal_free called. Make sure to either implement all three of has_internal_alloc, internal_alloc, and internal_free, or none of them.");
2868 }
2869}
2870
2871#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Default)]
2873pub struct PhysicalDeviceFeatures {
2874 pub robust_buffer_access: bool,
2875 pub full_draw_index_uint32: bool,
2876 pub image_cube_array: bool,
2877 pub independent_blend: bool,
2878 pub geometry_shader: bool,
2879 pub tessellation_shader: bool,
2880 pub sample_rate_shading: bool,
2881 pub dual_src_blend: bool,
2882 pub logic_op: bool,
2883 pub multi_draw_indirect: bool,
2884 pub draw_indirect_first_instance: bool,
2885 pub depth_clamp: bool,
2886 pub depth_bias_clamp: bool,
2887 pub fill_mode_non_solid: bool,
2888 pub depth_bounds: bool,
2889 pub wide_lines: bool,
2890 pub large_points: bool,
2891 pub alpha_to_one: bool,
2892 pub multi_viewport: bool,
2893 pub sampler_anisotropy: bool,
2894 pub texture_compression_etc2: bool,
2895 pub texture_compression_astc_ldr: bool,
2896 pub texture_compression_bc: bool,
2897 pub occlusion_query_precise: bool,
2898 pub pipeline_statistics_query: bool,
2899 pub vertex_pipeline_stores_and_atomics: bool,
2900 pub fragment_stores_and_atomics: bool,
2901 pub shader_tessellation_and_geometry_point_size: bool,
2902 pub shader_image_gather_extended: bool,
2903 pub shader_storage_image_extended_formats: bool,
2904 pub shader_storage_image_multisample: bool,
2905 pub shader_storage_image_read_without_format: bool,
2906 pub shader_storage_image_write_without_format: bool,
2907 pub shader_uniform_buffer_array_dynamic_indexing: bool,
2908 pub shader_sampled_image_array_dynamic_indexing: bool,
2909 pub shader_storage_buffer_array_dynamic_indexing: bool,
2910 pub shader_storage_image_array_dynamic_indexing: bool,
2911 pub shader_clip_distance: bool,
2912 pub shader_cull_distance: bool,
2913 pub shader_float64: bool,
2914 pub shader_int64: bool,
2915 pub shader_int16: bool,
2916 pub shader_resource_residency: bool,
2917 pub shader_resource_min_lod: bool,
2918 pub sparse_binding: bool,
2919 pub sparse_residency_buffer: bool,
2920 pub sparse_residency_image_2d: bool,
2921 pub sparse_residency_image_3d: bool,
2922 pub sparse_residency_2_samples: bool,
2923 pub sparse_residency_4_samples: bool,
2924 pub sparse_residency_8_samples: bool,
2925 pub sparse_residency_16_samples: bool,
2926 pub sparse_residency_aliased: bool,
2927 pub variable_multisample_rate: bool,
2928 pub inherited_queries: bool,
2929}
2930
2931impl<'a> From<&'a vks::core::VkPhysicalDeviceFeatures> for PhysicalDeviceFeatures {
2932 fn from(featurs: &'a vks::core::VkPhysicalDeviceFeatures) -> Self {
2933 PhysicalDeviceFeatures {
2934 robust_buffer_access: utils::from_vk_bool(featurs.robustBufferAccess),
2935 full_draw_index_uint32: utils::from_vk_bool(featurs.fullDrawIndexUint32),
2936 image_cube_array: utils::from_vk_bool(featurs.imageCubeArray),
2937 independent_blend: utils::from_vk_bool(featurs.independentBlend),
2938 geometry_shader: utils::from_vk_bool(featurs.geometryShader),
2939 tessellation_shader: utils::from_vk_bool(featurs.tessellationShader),
2940 sample_rate_shading: utils::from_vk_bool(featurs.sampleRateShading),
2941 dual_src_blend: utils::from_vk_bool(featurs.dualSrcBlend),
2942 logic_op: utils::from_vk_bool(featurs.logicOp),
2943 multi_draw_indirect: utils::from_vk_bool(featurs.multiDrawIndirect),
2944 draw_indirect_first_instance: utils::from_vk_bool(featurs.drawIndirectFirstInstance),
2945 depth_clamp: utils::from_vk_bool(featurs.depthClamp),
2946 depth_bias_clamp: utils::from_vk_bool(featurs.depthBiasClamp),
2947 fill_mode_non_solid: utils::from_vk_bool(featurs.fillModeNonSolid),
2948 depth_bounds: utils::from_vk_bool(featurs.depthBounds),
2949 wide_lines: utils::from_vk_bool(featurs.wideLines),
2950 large_points: utils::from_vk_bool(featurs.largePoints),
2951 alpha_to_one: utils::from_vk_bool(featurs.alphaToOne),
2952 multi_viewport: utils::from_vk_bool(featurs.multiViewport),
2953 sampler_anisotropy: utils::from_vk_bool(featurs.samplerAnisotropy),
2954 texture_compression_etc2: utils::from_vk_bool(featurs.textureCompressionETC2),
2955 texture_compression_astc_ldr: utils::from_vk_bool(featurs.textureCompressionASTC_LDR),
2956 texture_compression_bc: utils::from_vk_bool(featurs.textureCompressionBC),
2957 occlusion_query_precise: utils::from_vk_bool(featurs.occlusionQueryPrecise),
2958 pipeline_statistics_query: utils::from_vk_bool(featurs.pipelineStatisticsQuery),
2959 vertex_pipeline_stores_and_atomics: utils::from_vk_bool(featurs.vertexPipelineStoresAndAtomics),
2960 fragment_stores_and_atomics: utils::from_vk_bool(featurs.fragmentStoresAndAtomics),
2961 shader_tessellation_and_geometry_point_size: utils::from_vk_bool(featurs.shaderTessellationAndGeometryPointSize),
2962 shader_image_gather_extended: utils::from_vk_bool(featurs.shaderImageGatherExtended),
2963 shader_storage_image_extended_formats: utils::from_vk_bool(featurs.shaderStorageImageExtendedFormats),
2964 shader_storage_image_multisample: utils::from_vk_bool(featurs.shaderStorageImageMultisample),
2965 shader_storage_image_read_without_format: utils::from_vk_bool(featurs.shaderStorageImageReadWithoutFormat),
2966 shader_storage_image_write_without_format: utils::from_vk_bool(featurs.shaderStorageImageWriteWithoutFormat),
2967 shader_uniform_buffer_array_dynamic_indexing: utils::from_vk_bool(featurs.shaderUniformBufferArrayDynamicIndexing),
2968 shader_sampled_image_array_dynamic_indexing: utils::from_vk_bool(featurs.shaderSampledImageArrayDynamicIndexing),
2969 shader_storage_buffer_array_dynamic_indexing: utils::from_vk_bool(featurs.shaderStorageBufferArrayDynamicIndexing),
2970 shader_storage_image_array_dynamic_indexing: utils::from_vk_bool(featurs.shaderStorageImageArrayDynamicIndexing),
2971 shader_clip_distance: utils::from_vk_bool(featurs.shaderClipDistance),
2972 shader_cull_distance: utils::from_vk_bool(featurs.shaderCullDistance),
2973 shader_float64: utils::from_vk_bool(featurs.shaderFloat64),
2974 shader_int64: utils::from_vk_bool(featurs.shaderInt64),
2975 shader_int16: utils::from_vk_bool(featurs.shaderInt16),
2976 shader_resource_residency: utils::from_vk_bool(featurs.shaderResourceResidency),
2977 shader_resource_min_lod: utils::from_vk_bool(featurs.shaderResourceMinLod),
2978 sparse_binding: utils::from_vk_bool(featurs.sparseBinding),
2979 sparse_residency_buffer: utils::from_vk_bool(featurs.sparseResidencyBuffer),
2980 sparse_residency_image_2d: utils::from_vk_bool(featurs.sparseResidencyImage2D),
2981 sparse_residency_image_3d: utils::from_vk_bool(featurs.sparseResidencyImage3D),
2982 sparse_residency_2_samples: utils::from_vk_bool(featurs.sparseResidency2Samples),
2983 sparse_residency_4_samples: utils::from_vk_bool(featurs.sparseResidency4Samples),
2984 sparse_residency_8_samples: utils::from_vk_bool(featurs.sparseResidency8Samples),
2985 sparse_residency_16_samples: utils::from_vk_bool(featurs.sparseResidency16Samples),
2986 sparse_residency_aliased: utils::from_vk_bool(featurs.sparseResidencyAliased),
2987 variable_multisample_rate: utils::from_vk_bool(featurs.variableMultisampleRate),
2988 inherited_queries: utils::from_vk_bool(featurs.inheritedQueries),
2989 }
2990 }
2991}
2992
2993impl<'a> From<&'a PhysicalDeviceFeatures> for vks::core::VkPhysicalDeviceFeatures {
2994 fn from(featurs: &'a PhysicalDeviceFeatures) -> Self {
2995 vks::core::VkPhysicalDeviceFeatures {
2996 robustBufferAccess: utils::to_vk_bool(featurs.robust_buffer_access),
2997 fullDrawIndexUint32: utils::to_vk_bool(featurs.full_draw_index_uint32),
2998 imageCubeArray: utils::to_vk_bool(featurs.image_cube_array),
2999 independentBlend: utils::to_vk_bool(featurs.independent_blend),
3000 geometryShader: utils::to_vk_bool(featurs.geometry_shader),
3001 tessellationShader: utils::to_vk_bool(featurs.tessellation_shader),
3002 sampleRateShading: utils::to_vk_bool(featurs.sample_rate_shading),
3003 dualSrcBlend: utils::to_vk_bool(featurs.dual_src_blend),
3004 logicOp: utils::to_vk_bool(featurs.logic_op),
3005 multiDrawIndirect: utils::to_vk_bool(featurs.multi_draw_indirect),
3006 drawIndirectFirstInstance: utils::to_vk_bool(featurs.draw_indirect_first_instance),
3007 depthClamp: utils::to_vk_bool(featurs.depth_clamp),
3008 depthBiasClamp: utils::to_vk_bool(featurs.depth_bias_clamp),
3009 fillModeNonSolid: utils::to_vk_bool(featurs.fill_mode_non_solid),
3010 depthBounds: utils::to_vk_bool(featurs.depth_bounds),
3011 wideLines: utils::to_vk_bool(featurs.wide_lines),
3012 largePoints: utils::to_vk_bool(featurs.large_points),
3013 alphaToOne: utils::to_vk_bool(featurs.alpha_to_one),
3014 multiViewport: utils::to_vk_bool(featurs.multi_viewport),
3015 samplerAnisotropy: utils::to_vk_bool(featurs.sampler_anisotropy),
3016 textureCompressionETC2: utils::to_vk_bool(featurs.texture_compression_etc2),
3017 textureCompressionASTC_LDR: utils::to_vk_bool(featurs.texture_compression_astc_ldr),
3018 textureCompressionBC: utils::to_vk_bool(featurs.texture_compression_bc),
3019 occlusionQueryPrecise: utils::to_vk_bool(featurs.occlusion_query_precise),
3020 pipelineStatisticsQuery: utils::to_vk_bool(featurs.pipeline_statistics_query),
3021 vertexPipelineStoresAndAtomics: utils::to_vk_bool(featurs.vertex_pipeline_stores_and_atomics),
3022 fragmentStoresAndAtomics: utils::to_vk_bool(featurs.fragment_stores_and_atomics),
3023 shaderTessellationAndGeometryPointSize: utils::to_vk_bool(featurs.shader_tessellation_and_geometry_point_size),
3024 shaderImageGatherExtended: utils::to_vk_bool(featurs.shader_image_gather_extended),
3025 shaderStorageImageExtendedFormats: utils::to_vk_bool(featurs.shader_storage_image_extended_formats),
3026 shaderStorageImageMultisample: utils::to_vk_bool(featurs.shader_storage_image_multisample),
3027 shaderStorageImageReadWithoutFormat: utils::to_vk_bool(featurs.shader_storage_image_read_without_format),
3028 shaderStorageImageWriteWithoutFormat: utils::to_vk_bool(featurs.shader_storage_image_write_without_format),
3029 shaderUniformBufferArrayDynamicIndexing: utils::to_vk_bool(featurs.shader_uniform_buffer_array_dynamic_indexing),
3030 shaderSampledImageArrayDynamicIndexing: utils::to_vk_bool(featurs.shader_sampled_image_array_dynamic_indexing),
3031 shaderStorageBufferArrayDynamicIndexing: utils::to_vk_bool(featurs.shader_storage_buffer_array_dynamic_indexing),
3032 shaderStorageImageArrayDynamicIndexing: utils::to_vk_bool(featurs.shader_storage_image_array_dynamic_indexing),
3033 shaderClipDistance: utils::to_vk_bool(featurs.shader_clip_distance),
3034 shaderCullDistance: utils::to_vk_bool(featurs.shader_cull_distance),
3035 shaderFloat64: utils::to_vk_bool(featurs.shader_float64),
3036 shaderInt64: utils::to_vk_bool(featurs.shader_int64),
3037 shaderInt16: utils::to_vk_bool(featurs.shader_int16),
3038 shaderResourceResidency: utils::to_vk_bool(featurs.shader_resource_residency),
3039 shaderResourceMinLod: utils::to_vk_bool(featurs.shader_resource_min_lod),
3040 sparseBinding: utils::to_vk_bool(featurs.sparse_binding),
3041 sparseResidencyBuffer: utils::to_vk_bool(featurs.sparse_residency_buffer),
3042 sparseResidencyImage2D: utils::to_vk_bool(featurs.sparse_residency_image_2d),
3043 sparseResidencyImage3D: utils::to_vk_bool(featurs.sparse_residency_image_3d),
3044 sparseResidency2Samples: utils::to_vk_bool(featurs.sparse_residency_2_samples),
3045 sparseResidency4Samples: utils::to_vk_bool(featurs.sparse_residency_4_samples),
3046 sparseResidency8Samples: utils::to_vk_bool(featurs.sparse_residency_8_samples),
3047 sparseResidency16Samples: utils::to_vk_bool(featurs.sparse_residency_16_samples),
3048 sparseResidencyAliased: utils::to_vk_bool(featurs.sparse_residency_aliased),
3049 variableMultisampleRate: utils::to_vk_bool(featurs.variable_multisample_rate),
3050 inheritedQueries: utils::to_vk_bool(featurs.inherited_queries),
3051 }
3052 }
3053}
3054
3055impl PhysicalDeviceFeatures {
3056 #[inline]
3058 pub fn new() -> Self {
3059 Default::default()
3060 }
3061
3062 pub fn all() -> Self {
3064 PhysicalDeviceFeatures {
3065 robust_buffer_access: true,
3066 full_draw_index_uint32: true,
3067 image_cube_array: true,
3068 independent_blend: true,
3069 geometry_shader: true,
3070 tessellation_shader: true,
3071 sample_rate_shading: true,
3072 dual_src_blend: true,
3073 logic_op: true,
3074 multi_draw_indirect: true,
3075 draw_indirect_first_instance: true,
3076 depth_clamp: true,
3077 depth_bias_clamp: true,
3078 fill_mode_non_solid: true,
3079 depth_bounds: true,
3080 wide_lines: true,
3081 large_points: true,
3082 alpha_to_one: true,
3083 multi_viewport: true,
3084 sampler_anisotropy: true,
3085 texture_compression_etc2: true,
3086 texture_compression_astc_ldr: true,
3087 texture_compression_bc: true,
3088 occlusion_query_precise: true,
3089 pipeline_statistics_query: true,
3090 vertex_pipeline_stores_and_atomics: true,
3091 fragment_stores_and_atomics: true,
3092 shader_tessellation_and_geometry_point_size: true,
3093 shader_image_gather_extended: true,
3094 shader_storage_image_extended_formats: true,
3095 shader_storage_image_multisample: true,
3096 shader_storage_image_read_without_format: true,
3097 shader_storage_image_write_without_format: true,
3098 shader_uniform_buffer_array_dynamic_indexing: true,
3099 shader_sampled_image_array_dynamic_indexing: true,
3100 shader_storage_buffer_array_dynamic_indexing: true,
3101 shader_storage_image_array_dynamic_indexing: true,
3102 shader_clip_distance: true,
3103 shader_cull_distance: true,
3104 shader_float64: true,
3105 shader_int64: true,
3106 shader_int16: true,
3107 shader_resource_residency: true,
3108 shader_resource_min_lod: true,
3109 sparse_binding: true,
3110 sparse_residency_buffer: true,
3111 sparse_residency_image_2d: true,
3112 sparse_residency_image_3d: true,
3113 sparse_residency_2_samples: true,
3114 sparse_residency_4_samples: true,
3115 sparse_residency_8_samples: true,
3116 sparse_residency_16_samples: true,
3117 sparse_residency_aliased: true,
3118 variable_multisample_rate: true,
3119 inherited_queries: true,
3120 }
3121 }
3122
3123 #[inline]
3125 pub fn empty() -> Self {
3126 Default::default()
3127 }
3128
3129 pub fn is_empty(&self) -> bool {
3131 !self.robust_buffer_access &&
3132 !self.full_draw_index_uint32 &&
3133 !self.image_cube_array &&
3134 !self.independent_blend &&
3135 !self.geometry_shader &&
3136 !self.tessellation_shader &&
3137 !self.sample_rate_shading &&
3138 !self.dual_src_blend &&
3139 !self.logic_op &&
3140 !self.multi_draw_indirect &&
3141 !self.draw_indirect_first_instance &&
3142 !self.depth_clamp &&
3143 !self.depth_bias_clamp &&
3144 !self.fill_mode_non_solid &&
3145 !self.depth_bounds &&
3146 !self.wide_lines &&
3147 !self.large_points &&
3148 !self.alpha_to_one &&
3149 !self.multi_viewport &&
3150 !self.sampler_anisotropy &&
3151 !self.texture_compression_etc2 &&
3152 !self.texture_compression_astc_ldr &&
3153 !self.texture_compression_bc &&
3154 !self.occlusion_query_precise &&
3155 !self.pipeline_statistics_query &&
3156 !self.vertex_pipeline_stores_and_atomics &&
3157 !self.fragment_stores_and_atomics &&
3158 !self.shader_tessellation_and_geometry_point_size &&
3159 !self.shader_image_gather_extended &&
3160 !self.shader_storage_image_extended_formats &&
3161 !self.shader_storage_image_multisample &&
3162 !self.shader_storage_image_read_without_format &&
3163 !self.shader_storage_image_write_without_format &&
3164 !self.shader_uniform_buffer_array_dynamic_indexing &&
3165 !self.shader_sampled_image_array_dynamic_indexing &&
3166 !self.shader_storage_buffer_array_dynamic_indexing &&
3167 !self.shader_storage_image_array_dynamic_indexing &&
3168 !self.shader_clip_distance &&
3169 !self.shader_cull_distance &&
3170 !self.shader_float64 &&
3171 !self.shader_int64 &&
3172 !self.shader_int16 &&
3173 !self.shader_resource_residency &&
3174 !self.shader_resource_min_lod &&
3175 !self.sparse_binding &&
3176 !self.sparse_residency_buffer &&
3177 !self.sparse_residency_image_2d &&
3178 !self.sparse_residency_image_3d &&
3179 !self.sparse_residency_2_samples &&
3180 !self.sparse_residency_4_samples &&
3181 !self.sparse_residency_8_samples &&
3182 !self.sparse_residency_16_samples &&
3183 !self.sparse_residency_aliased &&
3184 !self.variable_multisample_rate &&
3185 !self.inherited_queries
3186 }
3187
3188 pub fn difference(&mut self, other: &Self) {
3190 self.robust_buffer_access &= !other.robust_buffer_access;
3191 self.full_draw_index_uint32 &= !other.full_draw_index_uint32;
3192 self.image_cube_array &= !other.image_cube_array;
3193 self.independent_blend &= !other.independent_blend;
3194 self.geometry_shader &= !other.geometry_shader;
3195 self.tessellation_shader &= !other.tessellation_shader;
3196 self.sample_rate_shading &= !other.sample_rate_shading;
3197 self.dual_src_blend &= !other.dual_src_blend;
3198 self.logic_op &= !other.logic_op;
3199 self.multi_draw_indirect &= !other.multi_draw_indirect;
3200 self.draw_indirect_first_instance &= !other.draw_indirect_first_instance;
3201 self.depth_clamp &= !other.depth_clamp;
3202 self.depth_bias_clamp &= !other.depth_bias_clamp;
3203 self.fill_mode_non_solid &= !other.fill_mode_non_solid;
3204 self.depth_bounds &= !other.depth_bounds;
3205 self.wide_lines &= !other.wide_lines;
3206 self.large_points &= !other.large_points;
3207 self.alpha_to_one &= !other.alpha_to_one;
3208 self.multi_viewport &= !other.multi_viewport;
3209 self.sampler_anisotropy &= !other.sampler_anisotropy;
3210 self.texture_compression_etc2 &= !other.texture_compression_etc2;
3211 self.texture_compression_astc_ldr &= !other.texture_compression_astc_ldr;
3212 self.texture_compression_bc &= !other.texture_compression_bc;
3213 self.occlusion_query_precise &= !other.occlusion_query_precise;
3214 self.pipeline_statistics_query &= !other.pipeline_statistics_query;
3215 self.vertex_pipeline_stores_and_atomics &= !other.vertex_pipeline_stores_and_atomics;
3216 self.fragment_stores_and_atomics &= !other.fragment_stores_and_atomics;
3217 self.shader_tessellation_and_geometry_point_size &= !other.shader_tessellation_and_geometry_point_size;
3218 self.shader_image_gather_extended &= !other.shader_image_gather_extended;
3219 self.shader_storage_image_extended_formats &= !other.shader_storage_image_extended_formats;
3220 self.shader_storage_image_multisample &= !other.shader_storage_image_multisample;
3221 self.shader_storage_image_read_without_format &= !other.shader_storage_image_read_without_format;
3222 self.shader_storage_image_write_without_format &= !other.shader_storage_image_write_without_format;
3223 self.shader_uniform_buffer_array_dynamic_indexing &= !other.shader_uniform_buffer_array_dynamic_indexing;
3224 self.shader_sampled_image_array_dynamic_indexing &= !other.shader_sampled_image_array_dynamic_indexing;
3225 self.shader_storage_buffer_array_dynamic_indexing &= !other.shader_storage_buffer_array_dynamic_indexing;
3226 self.shader_storage_image_array_dynamic_indexing &= !other.shader_storage_image_array_dynamic_indexing;
3227 self.shader_clip_distance &= !other.shader_clip_distance;
3228 self.shader_cull_distance &= !other.shader_cull_distance;
3229 self.shader_float64 &= !other.shader_float64;
3230 self.shader_int64 &= !other.shader_int64;
3231 self.shader_int16 &= !other.shader_int16;
3232 self.shader_resource_residency &= !other.shader_resource_residency;
3233 self.shader_resource_min_lod &= !other.shader_resource_min_lod;
3234 self.sparse_binding &= !other.sparse_binding;
3235 self.sparse_residency_buffer &= !other.sparse_residency_buffer;
3236 self.sparse_residency_image_2d &= !other.sparse_residency_image_2d;
3237 self.sparse_residency_image_3d &= !other.sparse_residency_image_3d;
3238 self.sparse_residency_2_samples &= !other.sparse_residency_2_samples;
3239 self.sparse_residency_4_samples &= !other.sparse_residency_4_samples;
3240 self.sparse_residency_8_samples &= !other.sparse_residency_8_samples;
3241 self.sparse_residency_16_samples &= !other.sparse_residency_16_samples;
3242 self.sparse_residency_aliased &= !other.sparse_residency_aliased;
3243 self.variable_multisample_rate &= !other.variable_multisample_rate;
3244 self.inherited_queries &= !other.inherited_queries;
3245 }
3246
3247 pub fn intersection(&mut self, other: &Self) {
3249 self.robust_buffer_access &= other.robust_buffer_access;
3250 self.full_draw_index_uint32 &= other.full_draw_index_uint32;
3251 self.image_cube_array &= other.image_cube_array;
3252 self.independent_blend &= other.independent_blend;
3253 self.geometry_shader &= other.geometry_shader;
3254 self.tessellation_shader &= other.tessellation_shader;
3255 self.sample_rate_shading &= other.sample_rate_shading;
3256 self.dual_src_blend &= other.dual_src_blend;
3257 self.logic_op &= other.logic_op;
3258 self.multi_draw_indirect &= other.multi_draw_indirect;
3259 self.draw_indirect_first_instance &= other.draw_indirect_first_instance;
3260 self.depth_clamp &= other.depth_clamp;
3261 self.depth_bias_clamp &= other.depth_bias_clamp;
3262 self.fill_mode_non_solid &= other.fill_mode_non_solid;
3263 self.depth_bounds &= other.depth_bounds;
3264 self.wide_lines &= other.wide_lines;
3265 self.large_points &= other.large_points;
3266 self.alpha_to_one &= other.alpha_to_one;
3267 self.multi_viewport &= other.multi_viewport;
3268 self.sampler_anisotropy &= other.sampler_anisotropy;
3269 self.texture_compression_etc2 &= other.texture_compression_etc2;
3270 self.texture_compression_astc_ldr &= other.texture_compression_astc_ldr;
3271 self.texture_compression_bc &= other.texture_compression_bc;
3272 self.occlusion_query_precise &= other.occlusion_query_precise;
3273 self.pipeline_statistics_query &= other.pipeline_statistics_query;
3274 self.vertex_pipeline_stores_and_atomics &= other.vertex_pipeline_stores_and_atomics;
3275 self.fragment_stores_and_atomics &= other.fragment_stores_and_atomics;
3276 self.shader_tessellation_and_geometry_point_size &= other.shader_tessellation_and_geometry_point_size;
3277 self.shader_image_gather_extended &= other.shader_image_gather_extended;
3278 self.shader_storage_image_extended_formats &= other.shader_storage_image_extended_formats;
3279 self.shader_storage_image_multisample &= other.shader_storage_image_multisample;
3280 self.shader_storage_image_read_without_format &= other.shader_storage_image_read_without_format;
3281 self.shader_storage_image_write_without_format &= other.shader_storage_image_write_without_format;
3282 self.shader_uniform_buffer_array_dynamic_indexing &= other.shader_uniform_buffer_array_dynamic_indexing;
3283 self.shader_sampled_image_array_dynamic_indexing &= other.shader_sampled_image_array_dynamic_indexing;
3284 self.shader_storage_buffer_array_dynamic_indexing &= other.shader_storage_buffer_array_dynamic_indexing;
3285 self.shader_storage_image_array_dynamic_indexing &= other.shader_storage_image_array_dynamic_indexing;
3286 self.shader_clip_distance &= other.shader_clip_distance;
3287 self.shader_cull_distance &= other.shader_cull_distance;
3288 self.shader_float64 &= other.shader_float64;
3289 self.shader_int64 &= other.shader_int64;
3290 self.shader_int16 &= other.shader_int16;
3291 self.shader_resource_residency &= other.shader_resource_residency;
3292 self.shader_resource_min_lod &= other.shader_resource_min_lod;
3293 self.sparse_binding &= other.sparse_binding;
3294 self.sparse_residency_buffer &= other.sparse_residency_buffer;
3295 self.sparse_residency_image_2d &= other.sparse_residency_image_2d;
3296 self.sparse_residency_image_3d &= other.sparse_residency_image_3d;
3297 self.sparse_residency_2_samples &= other.sparse_residency_2_samples;
3298 self.sparse_residency_4_samples &= other.sparse_residency_4_samples;
3299 self.sparse_residency_8_samples &= other.sparse_residency_8_samples;
3300 self.sparse_residency_16_samples &= other.sparse_residency_16_samples;
3301 self.sparse_residency_aliased &= other.sparse_residency_aliased;
3302 self.variable_multisample_rate &= other.variable_multisample_rate;
3303 self.inherited_queries &= other.inherited_queries;
3304 }
3305
3306 pub fn union(&mut self, other: &Self) {
3308 self.robust_buffer_access |= other.robust_buffer_access;
3309 self.full_draw_index_uint32 |= other.full_draw_index_uint32;
3310 self.image_cube_array |= other.image_cube_array;
3311 self.independent_blend |= other.independent_blend;
3312 self.geometry_shader |= other.geometry_shader;
3313 self.tessellation_shader |= other.tessellation_shader;
3314 self.sample_rate_shading |= other.sample_rate_shading;
3315 self.dual_src_blend |= other.dual_src_blend;
3316 self.logic_op |= other.logic_op;
3317 self.multi_draw_indirect |= other.multi_draw_indirect;
3318 self.draw_indirect_first_instance |= other.draw_indirect_first_instance;
3319 self.depth_clamp |= other.depth_clamp;
3320 self.depth_bias_clamp |= other.depth_bias_clamp;
3321 self.fill_mode_non_solid |= other.fill_mode_non_solid;
3322 self.depth_bounds |= other.depth_bounds;
3323 self.wide_lines |= other.wide_lines;
3324 self.large_points |= other.large_points;
3325 self.alpha_to_one |= other.alpha_to_one;
3326 self.multi_viewport |= other.multi_viewport;
3327 self.sampler_anisotropy |= other.sampler_anisotropy;
3328 self.texture_compression_etc2 |= other.texture_compression_etc2;
3329 self.texture_compression_astc_ldr |= other.texture_compression_astc_ldr;
3330 self.texture_compression_bc |= other.texture_compression_bc;
3331 self.occlusion_query_precise |= other.occlusion_query_precise;
3332 self.pipeline_statistics_query |= other.pipeline_statistics_query;
3333 self.vertex_pipeline_stores_and_atomics |= other.vertex_pipeline_stores_and_atomics;
3334 self.fragment_stores_and_atomics |= other.fragment_stores_and_atomics;
3335 self.shader_tessellation_and_geometry_point_size |= other.shader_tessellation_and_geometry_point_size;
3336 self.shader_image_gather_extended |= other.shader_image_gather_extended;
3337 self.shader_storage_image_extended_formats |= other.shader_storage_image_extended_formats;
3338 self.shader_storage_image_multisample |= other.shader_storage_image_multisample;
3339 self.shader_storage_image_read_without_format |= other.shader_storage_image_read_without_format;
3340 self.shader_storage_image_write_without_format |= other.shader_storage_image_write_without_format;
3341 self.shader_uniform_buffer_array_dynamic_indexing |= other.shader_uniform_buffer_array_dynamic_indexing;
3342 self.shader_sampled_image_array_dynamic_indexing |= other.shader_sampled_image_array_dynamic_indexing;
3343 self.shader_storage_buffer_array_dynamic_indexing |= other.shader_storage_buffer_array_dynamic_indexing;
3344 self.shader_storage_image_array_dynamic_indexing |= other.shader_storage_image_array_dynamic_indexing;
3345 self.shader_clip_distance |= other.shader_clip_distance;
3346 self.shader_cull_distance |= other.shader_cull_distance;
3347 self.shader_float64 |= other.shader_float64;
3348 self.shader_int64 |= other.shader_int64;
3349 self.shader_int16 |= other.shader_int16;
3350 self.shader_resource_residency |= other.shader_resource_residency;
3351 self.shader_resource_min_lod |= other.shader_resource_min_lod;
3352 self.sparse_binding |= other.sparse_binding;
3353 self.sparse_residency_buffer |= other.sparse_residency_buffer;
3354 self.sparse_residency_image_2d |= other.sparse_residency_image_2d;
3355 self.sparse_residency_image_3d |= other.sparse_residency_image_3d;
3356 self.sparse_residency_2_samples |= other.sparse_residency_2_samples;
3357 self.sparse_residency_4_samples |= other.sparse_residency_4_samples;
3358 self.sparse_residency_8_samples |= other.sparse_residency_8_samples;
3359 self.sparse_residency_16_samples |= other.sparse_residency_16_samples;
3360 self.sparse_residency_aliased |= other.sparse_residency_aliased;
3361 self.variable_multisample_rate |= other.variable_multisample_rate;
3362 self.inherited_queries |= other.inherited_queries;
3363 }
3364}
3365
3366#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3368pub struct FormatProperties {
3369 pub linear_tiling_features: FormatFeatureFlags,
3370 pub optimal_tiling_features: FormatFeatureFlags,
3371 pub buffer_features: FormatFeatureFlags,
3372}
3373
3374impl<'a> From<&'a vks::core::VkFormatProperties> for FormatProperties {
3375 fn from(properties: &'a vks::core::VkFormatProperties) -> Self {
3376 FormatProperties {
3377 linear_tiling_features: FormatFeatureFlags::from_bits_truncate(properties.linearTilingFeatures),
3378 optimal_tiling_features: FormatFeatureFlags::from_bits_truncate(properties.optimalTilingFeatures),
3379 buffer_features: FormatFeatureFlags::from_bits_truncate(properties.bufferFeatures),
3380 }
3381 }
3382}
3383
3384impl<'a> From<&'a FormatProperties> for vks::core::VkFormatProperties {
3385 fn from(properties: &'a FormatProperties) -> Self {
3386 vks::core::VkFormatProperties {
3387 linearTilingFeatures: properties.linear_tiling_features.bits(),
3388 optimalTilingFeatures: properties.optimal_tiling_features.bits(),
3389 bufferFeatures: properties.buffer_features.bits(),
3390 }
3391 }
3392}
3393
3394#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3396pub struct Extent3D {
3397 pub width: u32,
3398 pub height: u32,
3399 pub depth: u32,
3400}
3401
3402impl<'a> From<&'a vks::core::VkExtent3D> for Extent3D {
3403 fn from(extent: &'a vks::core::VkExtent3D) -> Self {
3404 Extent3D {
3405 width: extent.width,
3406 height: extent.height,
3407 depth: extent.depth,
3408 }
3409 }
3410}
3411
3412impl<'a> From<&'a Extent3D> for vks::core::VkExtent3D {
3413 fn from(extent: &'a Extent3D) -> Self {
3414 vks::core::VkExtent3D {
3415 width: extent.width,
3416 height: extent.height,
3417 depth: extent.depth,
3418 }
3419 }
3420}
3421
3422impl Extent3D {
3423 #[inline]
3425 pub fn new(width: u32, height: u32, depth: u32) -> Self {
3426 Extent3D {
3427 width: width,
3428 height: height,
3429 depth: depth,
3430 }
3431 }
3432
3433 #[inline]
3435 pub fn zero() -> Self {
3436 Extent3D {
3437 width: 0,
3438 height: 0,
3439 depth: 0,
3440 }
3441 }
3442
3443 #[inline]
3445 pub fn from_2d(extent: &Extent2D, depth: u32) -> Self {
3446 Extent3D {
3447 width: extent.width,
3448 height: extent.height,
3449 depth: depth,
3450 }
3451 }
3452}
3453
3454#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3456pub struct ImageFormatProperties {
3457 pub max_extent: Extent3D,
3458 pub max_mip_levels: u32,
3459 pub max_array_layers: u32,
3460 pub sample_counts: SampleCountFlags,
3461 pub max_resource_size: u64,
3462}
3463
3464impl<'a> From<&'a vks::core::VkImageFormatProperties> for ImageFormatProperties {
3465 fn from(properties: &'a vks::core::VkImageFormatProperties) -> Self {
3466 ImageFormatProperties {
3467 max_extent: (&properties.maxExtent).into(),
3468 max_mip_levels: properties.maxMipLevels,
3469 max_array_layers: properties.maxArrayLayers,
3470 sample_counts: SampleCountFlags::from_bits_truncate(properties.sampleCounts),
3471 max_resource_size: properties.maxResourceSize,
3472 }
3473 }
3474}
3475
3476impl<'a> From<&'a ImageFormatProperties> for vks::core::VkImageFormatProperties {
3477 fn from(properties: &'a ImageFormatProperties) -> Self {
3478 vks::core::VkImageFormatProperties {
3479 maxExtent: (&properties.max_extent).into(),
3480 maxMipLevels: properties.max_mip_levels,
3481 maxArrayLayers: properties.max_array_layers,
3482 sampleCounts: properties.sample_counts.bits(),
3483 maxResourceSize: properties.max_resource_size,
3484 }
3485 }
3486}
3487
3488#[derive(Debug, Copy, Clone, PartialEq)]
3490pub struct PhysicalDeviceLimits {
3491 pub max_image_dimension_1d: u32,
3492 pub max_image_dimension_2d: u32,
3493 pub max_image_dimension_3d: u32,
3494 pub max_image_dimension_cube: u32,
3495 pub max_image_array_layers: u32,
3496 pub max_texel_buffer_elements: u32,
3497 pub max_uniform_buffer_range: u32,
3498 pub max_storage_buffer_range: u32,
3499 pub max_push_constants_size: u32,
3500 pub max_memory_allocation_count: u32,
3501 pub max_sampler_allocation_count: u32,
3502 pub buffer_image_granularity: u64,
3503 pub sparse_address_space_size: u64,
3504 pub max_bound_descriptor_sets: u32,
3505 pub max_per_stage_descriptor_samplers: u32,
3506 pub max_per_stage_descriptor_uniform_buffers: u32,
3507 pub max_per_stage_descriptor_storage_buffers: u32,
3508 pub max_per_stage_descriptor_sampled_images: u32,
3509 pub max_per_stage_descriptor_storage_images: u32,
3510 pub max_per_stage_descriptor_input_attachments: u32,
3511 pub max_per_stage_resources: u32,
3512 pub max_descriptor_set_samplers: u32,
3513 pub max_descriptor_set_uniform_buffers: u32,
3514 pub max_descriptor_set_uniform_buffers_dynamic: u32,
3515 pub max_descriptor_set_storage_buffers: u32,
3516 pub max_descriptor_set_storage_buffers_dynamic: u32,
3517 pub max_descriptor_set_sampled_images: u32,
3518 pub max_descriptor_set_storage_images: u32,
3519 pub max_descriptor_set_input_attachments: u32,
3520 pub max_vertex_input_attributes: u32,
3521 pub max_vertex_input_bindings: u32,
3522 pub max_vertex_input_attribute_offset: u32,
3523 pub max_vertex_input_binding_stride: u32,
3524 pub max_vertex_output_components: u32,
3525 pub max_tessellation_generation_level: u32,
3526 pub max_tessellation_patch_size: u32,
3527 pub max_tessellation_control_per_vertex_input_components: u32,
3528 pub max_tessellation_control_per_vertex_output_components: u32,
3529 pub max_tessellation_control_per_patch_output_components: u32,
3530 pub max_tessellation_control_total_output_components: u32,
3531 pub max_tessellation_evaluation_input_components: u32,
3532 pub max_tessellation_evaluation_output_components: u32,
3533 pub max_geometry_shader_invocations: u32,
3534 pub max_geometry_input_components: u32,
3535 pub max_geometry_output_components: u32,
3536 pub max_geometry_output_vertices: u32,
3537 pub max_geometry_total_output_components: u32,
3538 pub max_fragment_input_components: u32,
3539 pub max_fragment_output_attachments: u32,
3540 pub max_fragment_dual_src_attachments: u32,
3541 pub max_fragment_combined_output_resources: u32,
3542 pub max_compute_shared_memory_size: u32,
3543 pub max_compute_work_group_count: [u32; 3],
3544 pub max_compute_work_group_invocations: u32,
3545 pub max_compute_work_group_size: [u32; 3],
3546 pub sub_pixel_precision_bits: u32,
3547 pub sub_texel_precision_bits: u32,
3548 pub mipmap_precision_bits: u32,
3549 pub max_draw_indexed_index_value: u32,
3550 pub max_draw_indirect_count: u32,
3551 pub max_sampler_lod_bias: f32,
3552 pub max_sampler_anisotropy: f32,
3553 pub max_viewports: u32,
3554 pub max_viewport_dimensions: [u32; 2],
3555 pub viewport_bounds_range: [f32; 2],
3556 pub viewport_sub_pixel_bits: u32,
3557 pub min_memory_map_alignment: usize,
3558 pub min_texel_buffer_offset_alignment: u64,
3559 pub min_uniform_buffer_offset_alignment: u64,
3560 pub min_storage_buffer_offset_alignment: u64,
3561 pub min_texel_offset: i32,
3562 pub max_texel_offset: u32,
3563 pub min_texel_gather_offset: i32,
3564 pub max_texel_gather_offset: u32,
3565 pub min_interpolation_offset: f32,
3566 pub max_interpolation_offset: f32,
3567 pub sub_pixel_interpolation_offset_bits: u32,
3568 pub max_framebuffer_width: u32,
3569 pub max_framebuffer_height: u32,
3570 pub max_framebuffer_layers: u32,
3571 pub framebuffer_color_sample_counts: SampleCountFlags,
3572 pub framebuffer_depth_sample_counts: SampleCountFlags,
3573 pub framebuffer_stencil_sample_counts: SampleCountFlags,
3574 pub framebuffer_no_attachments_sample_counts: SampleCountFlags,
3575 pub max_color_attachments: u32,
3576 pub sampled_image_color_sample_counts: SampleCountFlags,
3577 pub sampled_image_integer_sample_counts: SampleCountFlags,
3578 pub sampled_image_depth_sample_counts: SampleCountFlags,
3579 pub sampled_image_stencil_sample_counts: SampleCountFlags,
3580 pub storage_image_sample_counts: SampleCountFlags,
3581 pub max_sample_mask_words: u32,
3582 pub timestamp_compute_and_graphics: bool,
3583 pub timestamp_period: f32,
3584 pub max_clip_distances: u32,
3585 pub max_cull_distances: u32,
3586 pub max_combined_clip_and_cull_distances: u32,
3587 pub discrete_queue_priorities: u32,
3588 pub point_size_range: [f32; 2],
3589 pub line_width_range: [f32; 2],
3590 pub point_size_granularity: f32,
3591 pub line_width_granularity: f32,
3592 pub strict_lines: bool,
3593 pub standard_sample_locations: bool,
3594 pub optimal_buffer_copy_offset_alignment: u64,
3595 pub optimal_buffer_copy_row_pitch_alignment: u64,
3596 pub non_coherent_atom_size: u64,
3597}
3598
3599impl<'a> From<&'a vks::core::VkPhysicalDeviceLimits> for PhysicalDeviceLimits {
3600 fn from(limits: &'a vks::core::VkPhysicalDeviceLimits) -> Self {
3601 PhysicalDeviceLimits {
3602 max_image_dimension_1d: limits.maxImageDimension1D,
3603 max_image_dimension_2d: limits.maxImageDimension2D,
3604 max_image_dimension_3d: limits.maxImageDimension3D,
3605 max_image_dimension_cube: limits.maxImageDimensionCube,
3606 max_image_array_layers: limits.maxImageArrayLayers,
3607 max_texel_buffer_elements: limits.maxTexelBufferElements,
3608 max_uniform_buffer_range: limits.maxUniformBufferRange,
3609 max_storage_buffer_range: limits.maxStorageBufferRange,
3610 max_push_constants_size: limits.maxPushConstantsSize,
3611 max_memory_allocation_count: limits.maxMemoryAllocationCount,
3612 max_sampler_allocation_count: limits.maxSamplerAllocationCount,
3613 buffer_image_granularity: limits.bufferImageGranularity,
3614 sparse_address_space_size: limits.sparseAddressSpaceSize,
3615 max_bound_descriptor_sets: limits.maxBoundDescriptorSets,
3616 max_per_stage_descriptor_samplers: limits.maxPerStageDescriptorSamplers,
3617 max_per_stage_descriptor_uniform_buffers: limits.maxPerStageDescriptorUniformBuffers,
3618 max_per_stage_descriptor_storage_buffers: limits.maxPerStageDescriptorStorageBuffers,
3619 max_per_stage_descriptor_sampled_images: limits.maxPerStageDescriptorSampledImages,
3620 max_per_stage_descriptor_storage_images: limits.maxPerStageDescriptorStorageImages,
3621 max_per_stage_descriptor_input_attachments: limits.maxPerStageDescriptorInputAttachments,
3622 max_per_stage_resources: limits.maxPerStageResources,
3623 max_descriptor_set_samplers: limits.maxDescriptorSetSamplers,
3624 max_descriptor_set_uniform_buffers: limits.maxDescriptorSetUniformBuffers,
3625 max_descriptor_set_uniform_buffers_dynamic: limits.maxDescriptorSetUniformBuffersDynamic,
3626 max_descriptor_set_storage_buffers: limits.maxDescriptorSetStorageBuffers,
3627 max_descriptor_set_storage_buffers_dynamic: limits.maxDescriptorSetStorageBuffersDynamic,
3628 max_descriptor_set_sampled_images: limits.maxDescriptorSetSampledImages,
3629 max_descriptor_set_storage_images: limits.maxDescriptorSetStorageImages,
3630 max_descriptor_set_input_attachments: limits.maxDescriptorSetInputAttachments,
3631 max_vertex_input_attributes: limits.maxVertexInputAttributes,
3632 max_vertex_input_bindings: limits.maxVertexInputBindings,
3633 max_vertex_input_attribute_offset: limits.maxVertexInputAttributeOffset,
3634 max_vertex_input_binding_stride: limits.maxVertexInputBindingStride,
3635 max_vertex_output_components: limits.maxVertexOutputComponents,
3636 max_tessellation_generation_level: limits.maxTessellationGenerationLevel,
3637 max_tessellation_patch_size: limits.maxTessellationPatchSize,
3638 max_tessellation_control_per_vertex_input_components: limits.maxTessellationControlPerVertexInputComponents,
3639 max_tessellation_control_per_vertex_output_components: limits.maxTessellationControlPerVertexOutputComponents,
3640 max_tessellation_control_per_patch_output_components: limits.maxTessellationControlPerPatchOutputComponents,
3641 max_tessellation_control_total_output_components: limits.maxTessellationControlTotalOutputComponents,
3642 max_tessellation_evaluation_input_components: limits.maxTessellationEvaluationInputComponents,
3643 max_tessellation_evaluation_output_components: limits.maxTessellationEvaluationOutputComponents,
3644 max_geometry_shader_invocations: limits.maxGeometryShaderInvocations,
3645 max_geometry_input_components: limits.maxGeometryInputComponents,
3646 max_geometry_output_components: limits.maxGeometryOutputComponents,
3647 max_geometry_output_vertices: limits.maxGeometryOutputVertices,
3648 max_geometry_total_output_components: limits.maxGeometryTotalOutputComponents,
3649 max_fragment_input_components: limits.maxFragmentInputComponents,
3650 max_fragment_output_attachments: limits.maxFragmentOutputAttachments,
3651 max_fragment_dual_src_attachments: limits.maxFragmentDualSrcAttachments,
3652 max_fragment_combined_output_resources: limits.maxFragmentCombinedOutputResources,
3653 max_compute_shared_memory_size: limits.maxComputeSharedMemorySize,
3654 max_compute_work_group_count: limits.maxComputeWorkGroupCount,
3655 max_compute_work_group_invocations: limits.maxComputeWorkGroupInvocations,
3656 max_compute_work_group_size: limits.maxComputeWorkGroupSize,
3657 sub_pixel_precision_bits: limits.subPixelPrecisionBits,
3658 sub_texel_precision_bits: limits.subTexelPrecisionBits,
3659 mipmap_precision_bits: limits.mipmapPrecisionBits,
3660 max_draw_indexed_index_value: limits.maxDrawIndexedIndexValue,
3661 max_draw_indirect_count: limits.maxDrawIndirectCount,
3662 max_sampler_lod_bias: limits.maxSamplerLodBias,
3663 max_sampler_anisotropy: limits.maxSamplerAnisotropy,
3664 max_viewports: limits.maxViewports,
3665 max_viewport_dimensions: limits.maxViewportDimensions,
3666 viewport_bounds_range: limits.viewportBoundsRange,
3667 viewport_sub_pixel_bits: limits.viewportSubPixelBits,
3668 min_memory_map_alignment: limits.minMemoryMapAlignment,
3669 min_texel_buffer_offset_alignment: limits.minTexelBufferOffsetAlignment,
3670 min_uniform_buffer_offset_alignment: limits.minUniformBufferOffsetAlignment,
3671 min_storage_buffer_offset_alignment: limits.minStorageBufferOffsetAlignment,
3672 min_texel_offset: limits.minTexelOffset,
3673 max_texel_offset: limits.maxTexelOffset,
3674 min_texel_gather_offset: limits.minTexelGatherOffset,
3675 max_texel_gather_offset: limits.maxTexelGatherOffset,
3676 min_interpolation_offset: limits.minInterpolationOffset,
3677 max_interpolation_offset: limits.maxInterpolationOffset,
3678 sub_pixel_interpolation_offset_bits: limits.subPixelInterpolationOffsetBits,
3679 max_framebuffer_width: limits.maxFramebufferWidth,
3680 max_framebuffer_height: limits.maxFramebufferHeight,
3681 max_framebuffer_layers: limits.maxFramebufferLayers,
3682 framebuffer_color_sample_counts: SampleCountFlags::from_bits_truncate(limits.framebufferColorSampleCounts),
3683 framebuffer_depth_sample_counts: SampleCountFlags::from_bits_truncate(limits.framebufferDepthSampleCounts),
3684 framebuffer_stencil_sample_counts: SampleCountFlags::from_bits_truncate(limits.framebufferStencilSampleCounts),
3685 framebuffer_no_attachments_sample_counts: SampleCountFlags::from_bits_truncate(limits.framebufferNoAttachmentsSampleCounts),
3686 max_color_attachments: limits.maxColorAttachments,
3687 sampled_image_color_sample_counts: SampleCountFlags::from_bits_truncate(limits.sampledImageColorSampleCounts),
3688 sampled_image_integer_sample_counts: SampleCountFlags::from_bits_truncate(limits.sampledImageIntegerSampleCounts),
3689 sampled_image_depth_sample_counts: SampleCountFlags::from_bits_truncate(limits.sampledImageDepthSampleCounts),
3690 sampled_image_stencil_sample_counts: SampleCountFlags::from_bits_truncate(limits.sampledImageStencilSampleCounts),
3691 storage_image_sample_counts: SampleCountFlags::from_bits_truncate(limits.storageImageSampleCounts),
3692 max_sample_mask_words: limits.maxSampleMaskWords,
3693 timestamp_compute_and_graphics: utils::from_vk_bool(limits.timestampComputeAndGraphics),
3694 timestamp_period: limits.timestampPeriod,
3695 max_clip_distances: limits.maxClipDistances,
3696 max_cull_distances: limits.maxCullDistances,
3697 max_combined_clip_and_cull_distances: limits.maxCombinedClipAndCullDistances,
3698 discrete_queue_priorities: limits.discreteQueuePriorities,
3699 point_size_range: limits.pointSizeRange,
3700 line_width_range: limits.lineWidthRange,
3701 point_size_granularity: limits.pointSizeGranularity,
3702 line_width_granularity: limits.lineWidthGranularity,
3703 strict_lines: utils::from_vk_bool(limits.strictLines),
3704 standard_sample_locations: utils::from_vk_bool(limits.standardSampleLocations),
3705 optimal_buffer_copy_offset_alignment: limits.optimalBufferCopyOffsetAlignment,
3706 optimal_buffer_copy_row_pitch_alignment: limits.optimalBufferCopyRowPitchAlignment,
3707 non_coherent_atom_size: limits.nonCoherentAtomSize,
3708 }
3709 }
3710}
3711
3712impl<'a> From<&'a PhysicalDeviceLimits> for vks::core::VkPhysicalDeviceLimits {
3713 fn from(limits: &'a PhysicalDeviceLimits) -> Self {
3714 vks::core::VkPhysicalDeviceLimits {
3715 maxImageDimension1D: limits.max_image_dimension_1d,
3716 maxImageDimension2D: limits.max_image_dimension_2d,
3717 maxImageDimension3D: limits.max_image_dimension_3d,
3718 maxImageDimensionCube: limits.max_image_dimension_cube,
3719 maxImageArrayLayers: limits.max_image_array_layers,
3720 maxTexelBufferElements: limits.max_texel_buffer_elements,
3721 maxUniformBufferRange: limits.max_uniform_buffer_range,
3722 maxStorageBufferRange: limits.max_storage_buffer_range,
3723 maxPushConstantsSize: limits.max_push_constants_size,
3724 maxMemoryAllocationCount: limits.max_memory_allocation_count,
3725 maxSamplerAllocationCount: limits.max_sampler_allocation_count,
3726 bufferImageGranularity: limits.buffer_image_granularity,
3727 sparseAddressSpaceSize: limits.sparse_address_space_size,
3728 maxBoundDescriptorSets: limits.max_bound_descriptor_sets,
3729 maxPerStageDescriptorSamplers: limits.max_per_stage_descriptor_samplers,
3730 maxPerStageDescriptorUniformBuffers: limits.max_per_stage_descriptor_uniform_buffers,
3731 maxPerStageDescriptorStorageBuffers: limits.max_per_stage_descriptor_storage_buffers,
3732 maxPerStageDescriptorSampledImages: limits.max_per_stage_descriptor_sampled_images,
3733 maxPerStageDescriptorStorageImages: limits.max_per_stage_descriptor_storage_images,
3734 maxPerStageDescriptorInputAttachments: limits.max_per_stage_descriptor_input_attachments,
3735 maxPerStageResources: limits.max_per_stage_resources,
3736 maxDescriptorSetSamplers: limits.max_descriptor_set_samplers,
3737 maxDescriptorSetUniformBuffers: limits.max_descriptor_set_uniform_buffers,
3738 maxDescriptorSetUniformBuffersDynamic: limits.max_descriptor_set_uniform_buffers_dynamic,
3739 maxDescriptorSetStorageBuffers: limits.max_descriptor_set_storage_buffers,
3740 maxDescriptorSetStorageBuffersDynamic: limits.max_descriptor_set_storage_buffers_dynamic,
3741 maxDescriptorSetSampledImages: limits.max_descriptor_set_sampled_images,
3742 maxDescriptorSetStorageImages: limits.max_descriptor_set_storage_images,
3743 maxDescriptorSetInputAttachments: limits.max_descriptor_set_input_attachments,
3744 maxVertexInputAttributes: limits.max_vertex_input_attributes,
3745 maxVertexInputBindings: limits.max_vertex_input_bindings,
3746 maxVertexInputAttributeOffset: limits.max_vertex_input_attribute_offset,
3747 maxVertexInputBindingStride: limits.max_vertex_input_binding_stride,
3748 maxVertexOutputComponents: limits.max_vertex_output_components,
3749 maxTessellationGenerationLevel: limits.max_tessellation_generation_level,
3750 maxTessellationPatchSize: limits.max_tessellation_patch_size,
3751 maxTessellationControlPerVertexInputComponents: limits.max_tessellation_control_per_vertex_input_components,
3752 maxTessellationControlPerVertexOutputComponents: limits.max_tessellation_control_per_vertex_output_components,
3753 maxTessellationControlPerPatchOutputComponents: limits.max_tessellation_control_per_patch_output_components,
3754 maxTessellationControlTotalOutputComponents: limits.max_tessellation_control_total_output_components,
3755 maxTessellationEvaluationInputComponents: limits.max_tessellation_evaluation_input_components,
3756 maxTessellationEvaluationOutputComponents: limits.max_tessellation_evaluation_output_components,
3757 maxGeometryShaderInvocations: limits.max_geometry_shader_invocations,
3758 maxGeometryInputComponents: limits.max_geometry_input_components,
3759 maxGeometryOutputComponents: limits.max_geometry_output_components,
3760 maxGeometryOutputVertices: limits.max_geometry_output_vertices,
3761 maxGeometryTotalOutputComponents: limits.max_geometry_total_output_components,
3762 maxFragmentInputComponents: limits.max_fragment_input_components,
3763 maxFragmentOutputAttachments: limits.max_fragment_output_attachments,
3764 maxFragmentDualSrcAttachments: limits.max_fragment_dual_src_attachments,
3765 maxFragmentCombinedOutputResources: limits.max_fragment_combined_output_resources,
3766 maxComputeSharedMemorySize: limits.max_compute_shared_memory_size,
3767 maxComputeWorkGroupCount: limits.max_compute_work_group_count,
3768 maxComputeWorkGroupInvocations: limits.max_compute_work_group_invocations,
3769 maxComputeWorkGroupSize: limits.max_compute_work_group_size,
3770 subPixelPrecisionBits: limits.sub_pixel_precision_bits,
3771 subTexelPrecisionBits: limits.sub_texel_precision_bits,
3772 mipmapPrecisionBits: limits.mipmap_precision_bits,
3773 maxDrawIndexedIndexValue: limits.max_draw_indexed_index_value,
3774 maxDrawIndirectCount: limits.max_draw_indirect_count,
3775 maxSamplerLodBias: limits.max_sampler_lod_bias,
3776 maxSamplerAnisotropy: limits.max_sampler_anisotropy,
3777 maxViewports: limits.max_viewports,
3778 maxViewportDimensions: limits.max_viewport_dimensions,
3779 viewportBoundsRange: limits.viewport_bounds_range,
3780 viewportSubPixelBits: limits.viewport_sub_pixel_bits,
3781 minMemoryMapAlignment: limits.min_memory_map_alignment,
3782 minTexelBufferOffsetAlignment: limits.min_texel_buffer_offset_alignment,
3783 minUniformBufferOffsetAlignment: limits.min_uniform_buffer_offset_alignment,
3784 minStorageBufferOffsetAlignment: limits.min_storage_buffer_offset_alignment,
3785 minTexelOffset: limits.min_texel_offset,
3786 maxTexelOffset: limits.max_texel_offset,
3787 minTexelGatherOffset: limits.min_texel_gather_offset,
3788 maxTexelGatherOffset: limits.max_texel_gather_offset,
3789 minInterpolationOffset: limits.min_interpolation_offset,
3790 maxInterpolationOffset: limits.max_interpolation_offset,
3791 subPixelInterpolationOffsetBits: limits.sub_pixel_interpolation_offset_bits,
3792 maxFramebufferWidth: limits.max_framebuffer_width,
3793 maxFramebufferHeight: limits.max_framebuffer_height,
3794 maxFramebufferLayers: limits.max_framebuffer_layers,
3795 framebufferColorSampleCounts: limits.framebuffer_color_sample_counts.bits(),
3796 framebufferDepthSampleCounts: limits.framebuffer_depth_sample_counts.bits(),
3797 framebufferStencilSampleCounts: limits.framebuffer_stencil_sample_counts.bits(),
3798 framebufferNoAttachmentsSampleCounts: limits.framebuffer_no_attachments_sample_counts.bits(),
3799 maxColorAttachments: limits.max_color_attachments,
3800 sampledImageColorSampleCounts: limits.sampled_image_color_sample_counts.bits(),
3801 sampledImageIntegerSampleCounts: limits.sampled_image_integer_sample_counts.bits(),
3802 sampledImageDepthSampleCounts: limits.sampled_image_depth_sample_counts.bits(),
3803 sampledImageStencilSampleCounts: limits.sampled_image_stencil_sample_counts.bits(),
3804 storageImageSampleCounts: limits.storage_image_sample_counts.bits(),
3805 maxSampleMaskWords: limits.max_sample_mask_words,
3806 timestampComputeAndGraphics: utils::to_vk_bool(limits.timestamp_compute_and_graphics),
3807 timestampPeriod: limits.timestamp_period,
3808 maxClipDistances: limits.max_clip_distances,
3809 maxCullDistances: limits.max_cull_distances,
3810 maxCombinedClipAndCullDistances: limits.max_combined_clip_and_cull_distances,
3811 discreteQueuePriorities: limits.discrete_queue_priorities,
3812 pointSizeRange: limits.point_size_range,
3813 lineWidthRange: limits.line_width_range,
3814 pointSizeGranularity: limits.point_size_granularity,
3815 lineWidthGranularity: limits.line_width_granularity,
3816 strictLines: utils::to_vk_bool(limits.strict_lines),
3817 standardSampleLocations: utils::to_vk_bool(limits.standard_sample_locations),
3818 optimalBufferCopyOffsetAlignment: limits.optimal_buffer_copy_offset_alignment,
3819 optimalBufferCopyRowPitchAlignment: limits.optimal_buffer_copy_row_pitch_alignment,
3820 nonCoherentAtomSize: limits.non_coherent_atom_size,
3821 }
3822 }
3823}
3824
3825#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3827pub struct PhysicalDeviceSparseProperties {
3828 pub residency_standard_2d_block_shape: bool,
3829 pub residency_standard_2d_multisample_block_shape: bool,
3830 pub residency_standard_3d_block_shape: bool,
3831 pub residency_aligned_mip_size: bool,
3832 pub residency_non_resident_strict: bool,
3833}
3834
3835impl<'a> From<&'a vks::core::VkPhysicalDeviceSparseProperties> for PhysicalDeviceSparseProperties {
3836 fn from(properties: &'a vks::core::VkPhysicalDeviceSparseProperties) -> Self {
3837 PhysicalDeviceSparseProperties {
3838 residency_standard_2d_block_shape: utils::from_vk_bool(properties.residencyStandard2DBlockShape),
3839 residency_standard_2d_multisample_block_shape: utils::from_vk_bool(properties.residencyStandard2DMultisampleBlockShape),
3840 residency_standard_3d_block_shape: utils::from_vk_bool(properties.residencyStandard3DBlockShape),
3841 residency_aligned_mip_size: utils::from_vk_bool(properties.residencyAlignedMipSize),
3842 residency_non_resident_strict: utils::from_vk_bool(properties.residencyNonResidentStrict),
3843 }
3844 }
3845}
3846
3847impl<'a> From<&'a PhysicalDeviceSparseProperties> for vks::core::VkPhysicalDeviceSparseProperties {
3848 fn from(properties: &'a PhysicalDeviceSparseProperties) -> Self {
3849 vks::core::VkPhysicalDeviceSparseProperties {
3850 residencyStandard2DBlockShape: utils::to_vk_bool(properties.residency_standard_2d_block_shape),
3851 residencyStandard2DMultisampleBlockShape: utils::to_vk_bool(properties.residency_standard_2d_multisample_block_shape),
3852 residencyStandard3DBlockShape: utils::to_vk_bool(properties.residency_standard_3d_block_shape),
3853 residencyAlignedMipSize: utils::to_vk_bool(properties.residency_aligned_mip_size),
3854 residencyNonResidentStrict: utils::to_vk_bool(properties.residency_non_resident_strict),
3855 }
3856 }
3857}
3858
3859#[derive(Debug, Clone, PartialEq)]
3861pub struct PhysicalDeviceProperties {
3862 pub api_version: Version,
3863 pub driver_version: u32,
3864 pub vendor_id: u32,
3865 pub device_id: u32,
3866 pub device_type: PhysicalDeviceType,
3867 pub device_name: String,
3868 pub pipeline_cache_uuid: [u8; 16],
3869 pub limits: PhysicalDeviceLimits,
3870 pub sparse_properties: PhysicalDeviceSparseProperties,
3871}
3872
3873impl<'a> From<&'a vks::core::VkPhysicalDeviceProperties> for PhysicalDeviceProperties {
3874 fn from(properties: &'a vks::core::VkPhysicalDeviceProperties) -> Self {
3875 let device_name = unsafe {
3876 CStr::from_ptr(properties.deviceName.as_ptr()).to_str().unwrap().to_owned()
3877 };
3878
3879 PhysicalDeviceProperties {
3880 api_version: Version::from_api_version(properties.apiVersion),
3881 driver_version: properties.driverVersion,
3882 vendor_id: properties.vendorID,
3883 device_id: properties.deviceID,
3884 device_type: properties.deviceType.into(),
3885 device_name: device_name,
3886 pipeline_cache_uuid: properties.pipelineCacheUUID,
3887 limits: (&properties.limits).into(),
3888 sparse_properties: (&properties.sparseProperties).into(),
3889 }
3890 }
3891}
3892
3893impl<'a> From<&'a PhysicalDeviceProperties> for vks::core::VkPhysicalDeviceProperties {
3894 fn from(properties: &'a PhysicalDeviceProperties) -> Self {
3895 debug_assert!(properties.device_name.len() < vks::core::VK_MAX_PHYSICAL_DEVICE_NAME_SIZE);
3896
3897 let device_name = unsafe {
3898 let mut device_name: [c_char; vks::core::VK_MAX_PHYSICAL_DEVICE_NAME_SIZE] = mem::uninitialized();
3899 ptr::copy_nonoverlapping(properties.device_name.as_ptr(), device_name.as_mut_ptr() as *mut _, properties.device_name.len());
3900 device_name[properties.device_name.len()] = 0;
3901 device_name
3902 };
3903
3904 vks::core::VkPhysicalDeviceProperties {
3905 apiVersion: properties.api_version.as_api_version(),
3906 driverVersion: properties.driver_version,
3907 vendorID: properties.vendor_id,
3908 deviceID: properties.device_id,
3909 deviceType: properties.device_type.into(),
3910 deviceName: device_name,
3911 pipelineCacheUUID: properties.pipeline_cache_uuid,
3912 limits: (&properties.limits).into(),
3913 sparseProperties: (&properties.sparse_properties).into(),
3914 }
3915 }
3916}
3917
3918#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3920pub struct QueueFamilyProperties {
3921 pub queue_flags: QueueFlags,
3922 pub queue_count: u32,
3923 pub timestamp_valid_bits: u32,
3924 pub min_image_transfer_granularity: Extent3D,
3925}
3926
3927impl<'a> From<&'a vks::core::VkQueueFamilyProperties> for QueueFamilyProperties {
3928 fn from(properties: &'a vks::core::VkQueueFamilyProperties) -> Self {
3929 QueueFamilyProperties {
3930 queue_flags: QueueFlags::from_bits_truncate(properties.queueFlags),
3931 queue_count: properties.queueCount,
3932 timestamp_valid_bits: properties.timestampValidBits,
3933 min_image_transfer_granularity: (&properties.minImageTransferGranularity).into(),
3934 }
3935 }
3936}
3937
3938impl<'a> From<&'a QueueFamilyProperties> for vks::core::VkQueueFamilyProperties {
3939 fn from(properties: &'a QueueFamilyProperties) -> Self {
3940 vks::core::VkQueueFamilyProperties {
3941 queueFlags: properties.queue_flags.bits(),
3942 queueCount: properties.queue_count,
3943 timestampValidBits: properties.timestamp_valid_bits,
3944 minImageTransferGranularity: (&properties.min_image_transfer_granularity).into(),
3945 }
3946 }
3947}
3948
3949#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3951pub struct MemoryType {
3952 pub property_flags: MemoryPropertyFlags,
3953 pub heap_index: u32,
3954}
3955
3956impl<'a> From<&'a vks::core::VkMemoryType> for MemoryType {
3957 fn from(memory_type: &'a vks::core::VkMemoryType) -> Self {
3958 MemoryType {
3959 property_flags: MemoryPropertyFlags::from_bits_truncate(memory_type.propertyFlags),
3960 heap_index: memory_type.heapIndex,
3961 }
3962 }
3963}
3964
3965impl<'a> From<&'a MemoryType> for vks::core::VkMemoryType {
3966 fn from(memory_type: &'a MemoryType) -> Self {
3967 vks::core::VkMemoryType {
3968 propertyFlags: memory_type.property_flags.bits(),
3969 heapIndex: memory_type.heap_index,
3970 }
3971 }
3972}
3973
3974#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
3976pub struct MemoryHeap {
3977 pub size: u64,
3978 pub flags: MemoryHeapFlags,
3979}
3980
3981impl<'a> From<&'a vks::core::VkMemoryHeap> for MemoryHeap {
3982 fn from(heap: &'a vks::core::VkMemoryHeap) -> Self {
3983 MemoryHeap {
3984 size: heap.size,
3985 flags: MemoryHeapFlags::from_bits_truncate(heap.flags),
3986 }
3987 }
3988}
3989
3990impl<'a> From<&'a MemoryHeap> for vks::core::VkMemoryHeap {
3991 fn from(heap: &'a MemoryHeap) -> Self {
3992 vks::core::VkMemoryHeap {
3993 size: heap.size,
3994 flags: heap.flags.bits(),
3995 }
3996 }
3997}
3998
3999#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4001pub struct PhysicalDeviceMemoryProperties {
4002 pub memory_types: Vec<MemoryType>,
4003 pub memory_heaps: Vec<MemoryHeap>,
4004}
4005
4006impl<'a> From<&'a vks::core::VkPhysicalDeviceMemoryProperties> for PhysicalDeviceMemoryProperties {
4007 fn from(properties: &'a vks::core::VkPhysicalDeviceMemoryProperties) -> Self {
4008 let memory_types = properties.memoryTypes[..properties.memoryTypeCount as usize]
4009 .iter()
4010 .map(From::from)
4011 .collect();
4012
4013 let memory_heaps = properties.memoryHeaps[..properties.memoryHeapCount as usize]
4014 .iter()
4015 .map(From::from)
4016 .collect();
4017
4018 PhysicalDeviceMemoryProperties {
4019 memory_types: memory_types,
4020 memory_heaps: memory_heaps,
4021 }
4022 }
4023}
4024
4025impl<'a> From<&'a PhysicalDeviceMemoryProperties> for vks::core::VkPhysicalDeviceMemoryProperties {
4026 fn from(properties: &'a PhysicalDeviceMemoryProperties) -> Self {
4027 debug_assert!(properties.memory_types.len() <= vks::core::VK_MAX_MEMORY_TYPES);
4028 debug_assert!(properties.memory_heaps.len() <= vks::core::VK_MAX_MEMORY_HEAPS);
4029
4030 let mut res = vks::core::VkPhysicalDeviceMemoryProperties {
4031 memoryTypeCount: properties.memory_types.len() as u32,
4032 memoryTypes: unsafe { mem::uninitialized() },
4033 memoryHeapCount: properties.memory_heaps.len() as u32,
4034 memoryHeaps: unsafe { mem::uninitialized() },
4035 };
4036
4037 for (vk_memory_type, memory_type) in res.memoryTypes.iter_mut().zip(&properties.memory_types) {
4038 *vk_memory_type = memory_type.into();
4039 }
4040
4041 for (vk_memory_heap, memory_heap) in res.memoryHeaps.iter_mut().zip(&properties.memory_heaps) {
4042 *vk_memory_heap = memory_heap.into();
4043 }
4044
4045 res
4046 }
4047}
4048
4049gen_chain_struct! {
4050 name: DeviceQueueCreateInfoChain [DeviceQueueCreateInfoChainWrapper],
4051 query: DeviceQueueCreateInfoChainQuery [DeviceQueueCreateInfoChainQueryWrapper],
4052 vks: vks::core::VkDeviceQueueCreateInfo,
4053 input: true,
4054 output: false,
4055}
4056
4057#[derive(Debug, Clone, PartialEq)]
4059pub struct DeviceQueueCreateInfo {
4060 pub flags: DeviceQueueCreateFlags,
4061 pub queue_family_index: u32,
4062 pub queue_priorities: Vec<f32>,
4063 pub chain: Option<DeviceQueueCreateInfoChain>,
4064}
4065
4066#[derive(Debug)]
4067struct VkDeviceQueueCreateInfoWrapper {
4068 pub vks_struct: vks::core::VkDeviceQueueCreateInfo,
4069 queue_priorities: Vec<f32>,
4070 chain: Option<DeviceQueueCreateInfoChainWrapper>,
4071}
4072
4073impl VkDeviceQueueCreateInfoWrapper {
4074 pub fn new(create_info: &DeviceQueueCreateInfo, with_chain: bool) -> Self {
4075 let queue_priorities = create_info.queue_priorities.clone();
4076 let (pnext, chain) = DeviceQueueCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
4077
4078 VkDeviceQueueCreateInfoWrapper {
4079 vks_struct: vks::core::VkDeviceQueueCreateInfo {
4080 sType: vks::core::VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
4081 pNext: pnext,
4082 flags: create_info.flags.bits(),
4083 queueFamilyIndex: create_info.queue_family_index,
4084 queueCount: queue_priorities.len() as u32,
4085 pQueuePriorities: queue_priorities.as_ptr(),
4086 },
4087 queue_priorities: queue_priorities,
4088 chain: chain,
4089 }
4090 }
4091}
4092
4093gen_chain_struct! {
4094 name: DeviceCreateInfoChain [DeviceCreateInfoChainWrapper],
4095 query: DeviceCreateInfoChainQuery [DeviceCreateInfoChainQueryWrapper],
4096 vks: vks::core::VkDeviceCreateInfo,
4097 input: true,
4098 output: false,
4099
4100 physical_device_features2_khr: khr_get_physical_device_properties2::PhysicalDeviceFeatures2Khr {
4101 fn_add: add_physical_device_features2_khr,
4102 fn_has: has_physical_device_features2_khr,
4103 fn_get: get_physical_device_features2_khr,
4104 wrapper: khr_get_physical_device_properties2::VkPhysicalDeviceFeatures2KHRWrapper,
4105 vks: vks::khr_get_physical_device_properties2::VkPhysicalDeviceFeatures2KHR,
4106 stype: vks::core::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,
4107 }
4108}
4109
4110#[derive(Debug, Clone, PartialEq)]
4112pub struct DeviceCreateInfo {
4113 pub flags: DeviceCreateFlags,
4114 pub queue_create_infos: Vec<DeviceQueueCreateInfo>,
4115 pub enabled_layers: Vec<String>,
4116 pub enabled_extensions: DeviceExtensions,
4117 pub enabled_features: Option<PhysicalDeviceFeatures>,
4118 pub chain: Option<DeviceCreateInfoChain>,
4119}
4120
4121#[derive(Debug)]
4122struct VkDeviceCreateInfoWrapper {
4123 pub vks_struct: vks::core::VkDeviceCreateInfo,
4124 queue_create_infos_wrappers: Vec<VkDeviceQueueCreateInfoWrapper>,
4125 queue_create_infos: Vec<vks::core::VkDeviceQueueCreateInfo>,
4126 enabled_layers: Vec<CString>,
4127 enabled_layers_ptrs: Vec<*const c_char>,
4128 enabled_extensions: Vec<CString>,
4129 enabled_extensions_ptrs: Vec<*const c_char>,
4130 enabled_features: Option<Box<vks::core::VkPhysicalDeviceFeatures>>,
4131 chain: Option<DeviceCreateInfoChainWrapper>,
4132}
4133
4134impl VkDeviceCreateInfoWrapper {
4135 pub fn new(create_info: &DeviceCreateInfo, with_chain: bool) -> Self {
4136 let queue_create_infos_wrappers: Vec<_> = create_info.queue_create_infos
4137 .iter()
4138 .map(|q| VkDeviceQueueCreateInfoWrapper::new(q, true))
4139 .collect();
4140
4141 let queue_create_infos: Vec<vks::core::VkDeviceQueueCreateInfo> = queue_create_infos_wrappers
4142 .iter()
4143 .map(|q| q.vks_struct)
4144 .collect();
4145
4146 let enabled_layers: Vec<_> = create_info.enabled_layers
4147 .iter()
4148 .cloned()
4149 .map(CString::new)
4150 .map(Result::unwrap)
4151 .collect();
4152 let enabled_layers_ptrs: Vec<_> = enabled_layers
4153 .iter()
4154 .map(|l| l.as_ptr())
4155 .collect();
4156 let enabled_layers_ptr = if !enabled_layers_ptrs.is_empty() {
4157 enabled_layers_ptrs.as_ptr()
4158 }
4159 else {
4160 ptr::null()
4161 };
4162
4163 let enabled_extensions = create_info.enabled_extensions.to_cstring_vec();
4164 let enabled_extensions_ptrs: Vec<_> = enabled_extensions
4165 .iter()
4166 .map(|l| l.as_ptr())
4167 .collect();
4168 let enabled_extensions_ptr = if !enabled_extensions_ptrs.is_empty() {
4169 enabled_extensions_ptrs.as_ptr()
4170 }
4171 else {
4172 ptr::null()
4173 };
4174
4175 let enabled_features_ptr;
4176 let enabled_features = match create_info.enabled_features {
4177 Some(ref enabled_features) => {
4178 let enabled_features: Box<vks::core::VkPhysicalDeviceFeatures> = Box::new(enabled_features.into());
4179 enabled_features_ptr = &*enabled_features as *const _;
4180 Some(enabled_features)
4181 }
4182
4183 None => {
4184 enabled_features_ptr = ptr::null();
4185 None
4186 }
4187 };
4188
4189 let (pnext, chain) = DeviceCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
4190
4191 VkDeviceCreateInfoWrapper {
4192 vks_struct: vks::core::VkDeviceCreateInfo {
4193 sType: vks::core::VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
4194 pNext: pnext,
4195 flags: create_info.flags.bits(),
4196 queueCreateInfoCount: queue_create_infos.len() as u32,
4197 pQueueCreateInfos: queue_create_infos.as_ptr(),
4198 enabledLayerCount: enabled_layers.len() as u32,
4199 ppEnabledLayerNames: enabled_layers_ptr,
4200 enabledExtensionCount: enabled_extensions.len() as u32,
4201 ppEnabledExtensionNames: enabled_extensions_ptr,
4202 pEnabledFeatures: enabled_features_ptr,
4203 },
4204 queue_create_infos_wrappers: queue_create_infos_wrappers,
4205 queue_create_infos: queue_create_infos,
4206 enabled_layers: enabled_layers,
4207 enabled_layers_ptrs: enabled_layers_ptrs,
4208 enabled_extensions: enabled_extensions,
4209 enabled_extensions_ptrs: enabled_extensions_ptrs,
4210 enabled_features: enabled_features,
4211 chain: chain,
4212 }
4213 }
4214}
4215
4216gen_extension_structs!{
4217 pub struct InstanceExtensions;
4218 pub struct InstanceExtensionsProperties;
4219
4220 ext_debug_report {
4221 name: vks::ext_debug_report::VK_EXT_DEBUG_REPORT_EXTENSION_NAME_STR,
4222 fn_add: add_ext_debug_report,
4223 fn_has: has_ext_debug_report,
4224 fn_get: get_ext_debug_report,
4225 load_instance: load_ext_debug_report,
4226 }
4227
4228 ext_validation_flags {
4229 name: vks::ext_validation_flags::VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME_STR,
4230 fn_add: add_ext_validation_flags,
4231 fn_has: has_ext_validation_flags,
4232 fn_get: get_ext_validation_flags,
4233 }
4234
4235 khr_android_surface {
4236 name: vks::khr_android_surface::VK_KHR_ANDROID_SURFACE_EXTENSION_NAME_STR,
4237 fn_add: add_khr_android_surface,
4238 fn_has: has_khr_android_surface,
4239 fn_get: get_khr_android_surface,
4240 load_instance: load_khr_android_surface,
4241 }
4242
4243 khr_display {
4244 name: vks::khr_display::VK_KHR_DISPLAY_EXTENSION_NAME_STR,
4245 fn_add: add_khr_display,
4246 fn_has: has_khr_display,
4247 fn_get: get_khr_display,
4248 load_instance: load_khr_display,
4249 }
4250
4251 khr_get_physical_device_properties2 {
4252 name: vks::khr_get_physical_device_properties2::VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME_STR,
4253 fn_add: add_khr_get_physical_device_properties2,
4254 fn_has: has_khr_get_physical_device_properties2,
4255 fn_get: get_khr_get_physical_device_properties2,
4256 load_instance: load_khr_get_physical_device_properties2,
4257 }
4258
4259 khr_mir_surface {
4260 name: vks::khr_mir_surface::VK_KHR_MIR_SURFACE_EXTENSION_NAME_STR,
4261 fn_add: add_khr_mir_surface,
4262 fn_has: has_khr_mir_surface,
4263 fn_get: get_khr_mir_surface,
4264 load_instance: load_khr_mir_surface,
4265 }
4266
4267 khr_surface {
4268 name: vks::khr_surface::VK_KHR_SURFACE_EXTENSION_NAME_STR,
4269 fn_add: add_khr_surface,
4270 fn_has: has_khr_surface,
4271 fn_get: get_khr_surface,
4272 load_instance: load_khr_surface,
4273 }
4274
4275 khr_wayland_surface {
4276 name: vks::khr_wayland_surface::VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME_STR,
4277 fn_add: add_khr_wayland_surface,
4278 fn_has: has_khr_wayland_surface,
4279 fn_get: get_khr_wayland_surface,
4280 load_instance: load_khr_wayland_surface,
4281 }
4282
4283 khr_win32_surface {
4284 name: vks::khr_win32_surface::VK_KHR_WIN32_SURFACE_EXTENSION_NAME_STR,
4285 fn_add: add_khr_win32_surface,
4286 fn_has: has_khr_win32_surface,
4287 fn_get: get_khr_win32_surface,
4288 load_instance: load_khr_win32_surface,
4289 }
4290
4291 khr_xcb_surface {
4292 name: vks::khr_xcb_surface::VK_KHR_XCB_SURFACE_EXTENSION_NAME_STR,
4293 fn_add: add_khr_xcb_surface,
4294 fn_has: has_khr_xcb_surface,
4295 fn_get: get_khr_xcb_surface,
4296 load_instance: load_khr_xcb_surface,
4297 }
4298
4299 khr_xlib_surface {
4300 name: vks::khr_xlib_surface::VK_KHR_XLIB_SURFACE_EXTENSION_NAME_STR,
4301 fn_add: add_khr_xlib_surface,
4302 fn_has: has_khr_xlib_surface,
4303 fn_get: get_khr_xlib_surface,
4304 load_instance: load_khr_xlib_surface,
4305 }
4306
4307 nv_external_memory_capabilities {
4308 name: vks::nv_external_memory_capabilities::VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME_STR,
4309 fn_add: add_nv_external_memory_capabilities,
4310 fn_has: has_nv_external_memory_capabilities,
4311 fn_get: get_nv_external_memory_capabilities,
4312 load_instance: load_nv_external_memory_capabilities,
4313 }
4314}
4315
4316gen_extension_structs!{
4317 pub struct DeviceExtensions;
4318 pub struct DeviceExtensionsProperties;
4319
4320 amd_draw_indirect_count {
4321 name: vks::amd_draw_indirect_count::VK_AMD_DRAW_INDIRECT_COUNT_EXTENSION_NAME_STR,
4322 fn_add: add_amd_draw_indirect_count,
4323 fn_has: has_amd_draw_indirect_count,
4324 fn_get: get_amd_draw_indirect_count,
4325 load_device: load_amd_draw_indirect_count,
4326 }
4327
4328 amd_gcn_shader {
4329 name: vks::amd_gcn_shader::VK_AMD_GCN_SHADER_EXTENSION_NAME_STR,
4330 fn_add: add_amd_gcn_shader,
4331 fn_has: has_amd_gcn_shader,
4332 fn_get: get_amd_gcn_shader,
4333 }
4334
4335 amd_gpu_shader_half_float {
4336 name: vks::amd_gpu_shader_half_float::VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME_STR,
4337 fn_add: add_amd_gpu_shader_half_float,
4338 fn_has: has_amd_gpu_shader_half_float,
4339 fn_get: get_amd_gpu_shader_half_float,
4340 }
4341
4342 amd_rasterization_order {
4343 name: vks::amd_rasterization_order::VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME_STR,
4344 fn_add: add_amd_rasterization_order,
4345 fn_has: has_amd_rasterization_order,
4346 fn_get: get_amd_rasterization_order,
4347 }
4348
4349 amd_shader_explicit_vertex_parameter {
4350 name: vks::amd_shader_explicit_vertex_parameter::VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME_STR,
4351 fn_add: add_amd_shader_explicit_vertex_parameter,
4352 fn_has: has_amd_shader_explicit_vertex_parameter,
4353 fn_get: get_amd_shader_explicit_vertex_parameter,
4354 }
4355
4356 amd_shader_trinary_minmax {
4357 name: vks::amd_shader_trinary_minmax::VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME_STR,
4358 fn_add: add_amd_shader_trinary_minmax,
4359 fn_has: has_amd_shader_trinary_minmax,
4360 fn_get: get_amd_shader_trinary_minmax,
4361 }
4362
4363 ext_debug_marker {
4364 name: vks::ext_debug_marker::VK_EXT_DEBUG_MARKER_EXTENSION_NAME_STR,
4365 fn_add: add_ext_debug_marker,
4366 fn_has: has_ext_debug_marker,
4367 fn_get: get_ext_debug_marker,
4368 load_device: load_ext_debug_marker,
4369 }
4370
4371 img_filter_cubic {
4372 name: vks::img_filter_cubic::VK_IMG_FILTER_CUBIC_EXTENSION_NAME_STR,
4373 fn_add: add_img_filter_cubic,
4374 fn_has: has_img_filter_cubic,
4375 fn_get: get_img_filter_cubic,
4376 }
4377
4378 img_format_pvrtc {
4379 name: vks::img_format_pvrtc::VK_IMG_FORMAT_PVRTC_EXTENSION_NAME_STR,
4380 fn_add: add_img_format_pvrtc,
4381 fn_has: has_img_format_pvrtc,
4382 fn_get: get_img_format_pvrtc,
4383 }
4384
4385 khr_swapchain {
4386 name: vks::khr_swapchain::VK_KHR_SWAPCHAIN_EXTENSION_NAME_STR,
4387 fn_add: add_khr_swapchain,
4388 fn_has: has_khr_swapchain,
4389 fn_get: get_khr_swapchain,
4390 load_device: load_khr_swapchain,
4391 }
4392
4393 khr_display_swapchain {
4394 name: vks::khr_display_swapchain::VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME_STR,
4395 fn_add: add_khr_display_swapchain,
4396 fn_has: has_khr_display_swapchain,
4397 fn_get: get_khr_display_swapchain,
4398 load_device: load_khr_display_swapchain,
4399 }
4400
4401 khr_sampler_mirror_clamp_to_edge {
4402 name: vks::khr_sampler_mirror_clamp_to_edge::VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME_STR,
4403 fn_add: add_khr_sampler_mirror_clamp_to_edge,
4404 fn_has: has_khr_sampler_mirror_clamp_to_edge,
4405 fn_get: get_khr_sampler_mirror_clamp_to_edge,
4406 }
4407
4408 nv_dedicated_allocation {
4409 name: vks::nv_dedicated_allocation::VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME_STR,
4410 fn_add: add_nv_dedicated_allocation,
4411 fn_has: has_nv_dedicated_allocation,
4412 fn_get: get_nv_dedicated_allocation,
4413 }
4414
4415 nv_external_memory {
4416 name: vks::nv_external_memory::VK_NV_EXTERNAL_MEMORY_EXTENSION_NAME_STR,
4417 fn_add: add_nv_external_memory,
4418 fn_has: has_nv_external_memory,
4419 fn_get: get_nv_external_memory,
4420 }
4421
4422 nv_external_memory_win32 {
4423 name: vks::nv_external_memory_win32::VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME_STR,
4424 fn_add: add_nv_external_memory_win32,
4425 fn_has: has_nv_external_memory_win32,
4426 fn_get: get_nv_external_memory_win32,
4427 load_device: load_nv_external_memory_win32,
4428 }
4429
4430 nv_glsl_shader {
4431 name: vks::nv_glsl_shader::VK_NV_GLSL_SHADER_EXTENSION_NAME_STR,
4432 fn_add: add_nv_glsl_shader,
4433 fn_has: has_nv_glsl_shader,
4434 fn_get: get_nv_glsl_shader,
4435 }
4436
4437 nv_win32_keyed_mutex {
4438 name: vks::nv_win32_keyed_mutex::VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME_STR,
4439 fn_add: add_nv_win32_keyed_mutex,
4440 fn_has: has_nv_win32_keyed_mutex,
4441 fn_get: get_nv_win32_keyed_mutex,
4442 }
4443}
4444
4445#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4447pub struct LayerProperties {
4448 pub layer_name: String,
4449 pub spec_version: Version,
4450 pub implementation_version: u32,
4451 pub description: String,
4452}
4453
4454impl<'a> From<&'a vks::core::VkLayerProperties> for LayerProperties {
4455 fn from(layer_properties: &'a vks::core::VkLayerProperties) -> Self {
4456 unsafe {
4457 LayerProperties {
4458 layer_name: CStr::from_ptr(layer_properties.layerName.as_ptr()).to_str().unwrap().to_owned(),
4459 spec_version: Version::from_api_version(layer_properties.specVersion),
4460 implementation_version: layer_properties.implementationVersion,
4461 description: CStr::from_ptr(layer_properties.description.as_ptr()).to_str().unwrap().to_owned(),
4462 }
4463 }
4464 }
4465}
4466
4467gen_chain_struct! {
4468 name: SubmitInfoChain [SubmitInfoChainWrapper],
4469 query: SubmitInfoChainQuery [SubmitInfoChainQueryWrapper],
4470 vks: vks::core::VkSubmitInfo,
4471 input: true,
4472 output: false,
4473
4474 win32_keyed_mutex_acquire_release_info_nv: nv_win32_keyed_mutex::Win32KeyedMutexAcquireReleaseInfoNv {
4475 fn_add: add_win32_keyed_mutex_acquire_release_info_nv,
4476 fn_has: has_win32_keyed_mutex_acquire_release_info_nv,
4477 fn_get: get_win32_keyed_mutex_acquire_release_info_nv,
4478 wrapper: nv_win32_keyed_mutex::VkWin32KeyedMutexAcquireReleaseInfoNVWrapper,
4479 vks: vks::nv_win32_keyed_mutex::VkWin32KeyedMutexAcquireReleaseInfoNV,
4480 stype: vks::core::VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV,
4481 }
4482}
4483
4484#[derive(Debug, Clone, PartialEq)]
4486pub struct SubmitInfo {
4487 pub wait_semaphores: Vec<Semaphore>,
4488 pub wait_dst_stage_mask: Vec<PipelineStageFlags>,
4489 pub command_buffers: Vec<CommandBuffer>,
4490 pub signal_semaphores: Vec<Semaphore>,
4491 pub chain: Option<SubmitInfoChain>,
4492}
4493
4494#[derive(Debug)]
4495struct VkSubmitInfoWrapper {
4496 pub vks_struct: vks::core::VkSubmitInfo,
4497 wait_semaphores: Vec<Semaphore>,
4498 wait_vk_semaphores: Vec<vks::core::VkSemaphore>,
4499 wait_dst_stage_mask: Vec<vks::core::VkPipelineStageFlags>,
4500 command_buffers: Vec<CommandBuffer>,
4501 vk_command_buffers: Vec<vks::core::VkCommandBuffer>,
4502 signal_semaphores: Vec<Semaphore>,
4503 signal_vk_semaphores: Vec<vks::core::VkSemaphore>,
4504 chain: Option<SubmitInfoChainWrapper>,
4505}
4506
4507impl VkSubmitInfoWrapper {
4508 pub fn new(info: &SubmitInfo, with_chain: bool) -> Self {
4509 let wait_semaphores = info.wait_semaphores.clone();
4510 let (wait_vk_semaphores_ptr, wait_vk_semaphores) = if !wait_semaphores.is_empty() {
4511 let wait_vk_semaphores: Vec<_> = wait_semaphores.iter().map(Semaphore::handle).collect();
4512 (wait_vk_semaphores.as_ptr(), wait_vk_semaphores)
4513 }
4514 else {
4515 (ptr::null(), vec![])
4516 };
4517
4518 let wait_dst_stage_mask: Vec<_> = info.wait_dst_stage_mask.iter().map(PipelineStageFlags::bits).collect();
4519
4520 let command_buffers = info.command_buffers.clone();
4521 let (vk_command_buffers_ptr, vk_command_buffers) = if !command_buffers.is_empty() {
4522 let vk_command_buffers: Vec<_> = command_buffers.iter().map(CommandBuffer::handle).collect();
4523 (vk_command_buffers.as_ptr(), vk_command_buffers)
4524 }
4525 else {
4526 (ptr::null(), vec![])
4527 };
4528
4529 let signal_semaphores = info.signal_semaphores.clone();
4530 let (signal_vk_semaphores_ptr, signal_vk_semaphores) = if !signal_semaphores.is_empty() {
4531 let signal_vk_semaphores: Vec<_> = signal_semaphores.iter().map(Semaphore::handle).collect();
4532 (signal_vk_semaphores.as_ptr(), signal_vk_semaphores)
4533 }
4534 else {
4535 (ptr::null(), vec![])
4536 };
4537
4538 let (pnext, chain) = SubmitInfoChainWrapper::new_optional(&info.chain, with_chain);
4539
4540 VkSubmitInfoWrapper {
4541 vks_struct: vks::core::VkSubmitInfo {
4542 sType: vks::core::VK_STRUCTURE_TYPE_SUBMIT_INFO,
4543 pNext: pnext,
4544 waitSemaphoreCount: wait_semaphores.len() as u32,
4545 pWaitSemaphores: wait_vk_semaphores_ptr,
4546 pWaitDstStageMask: wait_dst_stage_mask.as_ptr(),
4547 commandBufferCount: command_buffers.len() as u32,
4548 pCommandBuffers: vk_command_buffers_ptr,
4549 signalSemaphoreCount: signal_semaphores.len() as u32,
4550 pSignalSemaphores: signal_vk_semaphores_ptr,
4551 },
4552 wait_semaphores: wait_semaphores,
4553 wait_vk_semaphores: wait_vk_semaphores,
4554 wait_dst_stage_mask: wait_dst_stage_mask,
4555 command_buffers: command_buffers,
4556 vk_command_buffers: vk_command_buffers,
4557 signal_semaphores: signal_semaphores,
4558 signal_vk_semaphores: signal_vk_semaphores,
4559 chain: chain,
4560 }
4561 }
4562}
4563
4564gen_chain_struct! {
4565 name: MemoryAllocateInfoChain [MemoryAllocateInfoChainWrapper],
4566 query: MemoryAllocateInfoChainQuery [MemoryAllocateInfoChainQueryWrapper],
4567 vks: vks::core::VkMemoryAllocateInfo,
4568 input: true,
4569 output: false,
4570
4571 dedicated_allocation_memory_allocate_info_nv: nv_dedicated_allocation::DedicatedAllocationMemoryAllocateInfoNv {
4572 fn_add: add_dedicated_allocation_memory_allocate_info_nv,
4573 fn_has: has_dedicated_allocation_memory_allocate_info_nv,
4574 fn_get: get_dedicated_allocation_memory_allocate_info_nv,
4575 wrapper: nv_dedicated_allocation::VkDedicatedAllocationMemoryAllocateInfoNVWrapper,
4576 vks: vks::nv_dedicated_allocation::VkDedicatedAllocationMemoryAllocateInfoNV,
4577 stype: vks::core::VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV,
4578 }
4579
4580 export_memory_allocate_info_nv: nv_external_memory::ExportMemoryAllocateInfoNv {
4581 fn_add: add_export_memory_allocate_info_nv,
4582 fn_has: has_export_memory_allocate_info_nv,
4583 fn_get: get_export_memory_allocate_info_nv,
4584 wrapper: nv_external_memory::VkExportMemoryAllocateInfoNVWrapper,
4585 vks: vks::nv_external_memory::VkExportMemoryAllocateInfoNV,
4586 stype: vks::core::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV,
4587 }
4588
4589 import_memory_win32_handle_info_nv: nv_external_memory_win32::ImportMemoryWin32HandleInfoNv {
4590 fn_add: add_import_memory_win32_handle_info_nv,
4591 fn_has: has_import_memory_win32_handle_info_nv,
4592 fn_get: get_import_memory_win32_handle_info_nv,
4593 wrapper: nv_external_memory_win32::VkImportMemoryWin32HandleInfoNVWrapper,
4594 vks: vks::nv_external_memory_win32::VkImportMemoryWin32HandleInfoNV,
4595 stype: vks::core::VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV,
4596 }
4597
4598 export_memory_win32_handle_info_nv: nv_external_memory_win32::ExportMemoryWin32HandleInfoNv {
4599 fn_add: add_export_memory_win32_handle_info_nv,
4600 fn_has: has_export_memory_win32_handle_info_nv,
4601 fn_get: get_export_memory_win32_handle_info_nv,
4602 wrapper: nv_external_memory_win32::VkExportMemoryWin32HandleInfoNVWrapper,
4603 vks: vks::nv_external_memory_win32::VkExportMemoryWin32HandleInfoNV,
4604 stype: vks::core::VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV,
4605 }
4606}
4607
4608#[derive(Debug, Clone, PartialEq)]
4610pub struct MemoryAllocateInfo {
4611 pub allocation_size: u64,
4612 pub memory_type_index: u32,
4613 pub chain: Option<MemoryAllocateInfoChain>,
4614}
4615
4616#[derive(Debug)]
4617struct VkMemoryAllocateInfoWrapper {
4618 pub vks_struct: vks::core::VkMemoryAllocateInfo,
4619 chain: Option<MemoryAllocateInfoChainWrapper>,
4620}
4621
4622impl VkMemoryAllocateInfoWrapper {
4623 pub fn new(info: &MemoryAllocateInfo, with_chain: bool) -> Self {
4624 let (pnext, chain) = MemoryAllocateInfoChainWrapper::new_optional(&info.chain, with_chain);
4625
4626 VkMemoryAllocateInfoWrapper {
4627 vks_struct: vks::core::VkMemoryAllocateInfo {
4628 sType: vks::core::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
4629 pNext: pnext,
4630 allocationSize: info.allocation_size,
4631 memoryTypeIndex: info.memory_type_index,
4632 },
4633 chain: chain,
4634 }
4635 }
4636}
4637
4638gen_chain_struct! {
4639 name: MappedMemoryRangeChain [MappedMemoryRangeChainWrapper],
4640 query: MappedMemoryRangeChainQuery [MappedMemoryRangeChainQueryWrapper],
4641 vks: vks::core::VkMappedMemoryRange,
4642 input: true,
4643 output: false,
4644}
4645
4646#[derive(Debug, Clone, PartialEq)]
4648pub struct MappedMemoryRange {
4649 pub memory: DeviceMemory,
4650 pub offset: u64,
4651 pub size: OptionalDeviceSize,
4652 pub chain: Option<MappedMemoryRangeChain>,
4653}
4654
4655#[derive(Debug)]
4656struct VkMappedMemoryRangeWrapper {
4657 pub vks_struct: vks::core::VkMappedMemoryRange,
4658 memory: DeviceMemory,
4659 chain: Option<MappedMemoryRangeChainWrapper>,
4660}
4661
4662impl VkMappedMemoryRangeWrapper {
4663 pub fn new(range: &MappedMemoryRange, with_chain: bool) -> Self {
4664 let (pnext, chain) = MappedMemoryRangeChainWrapper::new_optional(&range.chain, with_chain);
4665
4666 VkMappedMemoryRangeWrapper {
4667 vks_struct: vks::core::VkMappedMemoryRange {
4668 sType: vks::core::VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
4669 pNext: pnext,
4670 memory: range.memory.handle(),
4671 offset: range.offset,
4672 size: range.size.into(),
4673 },
4674 memory: range.memory.clone(),
4675 chain: chain,
4676 }
4677 }
4678}
4679
4680#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
4682pub struct MemoryRequirements {
4683 pub size: u64,
4684 pub alignment: u64,
4685 pub memory_type_bits: u32,
4686}
4687
4688impl<'a> From<&'a vks::core::VkMemoryRequirements> for MemoryRequirements {
4689 fn from(requirements: &'a vks::core::VkMemoryRequirements) -> Self {
4690 MemoryRequirements {
4691 size: requirements.size,
4692 alignment: requirements.alignment,
4693 memory_type_bits: requirements.memoryTypeBits,
4694 }
4695 }
4696}
4697
4698impl<'a> From<&'a MemoryRequirements> for vks::core::VkMemoryRequirements {
4699 fn from(requirements: &'a MemoryRequirements) -> Self {
4700 vks::core::VkMemoryRequirements {
4701 size: requirements.size,
4702 alignment: requirements.alignment,
4703 memoryTypeBits: requirements.memory_type_bits,
4704 }
4705 }
4706}
4707
4708#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
4710pub struct SparseImageFormatProperties {
4711 pub aspect_mask: ImageAspectFlags,
4712 pub image_granularity: Extent3D,
4713 pub flags: SparseImageFormatFlags,
4714}
4715
4716impl<'a> From<&'a vks::core::VkSparseImageFormatProperties> for SparseImageFormatProperties {
4717 fn from(properties: &'a vks::core::VkSparseImageFormatProperties) -> Self {
4718 SparseImageFormatProperties {
4719 aspect_mask: ImageAspectFlags::from_bits_truncate(properties.aspectMask),
4720 image_granularity: (&properties.imageGranularity).into(),
4721 flags: SparseImageFormatFlags::from_bits_truncate(properties.flags),
4722 }
4723 }
4724}
4725
4726#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
4728pub struct SparseImageMemoryRequirements {
4729 pub format_properties: SparseImageFormatProperties,
4730 pub image_mip_tail_first_lod: u32,
4731 pub image_mip_tail_size: u64,
4732 pub image_mip_tail_offset: u64,
4733 pub image_mip_tail_stride: u64,
4734}
4735
4736impl<'a> From<&'a vks::core::VkSparseImageMemoryRequirements> for SparseImageMemoryRequirements {
4737 fn from(requirements: &'a vks::core::VkSparseImageMemoryRequirements) -> Self {
4738 SparseImageMemoryRequirements {
4739 format_properties: (&requirements.formatProperties).into(),
4740 image_mip_tail_first_lod: requirements.imageMipTailFirstLod,
4741 image_mip_tail_size: requirements.imageMipTailSize,
4742 image_mip_tail_offset: requirements.imageMipTailOffset,
4743 image_mip_tail_stride: requirements.imageMipTailStride,
4744 }
4745 }
4746}
4747
4748#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4750pub struct SparseMemoryBind {
4751 pub resource_offset: u64,
4752 pub size: u64,
4753 pub memory: Option<DeviceMemory>,
4754 pub memory_offset: u64,
4755 pub flags: SparseMemoryBindFlags,
4756}
4757
4758#[derive(Debug)]
4759struct VkSparseMemoryBindWrapper {
4760 pub vks_struct: vks::core::VkSparseMemoryBind,
4761 memory: Option<DeviceMemory>,
4762}
4763
4764impl<'a> From<&'a SparseMemoryBind> for VkSparseMemoryBindWrapper {
4765 fn from(bind: &'a SparseMemoryBind) -> Self {
4766 let (vk_memory, memory) = match bind.memory {
4767 Some(ref memory) => (memory.handle(), Some(memory.clone())),
4768 None => (Default::default(), None),
4769 };
4770
4771 VkSparseMemoryBindWrapper {
4772 vks_struct: vks::core::VkSparseMemoryBind {
4773 resourceOffset: bind.resource_offset,
4774 size: bind.size,
4775 memory: vk_memory,
4776 memoryOffset: bind.memory_offset,
4777 flags: bind.flags.bits(),
4778 },
4779 memory: memory,
4780 }
4781 }
4782}
4783
4784#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4786pub struct SparseBufferMemoryBindInfo {
4787 pub buffer: Buffer,
4788 pub binds: Vec<SparseMemoryBind>,
4789}
4790
4791#[derive(Debug)]
4792struct VkSparseBufferMemoryBindInfoWrapper {
4793 pub vks_struct: vks::core::VkSparseBufferMemoryBindInfo,
4794 buffer: Buffer,
4795 binds: Vec<VkSparseMemoryBindWrapper>,
4796 binds_vk: Vec<vks::core::VkSparseMemoryBind>,
4797}
4798
4799impl<'a> From<&'a SparseBufferMemoryBindInfo> for VkSparseBufferMemoryBindInfoWrapper {
4800 fn from(info: &'a SparseBufferMemoryBindInfo) -> Self {
4801 let binds: Vec<VkSparseMemoryBindWrapper> = info.binds.iter().map(From::from).collect();
4802 let binds_vk: Vec<_> = binds.iter().map(|b| b.vks_struct).collect();
4803
4804 VkSparseBufferMemoryBindInfoWrapper {
4805 vks_struct: vks::core::VkSparseBufferMemoryBindInfo {
4806 buffer: info.buffer.handle(),
4807 bindCount: binds.len() as u32,
4808 pBinds: binds_vk.as_ptr(),
4809 },
4810 buffer: info.buffer.clone(),
4811 binds: binds,
4812 binds_vk: binds_vk,
4813 }
4814 }
4815}
4816
4817#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4819pub struct SparseImageOpaqueMemoryBindInfo {
4820 pub image: Image,
4821 pub binds: Vec<SparseMemoryBind>,
4822}
4823
4824#[derive(Debug)]
4825struct VkSparseImageOpaqueMemoryBindInfoWrapper {
4826 pub vks_struct: vks::core::VkSparseImageOpaqueMemoryBindInfo,
4827 image: Image,
4828 binds: Vec<VkSparseMemoryBindWrapper>,
4829 binds_vk: Vec<vks::core::VkSparseMemoryBind>,
4830}
4831
4832impl<'a> From<&'a SparseImageOpaqueMemoryBindInfo> for VkSparseImageOpaqueMemoryBindInfoWrapper {
4833 fn from(info: &'a SparseImageOpaqueMemoryBindInfo) -> Self {
4834 let binds: Vec<VkSparseMemoryBindWrapper> = info.binds.iter().map(From::from).collect();
4835 let binds_vk: Vec<_> = binds.iter().map(|b| b.vks_struct).collect();
4836
4837 VkSparseImageOpaqueMemoryBindInfoWrapper {
4838 vks_struct: vks::core::VkSparseImageOpaqueMemoryBindInfo {
4839 image: info.image.handle(),
4840 bindCount: binds.len() as u32,
4841 pBinds: binds_vk.as_ptr(),
4842 },
4843 image: info.image.clone(),
4844 binds: binds,
4845 binds_vk: binds_vk,
4846 }
4847 }
4848}
4849
4850#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
4852pub struct ImageSubresource {
4853 pub aspect_mask: ImageAspectFlags,
4854 pub mip_level: u32,
4855 pub array_layer: u32,
4856}
4857
4858impl<'a> From<&'a ImageSubresource> for vks::core::VkImageSubresource {
4859 fn from(subresource: &'a ImageSubresource) -> Self {
4860 vks::core::VkImageSubresource {
4861 aspectMask: subresource.aspect_mask.bits(),
4862 mipLevel: subresource.mip_level,
4863 arrayLayer: subresource.array_layer,
4864 }
4865 }
4866}
4867
4868#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
4870pub struct Offset3D {
4871 pub x: i32,
4872 pub y: i32,
4873 pub z: i32,
4874}
4875
4876impl<'a> From<&'a Offset3D> for vks::core::VkOffset3D {
4877 fn from(offset: &'a Offset3D) -> Self {
4878 vks::core::VkOffset3D {
4879 x: offset.x,
4880 y: offset.y,
4881 z: offset.z,
4882 }
4883 }
4884}
4885
4886impl Offset3D {
4887 #[inline]
4889 pub fn new(x: i32, y: i32, z: i32) -> Self {
4890 Offset3D {
4891 x: x,
4892 y: y,
4893 z: z,
4894 }
4895 }
4896
4897 #[inline]
4899 pub fn zero() -> Self {
4900 Offset3D {
4901 x: 0,
4902 y: 0,
4903 z: 0,
4904 }
4905 }
4906
4907 #[inline]
4909 pub fn from_2d(offset: &Offset2D, z: i32) -> Self {
4910 Offset3D {
4911 x: offset.x,
4912 y: offset.y,
4913 z: z,
4914 }
4915 }
4916}
4917
4918#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4920pub struct SparseImageMemoryBind {
4921 pub subresource: ImageSubresource,
4922 pub offset: Offset3D,
4923 pub extent: Extent3D,
4924 pub memory: Option<DeviceMemory>,
4925 pub memory_offset: u64,
4926 pub flags: SparseMemoryBindFlags,
4927}
4928
4929#[derive(Debug)]
4930struct VkSparseImageMemoryBindWrapper {
4931 pub vks_struct: vks::core::VkSparseImageMemoryBind,
4932 memory: Option<DeviceMemory>,
4933}
4934
4935impl<'a> From<&'a SparseImageMemoryBind> for VkSparseImageMemoryBindWrapper {
4936 fn from(bind: &'a SparseImageMemoryBind) -> Self {
4937 let (vk_memory, memory) = match bind.memory {
4938 Some(ref memory) => (memory.handle(), Some(memory.clone())),
4939 None => (Default::default(), None),
4940 };
4941
4942 VkSparseImageMemoryBindWrapper {
4943 vks_struct: vks::core::VkSparseImageMemoryBind {
4944 subresource: (&bind.subresource).into(),
4945 offset: (&bind.offset).into(),
4946 extent: (&bind.extent).into(),
4947 memory: vk_memory,
4948 memoryOffset: bind.memory_offset,
4949 flags: bind.flags.bits(),
4950 },
4951 memory: memory,
4952 }
4953 }
4954}
4955
4956#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4958pub struct SparseImageMemoryBindInfo {
4959 pub image: Image,
4960 pub binds: Vec<SparseImageMemoryBind>,
4961}
4962
4963#[derive(Debug)]
4964struct VkSparseImageMemoryBindInfoWrapper {
4965 pub vks_struct: vks::core::VkSparseImageMemoryBindInfo,
4966 image: Image,
4967 binds: Vec<VkSparseImageMemoryBindWrapper>,
4968 binds_vk: Vec<vks::core::VkSparseImageMemoryBind>,
4969}
4970
4971impl<'a> From<&'a SparseImageMemoryBindInfo> for VkSparseImageMemoryBindInfoWrapper {
4972 fn from(info: &'a SparseImageMemoryBindInfo) -> Self {
4973 let binds: Vec<VkSparseImageMemoryBindWrapper> = info.binds.iter().map(From::from).collect();
4974 let binds_vk: Vec<_> = binds.iter().map(|b| b.vks_struct).collect();
4975
4976 VkSparseImageMemoryBindInfoWrapper {
4977 vks_struct: vks::core::VkSparseImageMemoryBindInfo {
4978 image: info.image.handle(),
4979 bindCount: binds.len() as u32,
4980 pBinds: binds_vk.as_ptr(),
4981 },
4982 image: info.image.clone(),
4983 binds: binds,
4984 binds_vk: binds_vk,
4985 }
4986 }
4987}
4988
4989gen_chain_struct! {
4990 name: BindSparseInfoChain [BindSparseInfoChainWrapper],
4991 query: BindSparseInfoChainQuery [BindSparseInfoChainQueryWrapper],
4992 vks: vks::core::VkBindSparseInfo,
4993 input: true,
4994 output: false,
4995}
4996
4997#[derive(Debug, Clone, PartialEq)]
4999pub struct BindSparseInfo {
5000 pub wait_semaphores: Vec<Semaphore>,
5001 pub buffer_binds: Vec<SparseBufferMemoryBindInfo>,
5002 pub image_opaque_binds: Vec<SparseImageOpaqueMemoryBindInfo>,
5003 pub image_binds: Vec<SparseImageMemoryBindInfo>,
5004 pub signal_semaphores: Vec<Semaphore>,
5005 pub chain: Option<BindSparseInfoChain>,
5006}
5007
5008#[derive(Debug)]
5009struct VkBindSparseInfoWrapper {
5010 pub vks_struct: vks::core::VkBindSparseInfo,
5011 wait_semaphores: Vec<Semaphore>,
5012 wait_vk_semaphores: Vec<vks::core::VkSemaphore>,
5013 buffer_binds: Vec<VkSparseBufferMemoryBindInfoWrapper>,
5014 vk_buffer_binds: Vec<vks::core::VkSparseBufferMemoryBindInfo>,
5015 image_opaque_binds: Vec<VkSparseImageOpaqueMemoryBindInfoWrapper>,
5016 vk_image_opaque_binds: Vec<vks::core::VkSparseImageOpaqueMemoryBindInfo>,
5017 image_binds: Vec<VkSparseImageMemoryBindInfoWrapper>,
5018 vk_image_binds: Vec<vks::core::VkSparseImageMemoryBindInfo>,
5019 signal_semaphores: Vec<Semaphore>,
5020 signal_vk_semaphores: Vec<vks::core::VkSemaphore>,
5021 chain: Option<BindSparseInfoChainWrapper>,
5022}
5023
5024impl VkBindSparseInfoWrapper {
5025 pub fn new(info: &BindSparseInfo, with_chain: bool) -> Self {
5026 let wait_semaphores = info.wait_semaphores.clone();
5027 let (wait_vk_semaphores_ptr, wait_vk_semaphores) = if !wait_semaphores.is_empty() {
5028 let wait_vk_semaphores: Vec<_> = wait_semaphores.iter().map(Semaphore::handle).collect();
5029 (wait_vk_semaphores.as_ptr(), wait_vk_semaphores)
5030 }
5031 else {
5032 (ptr::null(), vec![])
5033 };
5034
5035 let buffer_binds: Vec<VkSparseBufferMemoryBindInfoWrapper> = info.buffer_binds.iter().map(From::from).collect();
5036 let (vk_buffer_binds_ptr, vk_buffer_binds) = if !buffer_binds.is_empty() {
5037 let vk_buffer_binds: Vec<_> = buffer_binds.iter().map(|b| b.vks_struct).collect();
5038 (vk_buffer_binds.as_ptr(), vk_buffer_binds)
5039 }
5040 else {
5041 (ptr::null(), vec![])
5042 };
5043
5044 let image_opaque_binds: Vec<VkSparseImageOpaqueMemoryBindInfoWrapper> = info.image_opaque_binds.iter().map(From::from).collect();
5045 let (vk_image_opaque_binds_ptr, vk_image_opaque_binds) = if !image_opaque_binds.is_empty() {
5046 let vk_image_opaque_binds: Vec<_> = image_opaque_binds.iter().map(|i| i.vks_struct).collect();
5047 (vk_image_opaque_binds.as_ptr(), vk_image_opaque_binds)
5048 }
5049 else {
5050 (ptr::null(), vec![])
5051 };
5052
5053 let image_binds: Vec<VkSparseImageMemoryBindInfoWrapper> = info.image_binds.iter().map(From::from).collect();
5054 let (vk_image_binds_ptr, vk_image_binds) = if !image_binds.is_empty() {
5055 let vk_image_binds: Vec<_> = image_binds.iter().map(|i| i.vks_struct).collect();
5056 (vk_image_binds.as_ptr(), vk_image_binds)
5057 }
5058 else {
5059 (ptr::null(), vec![])
5060 };
5061
5062 let signal_semaphores = info.signal_semaphores.clone();
5063 let (signal_vk_semaphores_ptr, signal_vk_semaphores) = if !signal_semaphores.is_empty() {
5064 let signal_vk_semaphores: Vec<_> = signal_semaphores.iter().map(Semaphore::handle).collect();
5065 (signal_vk_semaphores.as_ptr(), signal_vk_semaphores)
5066 }
5067 else {
5068 (ptr::null(), vec![])
5069 };
5070
5071 let (pnext, chain) = BindSparseInfoChainWrapper::new_optional(&info.chain, with_chain);
5072
5073 VkBindSparseInfoWrapper {
5074 vks_struct: vks::core::VkBindSparseInfo {
5075 sType: vks::core::VK_STRUCTURE_TYPE_BIND_SPARSE_INFO,
5076 pNext: pnext,
5077 waitSemaphoreCount: wait_semaphores.len() as u32,
5078 pWaitSemaphores: wait_vk_semaphores_ptr,
5079 bufferBindCount: buffer_binds.len() as u32,
5080 pBufferBinds: vk_buffer_binds_ptr,
5081 imageOpaqueBindCount: image_opaque_binds.len() as u32,
5082 pImageOpaqueBinds: vk_image_opaque_binds_ptr,
5083 imageBindCount: image_binds.len() as u32,
5084 pImageBinds: vk_image_binds_ptr,
5085 signalSemaphoreCount: signal_semaphores.len() as u32,
5086 pSignalSemaphores: signal_vk_semaphores_ptr,
5087 },
5088 wait_semaphores: wait_semaphores,
5089 wait_vk_semaphores: wait_vk_semaphores,
5090 buffer_binds: buffer_binds,
5091 vk_buffer_binds: vk_buffer_binds,
5092 image_opaque_binds: image_opaque_binds,
5093 vk_image_opaque_binds: vk_image_opaque_binds,
5094 image_binds: image_binds,
5095 vk_image_binds: vk_image_binds,
5096 signal_semaphores: signal_semaphores,
5097 signal_vk_semaphores: signal_vk_semaphores,
5098 chain: chain,
5099 }
5100 }
5101}
5102
5103gen_chain_struct! {
5104 name: FenceCreateInfoChain [FenceCreateInfoChainWrapper],
5105 query: FenceCreateInfoChainQuery [FenceCreateInfoChainQueryWrapper],
5106 vks: vks::core::VkFenceCreateInfo,
5107 input: true,
5108 output: false,
5109}
5110
5111#[derive(Debug, Clone, PartialEq)]
5113pub struct FenceCreateInfo {
5114 pub flags: FenceCreateFlags,
5115 pub chain: Option<FenceCreateInfoChain>,
5116}
5117
5118#[derive(Debug)]
5119struct VkFenceCreateInfoWrapper {
5120 pub vks_struct: vks::core::VkFenceCreateInfo,
5121 chain: Option<FenceCreateInfoChainWrapper>,
5122}
5123
5124impl VkFenceCreateInfoWrapper {
5125 pub fn new(create_info: &FenceCreateInfo, with_chain: bool) -> Self {
5126 let (pnext, chain) = FenceCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5127
5128 VkFenceCreateInfoWrapper {
5129 vks_struct: vks::core::VkFenceCreateInfo {
5130 sType: vks::core::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
5131 pNext: pnext,
5132 flags: create_info.flags.bits(),
5133 },
5134 chain: chain,
5135 }
5136 }
5137}
5138
5139gen_chain_struct! {
5140 name: SemaphoreCreateInfoChain [SemaphoreCreateInfoChainWrapper],
5141 query: SemaphoreCreateInfoChainQuery [SemaphoreCreateInfoChainQueryWrapper],
5142 vks: vks::core::VkSemaphoreCreateInfo,
5143 input: true,
5144 output: false,
5145}
5146
5147#[derive(Debug, Clone, PartialEq)]
5149pub struct SemaphoreCreateInfo {
5150 pub flags: SemaphoreCreateFlags,
5151 pub chain: Option<SemaphoreCreateInfoChain>,
5152}
5153
5154#[derive(Debug)]
5155struct VkSemaphoreCreateInfoWrapper {
5156 pub vks_struct: vks::core::VkSemaphoreCreateInfo,
5157 chain: Option<SemaphoreCreateInfoChainWrapper>,
5158}
5159
5160impl VkSemaphoreCreateInfoWrapper {
5161 pub fn new(create_info: &SemaphoreCreateInfo, with_chain: bool) -> Self {
5162 let (pnext, chain) = SemaphoreCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5163
5164 VkSemaphoreCreateInfoWrapper {
5165 vks_struct: vks::core::VkSemaphoreCreateInfo {
5166 sType: vks::core::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
5167 pNext: pnext,
5168 flags: create_info.flags.bits(),
5169 },
5170 chain: chain,
5171 }
5172 }
5173}
5174
5175gen_chain_struct! {
5176 name: EventCreateInfoChain [EventCreateInfoChainWrapper],
5177 query: EventCreateInfoChainQuery [EventCreateInfoChainQueryWrapper],
5178 vks: vks::core::VkEventCreateInfo,
5179 input: true,
5180 output: false,
5181}
5182
5183#[derive(Debug, Clone, PartialEq)]
5185pub struct EventCreateInfo {
5186 pub flags: EventCreateFlags,
5187 pub chain: Option<EventCreateInfoChain>,
5188}
5189
5190#[derive(Debug)]
5191struct VkEventCreateInfoWrapper {
5192 pub vks_struct: vks::core::VkEventCreateInfo,
5193 chain: Option<EventCreateInfoChainWrapper>,
5194}
5195
5196impl VkEventCreateInfoWrapper {
5197 pub fn new(create_info: &EventCreateInfo, with_chain: bool) -> Self {
5198 let (pnext, chain) = EventCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5199
5200 VkEventCreateInfoWrapper {
5201 vks_struct: vks::core::VkEventCreateInfo {
5202 sType: vks::core::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
5203 pNext: pnext,
5204 flags: create_info.flags.bits(),
5205 },
5206 chain: chain,
5207 }
5208 }
5209}
5210
5211gen_chain_struct! {
5212 name: QueryPoolCreateInfoChain [QueryPoolCreateInfoChainWrapper],
5213 query: QueryPoolCreateInfoChainQuery [QueryPoolCreateInfoChainQueryWrapper],
5214 vks: vks::core::VkQueryPoolCreateInfo,
5215 input: true,
5216 output: false,
5217}
5218
5219#[derive(Debug, Clone, PartialEq)]
5221pub struct QueryPoolCreateInfo {
5222 pub flags: QueryPoolCreateFlags,
5223 pub query_type: QueryType,
5224 pub query_count: u32,
5225 pub pipeline_statistics: QueryPipelineStatisticFlags,
5226 pub chain: Option<QueryPoolCreateInfoChain>,
5227}
5228
5229#[derive(Debug)]
5230struct VkQueryPoolCreateInfoWrapper {
5231 pub vks_struct: vks::core::VkQueryPoolCreateInfo,
5232 chain: Option<QueryPoolCreateInfoChainWrapper>,
5233}
5234
5235impl VkQueryPoolCreateInfoWrapper {
5236 pub fn new(create_info: &QueryPoolCreateInfo, with_chain: bool) -> Self {
5237 let (pnext, chain) = QueryPoolCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5238
5239 VkQueryPoolCreateInfoWrapper {
5240 vks_struct: vks::core::VkQueryPoolCreateInfo {
5241 sType: vks::core::VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
5242 pNext: pnext,
5243 flags: create_info.flags.bits(),
5244 queryType: create_info.query_type.into(),
5245 queryCount: create_info.query_count,
5246 pipelineStatistics: create_info.pipeline_statistics.bits(),
5247 },
5248 chain: chain,
5249 }
5250 }
5251}
5252
5253gen_chain_struct! {
5254 name: BufferCreateInfoChain [BufferCreateInfoChainWrapper],
5255 query: BufferCreateInfoChainQuery [BufferCreateInfoChainQueryWrapper],
5256 vks: vks::core::VkBufferCreateInfo,
5257 input: true,
5258 output: false,
5259
5260 dedicated_allocation_buffer_create_info_nv: nv_dedicated_allocation::DedicatedAllocationBufferCreateInfoNv {
5261 fn_add: add_dedicated_allocation_buffer_create_info_nv,
5262 fn_has: has_dedicated_allocation_buffer_create_info_nv,
5263 fn_get: get_dedicated_allocation_buffer_create_info_nv,
5264 wrapper: nv_dedicated_allocation::VkDedicatedAllocationBufferCreateInfoNVWrapper,
5265 vks: vks::nv_dedicated_allocation::VkDedicatedAllocationBufferCreateInfoNV,
5266 stype: vks::core::VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV,
5267 }
5268}
5269
5270#[derive(Debug, Clone, PartialEq)]
5272pub struct BufferCreateInfo {
5273 pub flags: BufferCreateFlags,
5274 pub size: u64,
5275 pub usage: BufferUsageFlags,
5276 pub sharing_mode: SharingMode,
5277 pub queue_family_indices: Vec<u32>,
5278 pub chain: Option<BufferCreateInfoChain>,
5279}
5280
5281#[derive(Debug)]
5282struct VkBufferCreateInfoWrapper {
5283 pub vks_struct: vks::core::VkBufferCreateInfo,
5284 queue_family_indices: Vec<u32>,
5285 chain: Option<BufferCreateInfoChainWrapper>,
5286}
5287
5288impl VkBufferCreateInfoWrapper {
5289 pub fn new(create_info: &BufferCreateInfo, with_chain: bool) -> Self {
5290 let queue_family_indices = create_info.queue_family_indices.clone();
5291 let queue_family_indices_ptr = if !queue_family_indices.is_empty() {
5292 queue_family_indices.as_ptr()
5293 }
5294 else {
5295 ptr::null()
5296 };
5297
5298 let (pnext, chain) = BufferCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5299
5300 VkBufferCreateInfoWrapper {
5301 vks_struct: vks::core::VkBufferCreateInfo {
5302 sType: vks::core::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
5303 pNext: pnext,
5304 flags: create_info.flags.bits(),
5305 size: create_info.size,
5306 usage: create_info.usage.bits(),
5307 sharingMode: create_info.sharing_mode.into(),
5308 queueFamilyIndexCount: queue_family_indices.len() as u32,
5309 pQueueFamilyIndices: queue_family_indices_ptr,
5310 },
5311 queue_family_indices: queue_family_indices,
5312 chain: chain,
5313 }
5314 }
5315}
5316
5317gen_chain_struct! {
5318 name: BufferViewCreateInfoChain [BufferViewCreateInfoChainWrapper],
5319 query: BufferViewCreateInfoChainQuery [BufferViewCreateInfoChainQueryWrapper],
5320 vks: vks::core::VkBufferViewCreateInfo,
5321 input: true,
5322 output: false,
5323}
5324
5325#[derive(Debug, Clone, PartialEq)]
5327pub struct BufferViewCreateInfo {
5328 pub flags: BufferViewCreateFlags,
5329 pub buffer: Buffer,
5330 pub format: Format,
5331 pub offset: u64,
5332 pub range: OptionalDeviceSize,
5333 pub chain: Option<BufferViewCreateInfoChain>,
5334}
5335
5336#[derive(Debug)]
5337struct VkBufferViewCreateInfoWrapper {
5338 pub vks_struct: vks::core::VkBufferViewCreateInfo,
5339 buffer: Buffer,
5340 chain: Option<BufferViewCreateInfoChainWrapper>,
5341}
5342
5343impl VkBufferViewCreateInfoWrapper {
5344 pub fn new(create_info: &BufferViewCreateInfo, with_chain: bool) -> Self {
5345 let (pnext, chain) = BufferViewCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5346
5347 VkBufferViewCreateInfoWrapper {
5348 vks_struct: vks::core::VkBufferViewCreateInfo {
5349 sType: vks::core::VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,
5350 pNext: pnext,
5351 flags: create_info.flags.bits(),
5352 buffer: create_info.buffer.handle(),
5353 format: create_info.format.into(),
5354 offset: create_info.offset,
5355 range: create_info.range.into(),
5356 },
5357 buffer: create_info.buffer.clone(),
5358 chain: chain,
5359 }
5360 }
5361}
5362
5363gen_chain_struct! {
5364 name: ImageCreateInfoChain [ImageCreateInfoChainWrapper],
5365 query: ImageCreateInfoChainQuery [ImageCreateInfoChainQueryWrapper],
5366 vks: vks::core::VkImageCreateInfo,
5367 input: true,
5368 output: false,
5369
5370 dedicated_allocation_image_create_info_nv: nv_dedicated_allocation::DedicatedAllocationImageCreateInfoNv {
5371 fn_add: add_dedicated_allocation_image_create_info_nv,
5372 fn_has: has_dedicated_allocation_image_create_info_nv,
5373 fn_get: get_dedicated_allocation_image_create_info_nv,
5374 wrapper: nv_dedicated_allocation::VkDedicatedAllocationImageCreateInfoNVWrapper,
5375 vks: vks::nv_dedicated_allocation::VkDedicatedAllocationImageCreateInfoNV,
5376 stype: vks::core::VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV,
5377 }
5378
5379 external_memory_image_create_info_nv: nv_external_memory::ExternalMemoryImageCreateInfoNv {
5380 fn_add: add_external_memory_image_create_info_nv,
5381 fn_has: has_external_memory_image_create_info_nv,
5382 fn_get: get_external_memory_image_create_info_nv,
5383 wrapper: nv_external_memory::VkExternalMemoryImageCreateInfoNVWrapper,
5384 vks: vks::nv_external_memory::VkExternalMemoryImageCreateInfoNV,
5385 stype: vks::core::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV,
5386 }
5387}
5388
5389#[derive(Debug, Clone, PartialEq)]
5391pub struct ImageCreateInfo {
5392 pub flags: ImageCreateFlags,
5393 pub image_type: ImageType,
5394 pub format: Format,
5395 pub extent: Extent3D,
5396 pub mip_levels: u32,
5397 pub array_layers: u32,
5398 pub samples: SampleCountFlagBits,
5399 pub tiling: ImageTiling,
5400 pub usage: ImageUsageFlags,
5401 pub sharing_mode: SharingMode,
5402 pub queue_family_indices: Vec<u32>,
5403 pub initial_layout: ImageLayout,
5404 pub chain: Option<ImageCreateInfoChain>,
5405}
5406
5407#[derive(Debug)]
5408struct VkImageCreateInfoWrapper {
5409 pub vks_struct: vks::core::VkImageCreateInfo,
5410 queue_family_indices: Vec<u32>,
5411 chain: Option<ImageCreateInfoChainWrapper>,
5412}
5413
5414impl VkImageCreateInfoWrapper {
5415 pub fn new(create_info: &ImageCreateInfo, with_chain: bool) -> Self {
5416 let queue_family_indices = create_info.queue_family_indices.clone();
5417 let queue_family_indices_ptr = if !queue_family_indices.is_empty() {
5418 queue_family_indices.as_ptr()
5419 }
5420 else {
5421 ptr::null()
5422 };
5423
5424 let (pnext, chain) = ImageCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5425
5426 VkImageCreateInfoWrapper {
5427 vks_struct: vks::core::VkImageCreateInfo {
5428 sType: vks::core::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
5429 pNext: pnext,
5430 flags: create_info.flags.bits(),
5431 imageType: create_info.image_type.into(),
5432 format: create_info.format.into(),
5433 extent: (&create_info.extent).into(),
5434 mipLevels: create_info.mip_levels,
5435 arrayLayers: create_info.array_layers,
5436 samples: create_info.samples.bit(),
5437 tiling: create_info.tiling.into(),
5438 usage: create_info.usage.bits(),
5439 sharingMode: create_info.sharing_mode.into(),
5440 queueFamilyIndexCount: queue_family_indices.len() as u32,
5441 pQueueFamilyIndices: queue_family_indices_ptr,
5442 initialLayout: create_info.initial_layout.into(),
5443 },
5444 queue_family_indices: queue_family_indices,
5445 chain: chain,
5446 }
5447 }
5448}
5449
5450#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
5452pub struct SubresourceLayout {
5453 pub offset: u64,
5454 pub size: u64,
5455 pub row_pitch: u64,
5456 pub array_pitch: u64,
5457 pub depth_pitch: u64,
5458}
5459
5460impl<'a> From<&'a vks::core::VkSubresourceLayout> for SubresourceLayout {
5461 fn from(layout: &'a vks::core::VkSubresourceLayout) -> Self {
5462 SubresourceLayout {
5463 offset: layout.offset,
5464 size: layout.size,
5465 row_pitch: layout.rowPitch,
5466 array_pitch: layout.arrayPitch,
5467 depth_pitch: layout.depthPitch,
5468 }
5469 }
5470}
5471
5472#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
5474pub struct ComponentMapping {
5475 pub r: ComponentSwizzle,
5476 pub g: ComponentSwizzle,
5477 pub b: ComponentSwizzle,
5478 pub a: ComponentSwizzle,
5479}
5480
5481impl<'a> From<&'a ComponentMapping> for vks::core::VkComponentMapping {
5482 fn from(mapping: &'a ComponentMapping) -> Self {
5483 vks::core::VkComponentMapping {
5484 r: mapping.r.into(),
5485 g: mapping.g.into(),
5486 b: mapping.b.into(),
5487 a: mapping.a.into(),
5488 }
5489 }
5490}
5491
5492impl ComponentMapping {
5493 #[inline]
5496 pub fn identity() -> Self {
5497 ComponentMapping {
5498 r: ComponentSwizzle::Identity,
5499 g: ComponentSwizzle::Identity,
5500 b: ComponentSwizzle::Identity,
5501 a: ComponentSwizzle::Identity,
5502 }
5503 }
5504}
5505
5506#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
5508pub struct ImageSubresourceRange {
5509 pub aspect_mask: ImageAspectFlags,
5510 pub base_mip_level: u32,
5511 pub level_count: OptionalMipLevels,
5512 pub base_array_layer: u32,
5513 pub layer_count: OptionalArrayLayers,
5514}
5515
5516impl<'a> From<&'a ImageSubresourceRange> for vks::core::VkImageSubresourceRange {
5517 fn from(range: &'a ImageSubresourceRange) -> Self {
5518 vks::core::VkImageSubresourceRange {
5519 aspectMask: range.aspect_mask.bits(),
5520 baseMipLevel: range.base_mip_level,
5521 levelCount: range.level_count.into(),
5522 baseArrayLayer: range.base_array_layer,
5523 layerCount: range.layer_count.into(),
5524 }
5525 }
5526}
5527
5528gen_chain_struct! {
5529 name: ImageViewCreateInfoChain [ImageViewCreateInfoChainWrapper],
5530 query: ImageViewCreateInfoChainQuery [ImageViewCreateInfoChainQueryWrapper],
5531 vks: vks::core::VkImageViewCreateInfo,
5532 input: true,
5533 output: false,
5534}
5535
5536#[derive(Debug, Clone, PartialEq)]
5538pub struct ImageViewCreateInfo {
5539 pub flags: ImageViewCreateFlags,
5540 pub image: Image,
5541 pub view_type: ImageViewType,
5542 pub format: Format,
5543 pub components: ComponentMapping,
5544 pub subresource_range: ImageSubresourceRange,
5545 pub chain: Option<ImageViewCreateInfoChain>,
5546}
5547
5548#[derive(Debug)]
5549struct VkImageViewCreateInfoWrapper {
5550 pub vks_struct: vks::core::VkImageViewCreateInfo,
5551 image: Image,
5552 chain: Option<ImageViewCreateInfoChainWrapper>,
5553}
5554
5555impl VkImageViewCreateInfoWrapper {
5556 pub fn new(create_info: &ImageViewCreateInfo, with_chain: bool) -> Self {
5557 let (pnext, chain) = ImageViewCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5558
5559 VkImageViewCreateInfoWrapper {
5560 vks_struct: vks::core::VkImageViewCreateInfo {
5561 sType: vks::core::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5562 pNext: pnext,
5563 flags: create_info.flags.bits(),
5564 image: create_info.image.handle(),
5565 viewType: create_info.view_type.into(),
5566 format: create_info.format.into(),
5567 components: (&create_info.components).into(),
5568 subresourceRange: (&create_info.subresource_range).into(),
5569 },
5570 image: create_info.image.clone(),
5571 chain: chain,
5572 }
5573 }
5574}
5575
5576gen_chain_struct! {
5577 name: ShaderModuleCreateInfoChain [ShaderModuleCreateInfoChainWrapper],
5578 query: ShaderModuleCreateInfoChainQuery [ShaderModuleCreateInfoChainQueryWrapper],
5579 vks: vks::core::VkShaderModuleCreateInfo,
5580 input: true,
5581 output: false,
5582}
5583
5584#[derive(Debug, Clone, PartialEq)]
5586pub struct ShaderModuleCreateInfo {
5587 pub flags: ShaderModuleCreateFlags,
5588 pub code: Vec<u8>,
5589 pub chain: Option<ShaderModuleCreateInfoChain>,
5590}
5591
5592#[derive(Debug)]
5593struct VkShaderModuleCreateInfoWrapper {
5594 pub vks_struct: vks::core::VkShaderModuleCreateInfo,
5595 code: Vec<u32>,
5596 chain: Option<ShaderModuleCreateInfoChainWrapper>,
5597}
5598
5599impl VkShaderModuleCreateInfoWrapper {
5600 pub fn new(create_info: &ShaderModuleCreateInfo, with_chain: bool) -> Self {
5601 let size_u32 = if create_info.code.len() % mem::size_of::<u32>() == 0 {
5602 create_info.code.len() / mem::size_of::<u32>()
5603 }
5604 else {
5605 1 + create_info.code.len() / mem::size_of::<u32>()
5606 };
5607
5608 let mut code = Vec::with_capacity(size_u32);
5609 unsafe {
5610 code.set_len(size_u32);
5611 ptr::copy_nonoverlapping(create_info.code.as_ptr(), code.as_mut_ptr() as *mut u8, create_info.code.len());
5612 }
5613
5614 let (pnext, chain) = ShaderModuleCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5615
5616 VkShaderModuleCreateInfoWrapper {
5617 vks_struct: vks::core::VkShaderModuleCreateInfo {
5618 sType: vks::core::VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
5619 pNext: pnext,
5620 flags: create_info.flags.bits(),
5621 codeSize: create_info.code.len(),
5622 pCode: code.as_ptr(),
5623 },
5624 code: code,
5625 chain: chain,
5626 }
5627 }
5628}
5629
5630gen_chain_struct! {
5631 name: PipelineCacheCreateInfoChain [PipelineCacheCreateInfoChainWrapper],
5632 query: PipelineCacheCreateInfoChainQuery [PipelineCacheCreateInfoChainQueryWrapper],
5633 vks: vks::core::VkPipelineCacheCreateInfo,
5634 input: true,
5635 output: false,
5636}
5637
5638#[derive(Debug, Clone, PartialEq)]
5640pub struct PipelineCacheCreateInfo {
5641 pub flags: PipelineCacheCreateFlags,
5642 pub initial_data: Vec<u8>,
5643 pub chain: Option<PipelineCacheCreateInfoChain>,
5644}
5645
5646#[derive(Debug)]
5647struct VkPipelineCacheCreateInfoWrapper {
5648 pub vks_struct: vks::core::VkPipelineCacheCreateInfo,
5649 initial_data: Vec<u8>,
5650 chain: Option<PipelineCacheCreateInfoChainWrapper>,
5651}
5652
5653impl VkPipelineCacheCreateInfoWrapper {
5654 pub fn new(create_info: &PipelineCacheCreateInfo, with_chain: bool) -> Self {
5655 let initial_data = create_info.initial_data.clone();
5656 let initial_data_ptr = if !initial_data.is_empty() {
5657 initial_data.as_ptr() as *const _
5658 }
5659 else {
5660 ptr::null()
5661 };
5662
5663 let (pnext, chain) = PipelineCacheCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5664
5665 VkPipelineCacheCreateInfoWrapper {
5666 vks_struct: vks::core::VkPipelineCacheCreateInfo {
5667 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO,
5668 pNext: pnext,
5669 flags: create_info.flags.bits(),
5670 initialDataSize: initial_data.len(),
5671 pInitialData: initial_data_ptr,
5672 },
5673 initial_data: initial_data,
5674 chain: chain,
5675 }
5676 }
5677}
5678
5679#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
5681pub struct SpecializationMapEntry {
5682 pub constant_id: u32,
5683 pub offset: u32,
5684 pub size: usize,
5685}
5686
5687impl<'a> From<&'a SpecializationMapEntry> for vks::core::VkSpecializationMapEntry {
5688 fn from(entry: &'a SpecializationMapEntry) -> Self {
5689 vks::core::VkSpecializationMapEntry {
5690 constantID: entry.constant_id,
5691 offset: entry.offset,
5692 size: entry.size,
5693 }
5694 }
5695}
5696
5697#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
5699pub struct SpecializationInfo {
5700 pub map_entries: Vec<SpecializationMapEntry>,
5701 pub data: Vec<u8>,
5702}
5703
5704impl SpecializationInfo {
5705 #[inline]
5706 pub fn new() -> Self {
5707 Default::default()
5708 }
5709
5710 pub fn push<T>(&mut self, constant_id: u32, value: T)
5711 where T: Copy
5712 {
5713 let entry = SpecializationMapEntry {
5714 constant_id: constant_id,
5715 offset: self.data.len() as u32,
5716 size: mem::size_of::<T>(),
5717 };
5718
5719 self.data.reserve(entry.size);
5720 unsafe {
5721 self.data.set_len(entry.offset as usize + entry.size);
5722 ptr::copy_nonoverlapping(&value as *const T as *const u8, self.data.as_mut_ptr().offset(entry.offset as isize), entry.size);
5723 }
5724
5725 self.map_entries.push(entry);
5726 }
5727}
5728
5729#[derive(Debug)]
5730struct VkSpecializationInfoWrapper {
5731 pub vks_struct: vks::core::VkSpecializationInfo,
5732 map_entries: Vec<vks::core::VkSpecializationMapEntry>,
5733 data: Vec<u8>,
5734}
5735
5736impl<'a> From<&'a SpecializationInfo> for VkSpecializationInfoWrapper {
5737 fn from(info: &'a SpecializationInfo) -> Self {
5738 let map_entries: Vec<_> = info.map_entries.iter().map(From::from).collect();
5739 let map_entries_ptr = if !map_entries.is_empty() {
5740 map_entries.as_ptr()
5741 }
5742 else {
5743 ptr::null()
5744 };
5745
5746 let data = info.data.clone();
5747 let data_ptr = if !data.is_empty() {
5748 data.as_ptr() as *const _
5749 }
5750 else {
5751 ptr::null()
5752 };
5753
5754 VkSpecializationInfoWrapper {
5755 vks_struct: vks::core::VkSpecializationInfo {
5756 mapEntryCount: map_entries.len() as u32,
5757 pMapEntries: map_entries_ptr,
5758 dataSize: data.len(),
5759 pData: data_ptr,
5760 },
5761 map_entries: map_entries,
5762 data: data,
5763 }
5764 }
5765}
5766
5767gen_chain_struct! {
5768 name: PipelineShaderStageCreateInfoChain [PipelineShaderStageCreateInfoChainWrapper],
5769 query: PipelineShaderStageCreateInfoChainQuery [PipelineShaderStageCreateInfoChainQueryWrapper],
5770 vks: vks::core::VkPipelineShaderStageCreateInfo,
5771 input: true,
5772 output: false,
5773}
5774
5775#[derive(Debug, Clone, PartialEq)]
5777pub struct PipelineShaderStageCreateInfo {
5778 pub flags: PipelineShaderStageCreateFlags,
5779 pub stage: ShaderStageFlagBits,
5780 pub module: ShaderModule,
5781 pub name: String,
5782 pub specialization_info: Option<SpecializationInfo>,
5783 pub chain: Option<PipelineShaderStageCreateInfoChain>,
5784}
5785
5786#[derive(Debug)]
5787struct VkPipelineShaderStageCreateInfoWrapper {
5788 pub vks_struct: vks::core::VkPipelineShaderStageCreateInfo,
5789 module: ShaderModule,
5790 name: CString,
5791 specialization_info: Option<Box<VkSpecializationInfoWrapper>>,
5792 chain: Option<PipelineShaderStageCreateInfoChainWrapper>,
5793}
5794
5795impl VkPipelineShaderStageCreateInfoWrapper {
5796 pub fn new(create_info: &PipelineShaderStageCreateInfo, with_chain: bool) -> Self {
5797 let name = CString::new(create_info.name.clone()).unwrap();
5798
5799 let (specialization_info_ptr, specialization_info) = match create_info.specialization_info {
5800 Some(ref specialization_info) => {
5801 let specialization_info: Box<VkSpecializationInfoWrapper> = Box::new(specialization_info.into());
5802 (&specialization_info.vks_struct as *const _, Some(specialization_info))
5803 }
5804
5805 None => (ptr::null(), None),
5806 };
5807
5808 let (pnext, chain) = PipelineShaderStageCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5809
5810 VkPipelineShaderStageCreateInfoWrapper {
5811 vks_struct: vks::core::VkPipelineShaderStageCreateInfo {
5812 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
5813 pNext: pnext,
5814 flags: create_info.flags.bits(),
5815 stage: create_info.stage.bit(),
5816 module: create_info.module.handle(),
5817 pName: name.as_ptr(),
5818 pSpecializationInfo: specialization_info_ptr,
5819 },
5820 module: create_info.module.clone(),
5821 name: name,
5822 specialization_info: specialization_info,
5823 chain: chain,
5824 }
5825 }
5826}
5827
5828#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
5830pub struct VertexInputBindingDescription {
5831 pub binding: u32,
5832 pub stride: u32,
5833 pub input_rate: VertexInputRate,
5834}
5835
5836impl<'a> From<&'a VertexInputBindingDescription> for vks::core::VkVertexInputBindingDescription {
5837 fn from(description: &'a VertexInputBindingDescription) -> Self {
5838 vks::core::VkVertexInputBindingDescription {
5839 binding: description.binding,
5840 stride: description.stride,
5841 inputRate: description.input_rate.into(),
5842 }
5843 }
5844}
5845
5846#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
5848pub struct VertexInputAttributeDescription {
5849 pub location: u32,
5850 pub binding: u32,
5851 pub format: Format,
5852 pub offset: u32,
5853}
5854
5855impl<'a> From<&'a VertexInputAttributeDescription> for vks::core::VkVertexInputAttributeDescription {
5856 fn from(description: &'a VertexInputAttributeDescription) -> Self {
5857 vks::core::VkVertexInputAttributeDescription {
5858 location: description.location,
5859 binding: description.binding,
5860 format: description.format.into(),
5861 offset: description.offset,
5862 }
5863 }
5864}
5865
5866gen_chain_struct! {
5867 name: PipelineVertexInputStateCreateInfoChain [PipelineVertexInputStateCreateInfoChainWrapper],
5868 query: PipelineVertexInputStateCreateInfoChainQuery [PipelineVertexInputStateCreateInfoChainQueryWrapper],
5869 vks: vks::core::VkPipelineVertexInputStateCreateInfo,
5870 input: true,
5871 output: false,
5872}
5873
5874#[derive(Debug, Clone, PartialEq)]
5876pub struct PipelineVertexInputStateCreateInfo {
5877 pub flags: PipelineVertexInputStateCreateFlags,
5878 pub vertex_binding_descriptions: Vec<VertexInputBindingDescription>,
5879 pub vertex_attribute_descriptions: Vec<VertexInputAttributeDescription>,
5880 pub chain: Option<PipelineVertexInputStateCreateInfoChain>,
5881}
5882
5883#[derive(Debug)]
5884struct VkPipelineVertexInputStateCreateInfoWrapper {
5885 pub vks_struct: vks::core::VkPipelineVertexInputStateCreateInfo,
5886 vertex_binding_descriptions: Vec<vks::core::VkVertexInputBindingDescription>,
5887 vertex_attribute_descriptions: Vec<vks::core::VkVertexInputAttributeDescription>,
5888 chain: Option<PipelineVertexInputStateCreateInfoChainWrapper>,
5889}
5890
5891impl VkPipelineVertexInputStateCreateInfoWrapper {
5892 pub fn new(create_info: &PipelineVertexInputStateCreateInfo, with_chain: bool) -> Self {
5893 let vertex_binding_descriptions: Vec<_> = create_info.vertex_binding_descriptions.iter().map(From::from).collect();
5894 let vertex_binding_descriptions_ptr = if !vertex_binding_descriptions.is_empty() {
5895 vertex_binding_descriptions.as_ptr()
5896 }
5897 else {
5898 ptr::null()
5899 };
5900
5901 let vertex_attribute_descriptions: Vec<_> = create_info.vertex_attribute_descriptions.iter().map(From::from).collect();
5902 let vertex_attribute_descriptions_ptr = if !vertex_attribute_descriptions.is_empty() {
5903 vertex_attribute_descriptions.as_ptr()
5904 }
5905 else {
5906 ptr::null()
5907 };
5908
5909 let (pnext, chain) = PipelineVertexInputStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5910
5911 VkPipelineVertexInputStateCreateInfoWrapper {
5912 vks_struct: vks::core::VkPipelineVertexInputStateCreateInfo {
5913 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
5914 pNext: pnext,
5915 flags: create_info.flags.bits(),
5916 vertexBindingDescriptionCount: vertex_binding_descriptions.len() as u32,
5917 pVertexBindingDescriptions: vertex_binding_descriptions_ptr,
5918 vertexAttributeDescriptionCount: vertex_attribute_descriptions.len() as u32,
5919 pVertexAttributeDescriptions: vertex_attribute_descriptions_ptr,
5920 },
5921 vertex_binding_descriptions: vertex_binding_descriptions,
5922 vertex_attribute_descriptions: vertex_attribute_descriptions,
5923 chain: chain,
5924 }
5925 }
5926}
5927
5928gen_chain_struct! {
5929 name: PipelineInputAssemblyStateCreateInfoChain [PipelineInputAssemblyStateCreateInfoChainWrapper],
5930 query: PipelineInputAssemblyStateCreateInfoChainQuery [PipelineInputAssemblyStateCreateInfoChainQueryWrapper],
5931 vks: vks::core::VkPipelineInputAssemblyStateCreateInfo,
5932 input: true,
5933 output: false,
5934}
5935
5936#[derive(Debug, Clone, PartialEq)]
5938pub struct PipelineInputAssemblyStateCreateInfo {
5939 pub flags: PipelineInputAssemblyStateCreateFlags,
5940 pub topology: PrimitiveTopology,
5941 pub primitive_restart_enable: bool,
5942 pub chain: Option<PipelineInputAssemblyStateCreateInfoChain>,
5943}
5944
5945#[derive(Debug)]
5946struct VkPipelineInputAssemblyStateCreateInfoWrapper {
5947 pub vks_struct: vks::core::VkPipelineInputAssemblyStateCreateInfo,
5948 chain: Option<PipelineInputAssemblyStateCreateInfoChainWrapper>,
5949}
5950
5951impl VkPipelineInputAssemblyStateCreateInfoWrapper {
5952 pub fn new(create_info: &PipelineInputAssemblyStateCreateInfo, with_chain: bool) -> Self {
5953 let (pnext, chain) = PipelineInputAssemblyStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5954
5955 VkPipelineInputAssemblyStateCreateInfoWrapper {
5956 vks_struct: vks::core::VkPipelineInputAssemblyStateCreateInfo {
5957 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
5958 pNext: pnext,
5959 flags: create_info.flags.bits(),
5960 topology: create_info.topology.into(),
5961 primitiveRestartEnable: utils::to_vk_bool(create_info.primitive_restart_enable),
5962 },
5963 chain: chain,
5964 }
5965 }
5966}
5967
5968gen_chain_struct! {
5969 name: PipelineTessellationStateCreateInfoChain [PipelineTessellationStateCreateInfoChainWrapper],
5970 query: PipelineTessellationStateCreateInfoChainQuery [PipelineTessellationStateCreateInfoChainQueryWrapper],
5971 vks: vks::core::VkPipelineTessellationStateCreateInfo,
5972 input: true,
5973 output: false,
5974}
5975
5976#[derive(Debug, Clone, PartialEq)]
5978pub struct PipelineTessellationStateCreateInfo {
5979 pub flags: PipelineTessellationStateCreateFlags,
5980 pub patch_control_points: u32,
5981 pub chain: Option<PipelineTessellationStateCreateInfoChain>,
5982}
5983
5984#[derive(Debug)]
5985struct VkPipelineTessellationStateCreateInfoWrapper {
5986 pub vks_struct: vks::core::VkPipelineTessellationStateCreateInfo,
5987 chain: Option<PipelineTessellationStateCreateInfoChainWrapper>,
5988}
5989
5990impl VkPipelineTessellationStateCreateInfoWrapper {
5991 pub fn new(create_info: &PipelineTessellationStateCreateInfo, with_chain: bool) -> Self {
5992 let (pnext, chain) = PipelineTessellationStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
5993
5994 VkPipelineTessellationStateCreateInfoWrapper {
5995 vks_struct: vks::core::VkPipelineTessellationStateCreateInfo {
5996 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
5997 pNext: pnext,
5998 flags: create_info.flags.bits(),
5999 patchControlPoints: create_info.patch_control_points,
6000 },
6001 chain: chain,
6002 }
6003 }
6004}
6005
6006#[derive(Debug, Copy, Clone, PartialEq)]
6008pub struct Viewport {
6009 pub x: f32,
6010 pub y: f32,
6011 pub width: f32,
6012 pub height: f32,
6013 pub min_depth: f32,
6014 pub max_depth: f32,
6015}
6016
6017impl<'a> From<&'a Viewport> for vks::core::VkViewport {
6018 fn from(viewport: &'a Viewport) -> Self {
6019 vks::core::VkViewport {
6020 x: viewport.x,
6021 y: viewport.y,
6022 width: viewport.width,
6023 height: viewport.height,
6024 minDepth: viewport.min_depth,
6025 maxDepth: viewport.max_depth,
6026 }
6027 }
6028}
6029
6030#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6032pub struct Offset2D {
6033 pub x: i32,
6034 pub y: i32,
6035}
6036
6037impl<'a> From<&'a vks::core::VkOffset2D> for Offset2D {
6038 fn from(offset: &'a vks::core::VkOffset2D) -> Self {
6039 Offset2D {
6040 x: offset.x,
6041 y: offset.y,
6042 }
6043 }
6044}
6045
6046impl<'a> From<&'a Offset2D> for vks::core::VkOffset2D {
6047 fn from(offset: &'a Offset2D) -> Self {
6048 vks::core::VkOffset2D {
6049 x: offset.x,
6050 y: offset.y,
6051 }
6052 }
6053}
6054
6055impl Offset2D {
6056 #[inline]
6058 pub fn new(x: i32, y: i32) -> Self {
6059 Offset2D {
6060 x: x,
6061 y: y,
6062 }
6063 }
6064
6065 #[inline]
6067 pub fn zero() -> Self {
6068 Offset2D {
6069 x: 0,
6070 y: 0,
6071 }
6072 }
6073
6074 #[inline]
6076 pub fn from_3d(offset: &Offset3D) -> Self {
6077 Offset2D {
6078 x: offset.x,
6079 y: offset.y,
6080 }
6081 }
6082}
6083
6084#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6086pub struct Extent2D {
6087 pub width: u32,
6088 pub height: u32,
6089}
6090
6091impl<'a> From<&'a vks::core::VkExtent2D> for Extent2D {
6092 fn from(extent: &'a vks::core::VkExtent2D) -> Self {
6093 Extent2D {
6094 width: extent.width,
6095 height: extent.height,
6096 }
6097 }
6098}
6099
6100impl<'a> From<&'a Extent2D> for vks::core::VkExtent2D {
6101 fn from(extent: &'a Extent2D) -> Self {
6102 vks::core::VkExtent2D {
6103 width: extent.width,
6104 height: extent.height,
6105 }
6106 }
6107}
6108
6109impl Extent2D {
6110 #[inline]
6112 pub fn new(width: u32, height: u32) -> Self {
6113 Extent2D {
6114 width: width,
6115 height: height,
6116 }
6117 }
6118
6119 #[inline]
6121 pub fn zero() -> Self {
6122 Extent2D {
6123 width: 0,
6124 height: 0,
6125 }
6126 }
6127
6128 #[inline]
6130 pub fn from_3d(extent: &Extent3D) -> Self {
6131 Extent2D {
6132 width: extent.width,
6133 height: extent.height,
6134 }
6135 }
6136}
6137
6138#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6140pub struct Rect2D {
6141 pub offset: Offset2D,
6142 pub extent: Extent2D,
6143}
6144
6145impl<'a> From<&'a Rect2D> for vks::core::VkRect2D {
6146 fn from(rect: &'a Rect2D) -> Self {
6147 vks::core::VkRect2D {
6148 offset: (&rect.offset).into(),
6149 extent: (&rect.extent).into(),
6150 }
6151 }
6152}
6153
6154impl Rect2D {
6155 #[inline]
6157 pub fn new(offset: Offset2D, extent: Extent2D) -> Self {
6158 Rect2D {
6159 offset: offset,
6160 extent: extent,
6161 }
6162 }
6163}
6164
6165gen_chain_struct! {
6166 name: PipelineViewportStateCreateInfoChain [PipelineViewportStateCreateInfoChainWrapper],
6167 query: PipelineViewportStateCreateInfoChainQuery [PipelineViewportStateCreateInfoChainQueryWrapper],
6168 vks: vks::core::VkPipelineViewportStateCreateInfo,
6169 input: true,
6170 output: false,
6171}
6172
6173#[derive(Debug, Clone, PartialEq)]
6175pub struct PipelineViewportStateCreateInfo {
6176 pub flags: PipelineViewportStateCreateFlags,
6177 pub viewports: Vec<Viewport>,
6178 pub scissors: Vec<Rect2D>,
6179 pub chain: Option<PipelineViewportStateCreateInfoChain>,
6180}
6181
6182#[derive(Debug)]
6183struct VkPipelineViewportStateCreateInfoWrapper {
6184 pub vks_struct: vks::core::VkPipelineViewportStateCreateInfo,
6185 viewports: Vec<vks::core::VkViewport>,
6186 scissors: Vec<vks::core::VkRect2D>,
6187 chain: Option<PipelineViewportStateCreateInfoChainWrapper>,
6188}
6189
6190impl VkPipelineViewportStateCreateInfoWrapper {
6191 pub fn new(create_info: &PipelineViewportStateCreateInfo, with_chain: bool) -> Self {
6192 let viewports: Vec<_> = create_info.viewports.iter().map(From::from).collect();
6193 let scissors: Vec<_> = create_info.scissors.iter().map(From::from).collect();
6194 let (pnext, chain) = PipelineViewportStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6195
6196 VkPipelineViewportStateCreateInfoWrapper {
6197 vks_struct: vks::core::VkPipelineViewportStateCreateInfo {
6198 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
6199 pNext: pnext,
6200 flags: create_info.flags.bits(),
6201 viewportCount: viewports.len() as u32,
6202 pViewports: viewports.as_ptr(),
6203 scissorCount: scissors.len() as u32,
6204 pScissors: scissors.as_ptr(),
6205 },
6206 viewports: viewports,
6207 scissors: scissors,
6208 chain: chain,
6209 }
6210 }
6211}
6212
6213gen_chain_struct! {
6214 name: PipelineRasterizationStateCreateInfoChain [PipelineRasterizationStateCreateInfoChainWrapper],
6215 query: PipelineRasterizationStateCreateInfoChainQuery [PipelineRasterizationStateCreateInfoChainQueryWrapper],
6216 vks: vks::core::VkPipelineRasterizationStateCreateInfo,
6217 input: true,
6218 output: false,
6219
6220 pipeline_rasterization_state_rasterization_order_amd: amd_rasterization_order::PipelineRasterizationStateRasterizationOrderAmd {
6221 fn_add: add_pipeline_rasterization_state_rasterization_order_amd,
6222 fn_has: has_pipeline_rasterization_state_rasterization_order_amd,
6223 fn_get: get_pipeline_rasterization_state_rasterization_order_amd,
6224 wrapper: amd_rasterization_order::VkPipelineRasterizationStateRasterizationOrderAMDWrapper,
6225 vks: vks::amd_rasterization_order::VkPipelineRasterizationStateRasterizationOrderAMD,
6226 stype: vks::core::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD,
6227 }
6228}
6229
6230#[derive(Debug, Clone, PartialEq)]
6232pub struct PipelineRasterizationStateCreateInfo {
6233 pub flags: PipelineRasterizationStateCreateFlags,
6234 pub depth_clamp_enable: bool,
6235 pub rasterizer_discard_enable: bool,
6236 pub polygon_mode: PolygonMode,
6237 pub cull_mode: CullModeFlags,
6238 pub front_face: FrontFace,
6239 pub depth_bias_enable: bool,
6240 pub depth_bias_constant_factor: f32,
6241 pub depth_bias_clamp: f32,
6242 pub depth_bias_slope_factor: f32,
6243 pub line_width: f32,
6244 pub chain: Option<PipelineRasterizationStateCreateInfoChain>,
6245}
6246
6247#[derive(Debug)]
6248struct VkPipelineRasterizationStateCreateInfoWrapper {
6249 pub vks_struct: vks::core::VkPipelineRasterizationStateCreateInfo,
6250 chain: Option<PipelineRasterizationStateCreateInfoChainWrapper>,
6251}
6252
6253impl VkPipelineRasterizationStateCreateInfoWrapper {
6254 pub fn new(create_info: &PipelineRasterizationStateCreateInfo, with_chain: bool) -> Self {
6255 let (pnext, chain) = PipelineRasterizationStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6256
6257 VkPipelineRasterizationStateCreateInfoWrapper {
6258 vks_struct: vks::core::VkPipelineRasterizationStateCreateInfo {
6259 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
6260 pNext: pnext,
6261 flags: create_info.flags.bits(),
6262 depthClampEnable: utils::to_vk_bool(create_info.depth_clamp_enable),
6263 rasterizerDiscardEnable: utils::to_vk_bool(create_info.rasterizer_discard_enable),
6264 polygonMode: create_info.polygon_mode.into(),
6265 cullMode: create_info.cull_mode.bits(),
6266 frontFace: create_info.front_face.into(),
6267 depthBiasEnable: utils::to_vk_bool(create_info.depth_bias_enable),
6268 depthBiasConstantFactor: create_info.depth_bias_constant_factor,
6269 depthBiasClamp: create_info.depth_bias_clamp,
6270 depthBiasSlopeFactor: create_info.depth_bias_slope_factor,
6271 lineWidth: create_info.line_width,
6272 },
6273 chain: chain,
6274 }
6275 }
6276}
6277
6278gen_chain_struct! {
6279 name: PipelineMultisampleStateCreateInfoChain [PipelineMultisampleStateCreateInfoChainWrapper],
6280 query: PipelineMultisampleStateCreateInfoChainQuery [PipelineMultisampleStateCreateInfoChainQueryWrapper],
6281 vks: vks::core::VkPipelineMultisampleStateCreateInfo,
6282 input: true,
6283 output: false,
6284}
6285
6286#[derive(Debug, Clone, PartialEq)]
6288pub struct PipelineMultisampleStateCreateInfo {
6289 pub flags: PipelineMultisampleStateCreateFlags,
6290 pub rasterization_samples: SampleCountFlagBits,
6291 pub sample_shading_enable: bool,
6292 pub min_sample_shading: f32,
6293 pub sample_mask: Vec<u32>,
6294 pub alpha_to_coverage_enable: bool,
6295 pub alpha_to_one_enable: bool,
6296 pub chain: Option<PipelineMultisampleStateCreateInfoChain>,
6297}
6298
6299#[derive(Debug)]
6300struct VkPipelineMultisampleStateCreateInfoWrapper {
6301 pub vks_struct: vks::core::VkPipelineMultisampleStateCreateInfo,
6302 sample_mask: Vec<u32>,
6303 chain: Option<PipelineMultisampleStateCreateInfoChainWrapper>,
6304}
6305
6306impl VkPipelineMultisampleStateCreateInfoWrapper {
6307 pub fn new(create_info: &PipelineMultisampleStateCreateInfo, with_chain: bool) -> Self {
6308 let sample_mask = create_info.sample_mask.clone();
6309 let sample_mask_ptr = if !sample_mask.is_empty() {
6310 sample_mask.as_ptr()
6311 }
6312 else {
6313 ptr::null()
6314 };
6315
6316 let (pnext, chain) = PipelineMultisampleStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6317
6318 VkPipelineMultisampleStateCreateInfoWrapper {
6319 vks_struct: vks::core::VkPipelineMultisampleStateCreateInfo {
6320 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
6321 pNext: pnext,
6322 flags: create_info.flags.bits(),
6323 rasterizationSamples: create_info.rasterization_samples.bit(),
6324 sampleShadingEnable: utils::to_vk_bool(create_info.sample_shading_enable),
6325 minSampleShading: create_info.min_sample_shading,
6326 pSampleMask: sample_mask_ptr,
6327 alphaToCoverageEnable: utils::to_vk_bool(create_info.alpha_to_coverage_enable),
6328 alphaToOneEnable: utils::to_vk_bool(create_info.alpha_to_one_enable),
6329 },
6330 sample_mask: sample_mask,
6331 chain: chain,
6332 }
6333 }
6334}
6335
6336#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6338pub struct StencilOpState {
6339 pub fail_op: StencilOp,
6340 pub pass_op: StencilOp,
6341 pub depth_fail_op: StencilOp,
6342 pub compare_op: CompareOp,
6343 pub compare_mask: u32,
6344 pub write_mask: u32,
6345 pub reference: u32,
6346}
6347
6348impl<'a> From<&'a StencilOpState> for vks::core::VkStencilOpState {
6349 fn from(state: &'a StencilOpState) -> Self {
6350 vks::core::VkStencilOpState {
6351 failOp: state.fail_op.into(),
6352 passOp: state.pass_op.into(),
6353 depthFailOp: state.depth_fail_op.into(),
6354 compareOp: state.compare_op.into(),
6355 compareMask: state.compare_mask,
6356 writeMask: state.write_mask,
6357 reference: state.reference,
6358 }
6359 }
6360}
6361
6362gen_chain_struct! {
6363 name: PipelineDepthStencilStateCreateInfoChain [PipelineDepthStencilStateCreateInfoChainWrapper],
6364 query: PipelineDepthStencilStateCreateInfoChainQuery [PipelineDepthStencilStateCreateInfoChainQueryWrapper],
6365 vks: vks::core::VkPipelineDepthStencilStateCreateInfo,
6366 input: true,
6367 output: false,
6368}
6369
6370#[derive(Debug, Clone, PartialEq)]
6372pub struct PipelineDepthStencilStateCreateInfo {
6373 pub flags: PipelineDepthStencilStateCreateFlags,
6374 pub depth_test_enable: bool,
6375 pub depth_write_enable: bool,
6376 pub depth_compare_op: CompareOp,
6377 pub depth_bounds_test_enable: bool,
6378 pub stencil_test_enable: bool,
6379 pub front: StencilOpState,
6380 pub back: StencilOpState,
6381 pub min_depth_bounds: f32,
6382 pub max_depth_bounds: f32,
6383 pub chain: Option<PipelineDepthStencilStateCreateInfoChain>,
6384}
6385
6386#[derive(Debug)]
6387struct VkPipelineDepthStencilStateCreateInfoWrapper {
6388 pub vks_struct: vks::core::VkPipelineDepthStencilStateCreateInfo,
6389 chain: Option<PipelineDepthStencilStateCreateInfoChainWrapper>,
6390}
6391
6392impl VkPipelineDepthStencilStateCreateInfoWrapper {
6393 pub fn new(create_info: &PipelineDepthStencilStateCreateInfo, with_chain: bool) -> Self {
6394 let (pnext, chain) = PipelineDepthStencilStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6395
6396 VkPipelineDepthStencilStateCreateInfoWrapper {
6397 vks_struct: vks::core::VkPipelineDepthStencilStateCreateInfo {
6398 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
6399 pNext: pnext,
6400 flags: create_info.flags.bits(),
6401 depthTestEnable: utils::to_vk_bool(create_info.depth_test_enable),
6402 depthWriteEnable: utils::to_vk_bool(create_info.depth_write_enable),
6403 depthCompareOp: create_info.depth_compare_op.into(),
6404 depthBoundsTestEnable: utils::to_vk_bool(create_info.depth_bounds_test_enable),
6405 stencilTestEnable: utils::to_vk_bool(create_info.stencil_test_enable),
6406 front: (&create_info.front).into(),
6407 back: (&create_info.back).into(),
6408 minDepthBounds: create_info.min_depth_bounds,
6409 maxDepthBounds: create_info.max_depth_bounds,
6410 },
6411 chain: chain,
6412 }
6413 }
6414}
6415
6416#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6418pub struct PipelineColorBlendAttachmentState {
6419 pub blend_enable: bool,
6420 pub src_color_blend_factor: BlendFactor,
6421 pub dst_color_blend_factor: BlendFactor,
6422 pub color_blend_op: BlendOp,
6423 pub src_alpha_blend_factor: BlendFactor,
6424 pub dst_alpha_blend_factor: BlendFactor,
6425 pub alpha_blend_op: BlendOp,
6426 pub color_write_mask: ColorComponentFlags,
6427}
6428
6429impl<'a> From<&'a PipelineColorBlendAttachmentState> for vks::core::VkPipelineColorBlendAttachmentState {
6430 fn from(state: &'a PipelineColorBlendAttachmentState) -> Self {
6431 vks::core::VkPipelineColorBlendAttachmentState {
6432 blendEnable: utils::to_vk_bool(state.blend_enable),
6433 srcColorBlendFactor: state.src_color_blend_factor.into(),
6434 dstColorBlendFactor: state.dst_color_blend_factor.into(),
6435 colorBlendOp: state.color_blend_op.into(),
6436 srcAlphaBlendFactor: state.src_alpha_blend_factor.into(),
6437 dstAlphaBlendFactor: state.dst_alpha_blend_factor.into(),
6438 alphaBlendOp: state.alpha_blend_op.into(),
6439 colorWriteMask: state.color_write_mask.bits(),
6440 }
6441 }
6442}
6443
6444gen_chain_struct! {
6445 name: PipelineColorBlendStateCreateInfoChain [PipelineColorBlendStateCreateInfoChainWrapper],
6446 query: PipelineColorBlendStateCreateInfoChainQuery [PipelineColorBlendStateCreateInfoChainQueryWrapper],
6447 vks: vks::core::VkPipelineColorBlendStateCreateInfo,
6448 input: true,
6449 output: false,
6450}
6451
6452#[derive(Debug, Clone, PartialEq)]
6454pub struct PipelineColorBlendStateCreateInfo {
6455 pub flags: PipelineColorBlendStateCreateFlags,
6456 pub logic_op_enable: bool,
6457 pub logic_op: LogicOp,
6458 pub attachments: Vec<PipelineColorBlendAttachmentState>,
6459 pub blend_constants: [f32; 4],
6460 pub chain: Option<PipelineColorBlendStateCreateInfoChain>,
6461}
6462
6463#[derive(Debug)]
6464struct VkPipelineColorBlendStateCreateInfoWrapper {
6465 pub vks_struct: vks::core::VkPipelineColorBlendStateCreateInfo,
6466 attachments: Vec<vks::core::VkPipelineColorBlendAttachmentState>,
6467 chain: Option<PipelineColorBlendStateCreateInfoChainWrapper>,
6468}
6469
6470impl VkPipelineColorBlendStateCreateInfoWrapper {
6471 pub fn new(create_info: &PipelineColorBlendStateCreateInfo, with_chain: bool) -> Self {
6472 let attachments: Vec<_> = create_info.attachments.iter().map(From::from).collect();
6473 let attachments_ptr = if !attachments.is_empty() {
6474 attachments.as_ptr()
6475 }
6476 else {
6477 ptr::null()
6478 };
6479
6480 let (pnext, chain) = PipelineColorBlendStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6481
6482 VkPipelineColorBlendStateCreateInfoWrapper {
6483 vks_struct: vks::core::VkPipelineColorBlendStateCreateInfo {
6484 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
6485 pNext: pnext,
6486 flags: create_info.flags.bits(),
6487 logicOpEnable: utils::to_vk_bool(create_info.logic_op_enable),
6488 logicOp: create_info.logic_op.into(),
6489 attachmentCount: attachments.len() as u32,
6490 pAttachments: attachments_ptr,
6491 blendConstants: create_info.blend_constants,
6492 },
6493 attachments: attachments,
6494 chain: chain,
6495 }
6496 }
6497}
6498
6499gen_chain_struct! {
6500 name: PipelineDynamicStateCreateInfoChain [PipelineDynamicStateCreateInfoChainWrapper],
6501 query: PipelineDynamicStateCreateInfoChainQuery [PipelineDynamicStateCreateInfoChainQueryWrapper],
6502 vks: vks::core::VkPipelineDynamicStateCreateInfo,
6503 input: true,
6504 output: false,
6505}
6506
6507#[derive(Debug, Clone, PartialEq)]
6509pub struct PipelineDynamicStateCreateInfo {
6510 pub flags: PipelineDynamicStateCreateFlags,
6511 pub dynamic_states: Vec<DynamicState>,
6512 pub chain: Option<PipelineDynamicStateCreateInfoChain>,
6513}
6514
6515#[derive(Debug)]
6516struct VkPipelineDynamicStateCreateInfoWrapper {
6517 pub vks_struct: vks::core::VkPipelineDynamicStateCreateInfo,
6518 dynamic_states: Vec<vks::core::VkDynamicState>,
6519 chain: Option<PipelineDynamicStateCreateInfoChainWrapper>,
6520}
6521
6522impl VkPipelineDynamicStateCreateInfoWrapper {
6523 pub fn new(create_info: &PipelineDynamicStateCreateInfo, with_chain: bool) -> Self {
6524 let dynamic_states: Vec<_> = create_info.dynamic_states
6525 .iter()
6526 .cloned()
6527 .map(From::from)
6528 .collect();
6529
6530 let (pnext, chain) = PipelineDynamicStateCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6531
6532 VkPipelineDynamicStateCreateInfoWrapper {
6533 vks_struct: vks::core::VkPipelineDynamicStateCreateInfo {
6534 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
6535 pNext: pnext,
6536 flags: create_info.flags.bits(),
6537 dynamicStateCount: dynamic_states.len() as u32,
6538 pDynamicStates: dynamic_states.as_ptr(),
6539 },
6540 dynamic_states: dynamic_states,
6541 chain: chain,
6542 }
6543 }
6544}
6545
6546gen_chain_struct! {
6547 name: GraphicsPipelineCreateInfoChain [GraphicsPipelineCreateInfoChainWrapper],
6548 query: GraphicsPipelineCreateInfoChainQuery [GraphicsPipelineCreateInfoChainQueryWrapper],
6549 vks: vks::core::VkGraphicsPipelineCreateInfo,
6550 input: true,
6551 output: false,
6552}
6553
6554#[derive(Debug, Clone, PartialEq)]
6556pub struct GraphicsPipelineCreateInfo {
6557 pub flags: PipelineCreateFlags,
6558 pub stages: Vec<PipelineShaderStageCreateInfo>,
6559 pub vertex_input_state: PipelineVertexInputStateCreateInfo,
6560 pub input_assembly_state: PipelineInputAssemblyStateCreateInfo,
6561 pub tessellation_state: Option<PipelineTessellationStateCreateInfo>,
6562 pub viewport_state: Option<PipelineViewportStateCreateInfo>,
6563 pub rasterization_state: PipelineRasterizationStateCreateInfo,
6564 pub multisample_state: Option<PipelineMultisampleStateCreateInfo>,
6565 pub depth_stencil_state: Option<PipelineDepthStencilStateCreateInfo>,
6566 pub color_blend_state: Option<PipelineColorBlendStateCreateInfo>,
6567 pub dynamic_state: Option<PipelineDynamicStateCreateInfo>,
6568 pub layout: PipelineLayout,
6569 pub render_pass: RenderPass,
6570 pub subpass: u32,
6571 pub base_pipeline: Option<Pipeline>,
6572 pub base_pipeline_index: Option<u32>,
6573 pub chain: Option<GraphicsPipelineCreateInfoChain>,
6574}
6575
6576#[derive(Debug)]
6577struct VkGraphicsPipelineCreateInfoWrapper {
6578 pub vks_struct: vks::core::VkGraphicsPipelineCreateInfo,
6579 stages: Vec<VkPipelineShaderStageCreateInfoWrapper>,
6580 vk_stages: Vec<vks::core::VkPipelineShaderStageCreateInfo>,
6581 vertex_input_state: Box<VkPipelineVertexInputStateCreateInfoWrapper>,
6582 input_assembly_state: Box<VkPipelineInputAssemblyStateCreateInfoWrapper>,
6583 tessellation_state: Option<Box<VkPipelineTessellationStateCreateInfoWrapper>>,
6584 viewport_state: Option<Box<VkPipelineViewportStateCreateInfoWrapper>>,
6585 rasterization_state: Box<VkPipelineRasterizationStateCreateInfoWrapper>,
6586 multisample_state: Option<Box<VkPipelineMultisampleStateCreateInfoWrapper>>,
6587 depth_stencil_state: Option<Box<VkPipelineDepthStencilStateCreateInfoWrapper>>,
6588 color_blend_state: Option<Box<VkPipelineColorBlendStateCreateInfoWrapper>>,
6589 dynamic_state: Option<Box<VkPipelineDynamicStateCreateInfoWrapper>>,
6590 layout: PipelineLayout,
6591 render_pass: RenderPass,
6592 base_pipeline: Option<Pipeline>,
6593 chain: Option<GraphicsPipelineCreateInfoChainWrapper>,
6594}
6595
6596impl VkGraphicsPipelineCreateInfoWrapper {
6597 pub fn new(create_info: &GraphicsPipelineCreateInfo, with_chain: bool) -> Self {
6598 let stages: Vec<_> = create_info.stages.iter().map(|c| VkPipelineShaderStageCreateInfoWrapper::new(c, true)).collect();
6599 let vk_stages: Vec<_> = stages.iter().map(|s| s.vks_struct).collect();
6600 let vertex_input_state: Box<_> = Box::new(VkPipelineVertexInputStateCreateInfoWrapper::new(&create_info.vertex_input_state, true));
6601 let input_assembly_state: Box<_> = Box::new(VkPipelineInputAssemblyStateCreateInfoWrapper::new(&create_info.input_assembly_state, true));
6602
6603 let (tessellation_state_ptr, tessellation_state) = match create_info.tessellation_state {
6604 Some(ref tessellation_state) => {
6605 let tessellation_state: Box<_> = Box::new(VkPipelineTessellationStateCreateInfoWrapper::new(tessellation_state, true));
6606 (&tessellation_state.vks_struct as *const _, Some(tessellation_state))
6607 }
6608
6609 None => (ptr::null(), None),
6610 };
6611
6612 let (viewport_state_ptr, viewport_state) = match create_info.viewport_state {
6613 Some(ref viewport_state) => {
6614 let viewport_state: Box<_> = Box::new(VkPipelineViewportStateCreateInfoWrapper::new(viewport_state, true));
6615 (&viewport_state.vks_struct as *const _, Some(viewport_state))
6616 }
6617
6618 None => (ptr::null(), None),
6619 };
6620
6621 let rasterization_state: Box<_> = Box::new(VkPipelineRasterizationStateCreateInfoWrapper::new(&create_info.rasterization_state, true));
6622
6623 let (multisample_state_ptr, multisample_state) = match create_info.multisample_state {
6624 Some(ref multisample_state) => {
6625 let multisample_state: Box<_> = Box::new(VkPipelineMultisampleStateCreateInfoWrapper::new(multisample_state, true));
6626 (&multisample_state.vks_struct as *const _, Some(multisample_state))
6627 }
6628
6629 None => (ptr::null(), None),
6630 };
6631
6632 let (depth_stencil_state_ptr, depth_stencil_state) = match create_info.depth_stencil_state {
6633 Some(ref depth_stencil_state) => {
6634 let depth_stencil_state: Box<_> = Box::new(VkPipelineDepthStencilStateCreateInfoWrapper::new(depth_stencil_state, true));
6635 (&depth_stencil_state.vks_struct as *const _, Some(depth_stencil_state))
6636 }
6637
6638 None => (ptr::null(), None),
6639 };
6640
6641 let (color_blend_state_ptr, color_blend_state) = match create_info.color_blend_state {
6642 Some(ref color_blend_state) => {
6643 let color_blend_state: Box<_> = Box::new(VkPipelineColorBlendStateCreateInfoWrapper::new(color_blend_state, true));
6644 (&color_blend_state.vks_struct as *const _, Some(color_blend_state))
6645 }
6646
6647 None => (ptr::null(), None),
6648 };
6649
6650 let (dynamic_state_ptr, dynamic_state) = match create_info.dynamic_state {
6651 Some(ref dynamic_state) => {
6652 let dynamic_state: Box<_> = Box::new(VkPipelineDynamicStateCreateInfoWrapper::new(dynamic_state, true));
6653 (&dynamic_state.vks_struct as *const _, Some(dynamic_state))
6654 }
6655
6656 None => (ptr::null(), None),
6657 };
6658
6659 let (base_pipeline_handle, base_pipeline) = match create_info.base_pipeline {
6660 Some(ref base_pipeline) => (base_pipeline.handle(), Some(base_pipeline.clone())),
6661 None => (Default::default(), None),
6662 };
6663
6664 let base_pipeline_index = match create_info.base_pipeline_index {
6665 Some(base_pipeline_index) => base_pipeline_index as i32,
6666 None => -1,
6667 };
6668
6669 let (pnext, chain) = GraphicsPipelineCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6670
6671 VkGraphicsPipelineCreateInfoWrapper {
6672 vks_struct: vks::core::VkGraphicsPipelineCreateInfo {
6673 sType: vks::core::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
6674 pNext: pnext,
6675 flags: create_info.flags.bits(),
6676 stageCount: stages.len() as u32,
6677 pStages: vk_stages.as_ptr(),
6678 pVertexInputState: &vertex_input_state.vks_struct,
6679 pInputAssemblyState: &input_assembly_state.vks_struct,
6680 pTessellationState: tessellation_state_ptr,
6681 pViewportState: viewport_state_ptr,
6682 pRasterizationState: &rasterization_state.vks_struct,
6683 pMultisampleState: multisample_state_ptr,
6684 pDepthStencilState: depth_stencil_state_ptr,
6685 pColorBlendState: color_blend_state_ptr,
6686 pDynamicState: dynamic_state_ptr,
6687 layout: create_info.layout.handle(),
6688 renderPass: create_info.render_pass.handle(),
6689 subpass: create_info.subpass,
6690 basePipelineHandle: base_pipeline_handle,
6691 basePipelineIndex: base_pipeline_index,
6692 },
6693 stages: stages,
6694 vk_stages: vk_stages,
6695 vertex_input_state: vertex_input_state,
6696 input_assembly_state: input_assembly_state,
6697 tessellation_state: tessellation_state,
6698 viewport_state: viewport_state,
6699 rasterization_state: rasterization_state,
6700 multisample_state: multisample_state,
6701 depth_stencil_state: depth_stencil_state,
6702 color_blend_state: color_blend_state,
6703 dynamic_state: dynamic_state,
6704 layout: create_info.layout.clone(),
6705 render_pass: create_info.render_pass.clone(),
6706 base_pipeline: base_pipeline,
6707 chain: chain,
6708 }
6709 }
6710}
6711
6712gen_chain_struct! {
6713 name: ComputePipelineCreateInfoChain [ComputePipelineCreateInfoChainWrapper],
6714 query: ComputePipelineCreateInfoChainQuery [ComputePipelineCreateInfoChainQueryWrapper],
6715 vks: vks::core::VkComputePipelineCreateInfo,
6716 input: true,
6717 output: false,
6718}
6719
6720#[derive(Debug, Clone, PartialEq)]
6722pub struct ComputePipelineCreateInfo {
6723 pub flags: PipelineCreateFlags,
6724 pub stage: PipelineShaderStageCreateInfo,
6725 pub layout: PipelineLayout,
6726 pub base_pipeline: Option<Pipeline>,
6727 pub base_pipeline_index: Option<u32>,
6728 pub chain: Option<ComputePipelineCreateInfoChain>,
6729}
6730
6731#[derive(Debug)]
6732struct VkComputePipelineCreateInfoWrapper {
6733 pub vks_struct: vks::core::VkComputePipelineCreateInfo,
6734 stage: VkPipelineShaderStageCreateInfoWrapper,
6735 layout: PipelineLayout,
6736 base_pipeline: Option<Pipeline>,
6737 chain: Option<ComputePipelineCreateInfoChainWrapper>,
6738}
6739
6740impl VkComputePipelineCreateInfoWrapper {
6741 pub fn new(create_info: &ComputePipelineCreateInfo, with_chain: bool) -> Self {
6742 let stage = VkPipelineShaderStageCreateInfoWrapper::new(&create_info.stage, true);
6743
6744 let (base_pipeline_handle, base_pipeline) = match create_info.base_pipeline {
6745 Some(ref base_pipeline) => (base_pipeline.handle(), Some(base_pipeline.clone())),
6746 None => (Default::default(), None),
6747 };
6748
6749 let base_pipeline_index = match create_info.base_pipeline_index {
6750 Some(base_pipeline_index) => base_pipeline_index as i32,
6751 None => -1,
6752 };
6753
6754 let (pnext, chain) = ComputePipelineCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6755
6756 VkComputePipelineCreateInfoWrapper {
6757 vks_struct: vks::core::VkComputePipelineCreateInfo {
6758 sType: vks::core::VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
6759 pNext: pnext,
6760 flags: create_info.flags.bits(),
6761 stage: stage.vks_struct,
6762 layout: create_info.layout.handle(),
6763 basePipelineHandle: base_pipeline_handle,
6764 basePipelineIndex: base_pipeline_index,
6765 },
6766 stage: stage,
6767 layout: create_info.layout.clone(),
6768 base_pipeline: base_pipeline,
6769 chain: chain,
6770 }
6771 }
6772}
6773
6774#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6776pub struct PushConstantRange {
6777 pub stage_flags: ShaderStageFlags,
6778 pub offset: u32,
6779 pub size: u32,
6780}
6781
6782impl<'a> From<&'a PushConstantRange> for vks::core::VkPushConstantRange {
6783 fn from(range: &'a PushConstantRange) -> Self {
6784 vks::core::VkPushConstantRange {
6785 stageFlags: range.stage_flags.bits(),
6786 offset: range.offset,
6787 size: range.size,
6788 }
6789 }
6790}
6791
6792gen_chain_struct! {
6793 name: PipelineLayoutCreateInfoChain [PipelineLayoutCreateInfoChainWrapper],
6794 query: PipelineLayoutCreateInfoChainQuery [PipelineLayoutCreateInfoChainQueryWrapper],
6795 vks: vks::core::VkPipelineLayoutCreateInfo,
6796 input: true,
6797 output: false,
6798}
6799
6800#[derive(Debug, Clone, PartialEq)]
6802pub struct PipelineLayoutCreateInfo {
6803 pub flags: PipelineLayoutCreateFlags,
6804 pub set_layouts: Vec<DescriptorSetLayout>,
6805 pub push_constant_ranges: Vec<PushConstantRange>,
6806 pub chain: Option<PipelineLayoutCreateInfoChain>,
6807}
6808
6809#[derive(Debug)]
6810struct VkPipelineLayoutCreateInfoWrapper {
6811 pub vks_struct: vks::core::VkPipelineLayoutCreateInfo,
6812 set_layouts: Vec<DescriptorSetLayout>,
6813 vk_set_layouts: Vec<vks::core::VkDescriptorSetLayout>,
6814 push_constant_ranges: Vec<vks::core::VkPushConstantRange>,
6815 chain: Option<PipelineLayoutCreateInfoChainWrapper>,
6816}
6817
6818impl VkPipelineLayoutCreateInfoWrapper {
6819 pub fn new(create_info: &PipelineLayoutCreateInfo, with_chain: bool) -> Self {
6820 let set_layouts = create_info.set_layouts.clone();
6821 let vk_set_layouts: Vec<_> = set_layouts.iter().map(DescriptorSetLayout::handle).collect();
6822 let vk_set_layouts_ptr = if !vk_set_layouts.is_empty() {
6823 vk_set_layouts.as_ptr()
6824 }
6825 else {
6826 ptr::null()
6827 };
6828
6829 let push_constant_ranges: Vec<_> = create_info.push_constant_ranges.iter().map(From::from).collect();
6830 let push_constant_ranges_ptr = if !push_constant_ranges.is_empty() {
6831 push_constant_ranges.as_ptr()
6832 }
6833 else {
6834 ptr::null()
6835 };
6836
6837 let (pnext, chain) = PipelineLayoutCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6838
6839 VkPipelineLayoutCreateInfoWrapper {
6840 vks_struct: vks::core::VkPipelineLayoutCreateInfo {
6841 sType: vks::core::VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
6842 pNext: pnext,
6843 flags: create_info.flags.bits(),
6844 setLayoutCount: set_layouts.len() as u32,
6845 pSetLayouts: vk_set_layouts_ptr,
6846 pushConstantRangeCount: push_constant_ranges.len() as u32,
6847 pPushConstantRanges: push_constant_ranges_ptr,
6848 },
6849 set_layouts: set_layouts,
6850 vk_set_layouts: vk_set_layouts,
6851 push_constant_ranges: push_constant_ranges,
6852 chain: chain,
6853 }
6854 }
6855}
6856
6857gen_chain_struct! {
6858 name: SamplerCreateInfoChain [SamplerCreateInfoChainWrapper],
6859 query: SamplerCreateInfoChainQuery [SamplerCreateInfoChainQueryWrapper],
6860 vks: vks::core::VkSamplerCreateInfo,
6861 input: true,
6862 output: false,
6863}
6864
6865#[derive(Debug, Clone, PartialEq)]
6867pub struct SamplerCreateInfo {
6868 pub flags: SamplerCreateFlags,
6869 pub mag_filter: Filter,
6870 pub min_filter: Filter,
6871 pub mipmap_mode: SamplerMipmapMode,
6872 pub address_mode_u: SamplerAddressMode,
6873 pub address_mode_v: SamplerAddressMode,
6874 pub address_mode_w: SamplerAddressMode,
6875 pub mip_lod_bias: f32,
6876 pub anisotropy_enable: bool,
6877 pub max_anisotropy: f32,
6878 pub compare_enable: bool,
6879 pub compare_op: CompareOp,
6880 pub min_lod: f32,
6881 pub max_lod: f32,
6882 pub border_color: BorderColor,
6883 pub unnormalized_coordinates: bool,
6884 pub chain: Option<SamplerCreateInfoChain>,
6885}
6886
6887#[derive(Debug)]
6888struct VkSamplerCreateInfoWrapper {
6889 pub vks_struct: vks::core::VkSamplerCreateInfo,
6890 chain: Option<SamplerCreateInfoChainWrapper>,
6891}
6892
6893impl VkSamplerCreateInfoWrapper {
6894 pub fn new(create_info: &SamplerCreateInfo, with_chain: bool) -> Self {
6895 let (pnext, chain) = SamplerCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
6896
6897 VkSamplerCreateInfoWrapper {
6898 vks_struct: vks::core::VkSamplerCreateInfo {
6899 sType: vks::core::VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
6900 pNext: pnext,
6901 flags: create_info.flags.bits(),
6902 magFilter: create_info.mag_filter.into(),
6903 minFilter: create_info.min_filter.into(),
6904 mipmapMode: create_info.mipmap_mode.into(),
6905 addressModeU: create_info.address_mode_u.into(),
6906 addressModeV: create_info.address_mode_v.into(),
6907 addressModeW: create_info.address_mode_w.into(),
6908 mipLodBias: create_info.mip_lod_bias,
6909 anisotropyEnable: utils::to_vk_bool(create_info.anisotropy_enable),
6910 maxAnisotropy: create_info.max_anisotropy,
6911 compareEnable: utils::to_vk_bool(create_info.compare_enable),
6912 compareOp: create_info.compare_op.into(),
6913 minLod: create_info.min_lod,
6914 maxLod: create_info.max_lod,
6915 borderColor: create_info.border_color.into(),
6916 unnormalizedCoordinates: utils::to_vk_bool(create_info.unnormalized_coordinates),
6917 },
6918 chain: chain,
6919 }
6920 }
6921}
6922
6923#[derive(Debug, Clone, PartialEq, Eq, Hash)]
6925pub struct DescriptorSetLayoutBinding {
6926 pub binding: u32,
6927 pub descriptor_type: DescriptorType,
6928 pub descriptor_count: u32,
6929 pub stage_flags: ShaderStageFlags,
6930 pub immutable_samplers: Vec<Sampler>,
6931}
6932
6933#[derive(Debug)]
6934struct VkDescriptorSetLayoutBindingWrapper {
6935 pub vks_struct: vks::core::VkDescriptorSetLayoutBinding,
6936 immutable_samplers: Vec<Sampler>,
6937 immutable_vk_samplers: Vec<vks::core::VkSampler>,
6938}
6939
6940impl<'a> From<&'a DescriptorSetLayoutBinding> for VkDescriptorSetLayoutBindingWrapper {
6941 fn from(binding: &'a DescriptorSetLayoutBinding) -> Self {
6942 let immutable_samplers = binding.immutable_samplers.clone();
6943 let immutable_vk_samplers: Vec<_> = immutable_samplers.iter().map(Sampler::handle).collect();
6944 let immutable_vk_samplers_ptr = if !immutable_vk_samplers.is_empty() {
6945 immutable_vk_samplers.as_ptr()
6946 }
6947 else {
6948 ptr::null()
6949 };
6950
6951 VkDescriptorSetLayoutBindingWrapper {
6952 vks_struct: vks::core::VkDescriptorSetLayoutBinding {
6953 binding: binding.binding,
6954 descriptorType: binding.descriptor_type.into(),
6955 descriptorCount: binding.descriptor_count,
6956 stageFlags: binding.stage_flags.bits(),
6957 pImmutableSamplers: immutable_vk_samplers_ptr,
6958 },
6959 immutable_samplers: immutable_samplers,
6960 immutable_vk_samplers: immutable_vk_samplers,
6961 }
6962 }
6963}
6964
6965gen_chain_struct! {
6966 name: DescriptorSetLayoutCreateInfoChain [DescriptorSetLayoutCreateInfoChainWrapper],
6967 query: DescriptorSetLayoutCreateInfoChainQuery [DescriptorSetLayoutCreateInfoChainQueryWrapper],
6968 vks: vks::core::VkDescriptorSetLayoutCreateInfo,
6969 input: true,
6970 output: false,
6971}
6972
6973#[derive(Debug, Clone, PartialEq)]
6975pub struct DescriptorSetLayoutCreateInfo {
6976 pub flags: DescriptorSetLayoutCreateFlags,
6977 pub bindings: Vec<DescriptorSetLayoutBinding>,
6978 pub chain: Option<DescriptorSetLayoutCreateInfoChain>,
6979}
6980
6981#[derive(Debug)]
6982struct VkDescriptorSetLayoutCreateInfoWrapper {
6983 pub vks_struct: vks::core::VkDescriptorSetLayoutCreateInfo,
6984 bindings: Vec<VkDescriptorSetLayoutBindingWrapper>,
6985 vk_bindings: Vec<vks::core::VkDescriptorSetLayoutBinding>,
6986 chain: Option<DescriptorSetLayoutCreateInfoChainWrapper>,
6987}
6988
6989impl VkDescriptorSetLayoutCreateInfoWrapper {
6990 pub fn new(create_info: &DescriptorSetLayoutCreateInfo, with_chain: bool) -> Self {
6991 let bindings: Vec<VkDescriptorSetLayoutBindingWrapper> = create_info.bindings.iter().map(From::from).collect();
6992 let vk_bindings: Vec<_> = bindings.iter().map(|b| b.vks_struct).collect();
6993 let vk_bindings_ptr = if !vk_bindings.is_empty() {
6994 vk_bindings.as_ptr()
6995 }
6996 else {
6997 ptr::null()
6998 };
6999
7000 let (pnext, chain) = DescriptorSetLayoutCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
7001
7002 VkDescriptorSetLayoutCreateInfoWrapper {
7003 vks_struct: vks::core::VkDescriptorSetLayoutCreateInfo {
7004 sType: vks::core::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
7005 pNext: pnext,
7006 flags: create_info.flags.bits(),
7007 bindingCount: bindings.len() as u32,
7008 pBindings: vk_bindings_ptr,
7009 },
7010 bindings: bindings,
7011 vk_bindings: vk_bindings,
7012 chain: chain,
7013 }
7014 }
7015}
7016
7017#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7019pub struct DescriptorPoolSize {
7020 pub descriptor_type: DescriptorType,
7021 pub descriptor_count: u32,
7022}
7023
7024impl<'a> From<&'a DescriptorPoolSize> for vks::core::VkDescriptorPoolSize {
7025 fn from(size: &'a DescriptorPoolSize) -> Self {
7026 vks::core::VkDescriptorPoolSize {
7027 type_: size.descriptor_type.into(),
7028 descriptorCount: size.descriptor_count,
7029 }
7030 }
7031}
7032
7033gen_chain_struct! {
7034 name: DescriptorPoolCreateInfoChain [DescriptorPoolCreateInfoChainWrapper],
7035 query: DescriptorPoolCreateInfoChainQuery [DescriptorPoolCreateInfoChainQueryWrapper],
7036 vks: vks::core::VkDescriptorPoolCreateInfo,
7037 input: true,
7038 output: false,
7039}
7040
7041#[derive(Debug, Clone, PartialEq)]
7043pub struct DescriptorPoolCreateInfo {
7044 pub flags: DescriptorPoolCreateFlags,
7045 pub max_sets: u32,
7046 pub pool_sizes: Vec<DescriptorPoolSize>,
7047 pub chain: Option<DescriptorPoolCreateInfoChain>,
7048}
7049
7050#[derive(Debug)]
7051struct VkDescriptorPoolCreateInfoWrapper {
7052 pub vks_struct: vks::core::VkDescriptorPoolCreateInfo,
7053 pool_sizes: Vec<vks::core::VkDescriptorPoolSize>,
7054 chain: Option<DescriptorPoolCreateInfoChainWrapper>,
7055}
7056
7057impl VkDescriptorPoolCreateInfoWrapper {
7058 pub fn new(create_info: &DescriptorPoolCreateInfo, with_chain: bool) -> Self {
7059 let pool_sizes: Vec<_> = create_info.pool_sizes
7060 .iter()
7061 .map(From::from)
7062 .collect();
7063
7064 let (pnext, chain) = DescriptorPoolCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
7065
7066 VkDescriptorPoolCreateInfoWrapper {
7067 vks_struct: vks::core::VkDescriptorPoolCreateInfo {
7068 sType: vks::core::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
7069 pNext: pnext,
7070 flags: create_info.flags.bits(),
7071 maxSets: create_info.max_sets,
7072 poolSizeCount: pool_sizes.len() as u32,
7073 pPoolSizes: pool_sizes.as_ptr(),
7074 },
7075 pool_sizes: pool_sizes,
7076 chain: chain,
7077 }
7078 }
7079}
7080
7081gen_chain_struct! {
7082 name: DescriptorSetAllocateInfoChain [DescriptorSetAllocateInfoChainWrapper],
7083 query: DescriptorSetAllocateInfoChainQuery [DescriptorSetAllocateInfoChainQueryWrapper],
7084 vks: vks::core::VkDescriptorSetAllocateInfo,
7085 input: true,
7086 output: false,
7087}
7088
7089#[derive(Debug, Clone, PartialEq)]
7091pub struct DescriptorSetAllocateInfo {
7092 pub descriptor_pool: DescriptorPool,
7093 pub set_layouts: Vec<DescriptorSetLayout>,
7094 pub chain: Option<DescriptorSetAllocateInfoChain>,
7095}
7096
7097#[derive(Debug)]
7098struct VkDescriptorSetAllocateInfoWrapper {
7099 pub vks_struct: vks::core::VkDescriptorSetAllocateInfo,
7100 descriptor_pool: DescriptorPool,
7101 set_layouts: Vec<DescriptorSetLayout>,
7102 vk_set_layouts: Vec<vks::core::VkDescriptorSetLayout>,
7103 chain: Option<DescriptorSetAllocateInfoChainWrapper>,
7104}
7105
7106impl VkDescriptorSetAllocateInfoWrapper {
7107 pub fn new(allocate_info: &DescriptorSetAllocateInfo, with_chain: bool) -> Self {
7108 let vk_set_layouts: Vec<_> = allocate_info.set_layouts.iter().map(DescriptorSetLayout::handle).collect();
7109 let (pnext, chain) = DescriptorSetAllocateInfoChainWrapper::new_optional(&allocate_info.chain, with_chain);
7110
7111 VkDescriptorSetAllocateInfoWrapper {
7112 vks_struct: vks::core::VkDescriptorSetAllocateInfo {
7113 sType: vks::core::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
7114 pNext: pnext,
7115 descriptorPool: allocate_info.descriptor_pool.handle(),
7116 descriptorSetCount: vk_set_layouts.len() as u32,
7117 pSetLayouts: vk_set_layouts.as_ptr(),
7118 },
7119 descriptor_pool: allocate_info.descriptor_pool.clone(),
7120 set_layouts: allocate_info.set_layouts.clone(),
7121 vk_set_layouts: vk_set_layouts,
7122 chain: chain,
7123 }
7124 }
7125}
7126
7127#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7129pub struct DescriptorImageInfo {
7130 pub sampler: Option<Sampler>,
7131 pub image_view: Option<ImageView>,
7132 pub image_layout: ImageLayout,
7133}
7134
7135#[derive(Debug)]
7136struct VkDescriptorImageInfoWrapper {
7137 pub vks_struct: vks::core::VkDescriptorImageInfo,
7138 sampler: Option<Sampler>,
7139 image_view: Option<ImageView>,
7140}
7141
7142impl<'a> From<&'a DescriptorImageInfo> for VkDescriptorImageInfoWrapper {
7143 fn from(info: &'a DescriptorImageInfo) -> Self {
7144 let (vk_sampler, sampler) = match info.sampler {
7145 Some(ref sampler) => (sampler.handle(), Some(sampler.clone())),
7146 None => (Default::default(), None),
7147 };
7148
7149 let (vk_image_view, image_view) = match info.image_view {
7150 Some(ref image_view) => (image_view.handle(), Some(image_view.clone())),
7151 None => (Default::default(), None),
7152 };
7153
7154 VkDescriptorImageInfoWrapper {
7155 vks_struct: vks::core::VkDescriptorImageInfo {
7156 sampler: vk_sampler,
7157 imageView: vk_image_view,
7158 imageLayout: info.image_layout.into(),
7159 },
7160 sampler: sampler,
7161 image_view: image_view,
7162 }
7163 }
7164}
7165
7166#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7168pub struct DescriptorBufferInfo {
7169 pub buffer: Buffer,
7170 pub offset: u64,
7171 pub range: OptionalDeviceSize,
7172}
7173
7174#[derive(Debug)]
7175struct VkDescriptorBufferInfoWrapper {
7176 pub vks_struct: vks::core::VkDescriptorBufferInfo,
7177 buffer: Buffer,
7178}
7179
7180impl<'a> From<&'a DescriptorBufferInfo> for VkDescriptorBufferInfoWrapper {
7181 fn from(info: &'a DescriptorBufferInfo) -> Self {
7182 VkDescriptorBufferInfoWrapper {
7183 vks_struct: vks::core::VkDescriptorBufferInfo {
7184 buffer: info.buffer.handle(),
7185 offset: info.offset,
7186 range: info.range.into(),
7187 },
7188 buffer: info.buffer.clone(),
7189 }
7190 }
7191}
7192
7193gen_chain_struct! {
7194 name: WriteDescriptorSetChain [WriteDescriptorSetChainWrapper],
7195 query: WriteDescriptorSetChainQuery [WriteDescriptorSetChainQueryWrapper],
7196 vks: vks::core::VkWriteDescriptorSet,
7197 input: true,
7198 output: false,
7199}
7200
7201#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7203pub enum WriteDescriptorSetElements {
7204 ImageInfo(Vec<DescriptorImageInfo>),
7205 BufferInfo(Vec<DescriptorBufferInfo>),
7206 TexelBufferView(Vec<BufferView>),
7207}
7208
7209#[derive(Debug, Clone, PartialEq)]
7211pub struct WriteDescriptorSet {
7212 pub dst_set: DescriptorSet,
7213 pub dst_binding: u32,
7214 pub dst_array_element: u32,
7215 pub descriptor_type: DescriptorType,
7216 pub elements: WriteDescriptorSetElements,
7217 pub chain: Option<WriteDescriptorSetChain>,
7218}
7219
7220#[derive(Debug)]
7221struct VkWriteDescriptorSetWrapper {
7222 pub vks_struct: vks::core::VkWriteDescriptorSet,
7223 dst_set: DescriptorSet,
7224 image_info: Vec<VkDescriptorImageInfoWrapper>,
7225 vk_image_info: Vec<vks::core::VkDescriptorImageInfo>,
7226 buffer_info: Vec<VkDescriptorBufferInfoWrapper>,
7227 vk_buffer_info: Vec<vks::core::VkDescriptorBufferInfo>,
7228 texel_buffer_view: Vec<BufferView>,
7229 vk_texel_buffer_view: Vec<vks::core::VkBufferView>,
7230 chain: Option<WriteDescriptorSetChainWrapper>,
7231}
7232
7233impl VkWriteDescriptorSetWrapper {
7234 pub fn new(write: &WriteDescriptorSet, with_chain: bool) -> Self {
7235 let (count,
7236 vk_image_info_ptr,
7237 vk_image_info,
7238 image_info,
7239 vk_buffer_info_ptr,
7240 vk_buffer_info,
7241 buffer_info,
7242 vk_texel_buffer_view_ptr,
7243 vk_texel_buffer_view,
7244 texel_buffer_view) = match write.elements {
7245 WriteDescriptorSetElements::ImageInfo(ref image_info) => {
7246 let image_info: Vec<VkDescriptorImageInfoWrapper> = image_info.iter().map(From::from).collect();
7247 let vk_image_info: Vec<_> = image_info.iter().map(|i| i.vks_struct).collect();
7248 (image_info.len() as u32, vk_image_info.as_ptr(), vk_image_info, image_info, ptr::null(), vec![], vec![], ptr::null(), vec![], vec![])
7249 },
7250
7251 WriteDescriptorSetElements::BufferInfo(ref buffer_info) => {
7252 let buffer_info: Vec<VkDescriptorBufferInfoWrapper> = buffer_info.iter().map(From::from).collect();
7253 let vk_buffer_info: Vec<_> = buffer_info.iter().map(|b| b.vks_struct).collect();
7254 (buffer_info.len() as u32, ptr::null(), vec![], vec![], vk_buffer_info.as_ptr(), vk_buffer_info, buffer_info, ptr::null(), vec![], vec![])
7255 },
7256
7257 WriteDescriptorSetElements::TexelBufferView(ref texel_buffer_view) => {
7258 let texel_buffer_view = texel_buffer_view.clone();
7259 let vk_texel_buffer_view: Vec<_> = texel_buffer_view.iter().map(BufferView::handle).collect();
7260 (texel_buffer_view.len() as u32, ptr::null(), vec![], vec![], ptr::null(), vec![], vec![], vk_texel_buffer_view.as_ptr(), vk_texel_buffer_view, texel_buffer_view)
7261 },
7262 };
7263
7264 let (pnext, chain) = WriteDescriptorSetChainWrapper::new_optional(&write.chain, with_chain);
7265
7266 VkWriteDescriptorSetWrapper {
7267 vks_struct: vks::core::VkWriteDescriptorSet {
7268 sType: vks::core::VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
7269 pNext: pnext,
7270 dstSet: write.dst_set.handle(),
7271 dstBinding: write.dst_binding,
7272 dstArrayElement: write.dst_array_element,
7273 descriptorCount: count,
7274 descriptorType: write.descriptor_type.into(),
7275 pImageInfo: vk_image_info_ptr,
7276 pBufferInfo: vk_buffer_info_ptr,
7277 pTexelBufferView: vk_texel_buffer_view_ptr,
7278 },
7279 dst_set: write.dst_set.clone(),
7280 image_info: image_info,
7281 vk_image_info: vk_image_info,
7282 buffer_info: buffer_info,
7283 vk_buffer_info: vk_buffer_info,
7284 texel_buffer_view: texel_buffer_view,
7285 vk_texel_buffer_view: vk_texel_buffer_view,
7286 chain: chain,
7287 }
7288 }
7289}
7290
7291gen_chain_struct! {
7292 name: CopyDescriptorSetChain [CopyDescriptorSetChainWrapper],
7293 query: CopyDescriptorSetChainQuery [CopyDescriptorSetChainQueryWrapper],
7294 vks: vks::core::VkCopyDescriptorSet,
7295 input: true,
7296 output: false,
7297}
7298
7299#[derive(Debug, Clone, PartialEq)]
7301pub struct CopyDescriptorSet {
7302 pub src_set: DescriptorSet,
7303 pub src_binding: u32,
7304 pub src_array_element: u32,
7305 pub dst_set: DescriptorSet,
7306 pub dst_binding: u32,
7307 pub dst_array_element: u32,
7308 pub descriptor_count: u32,
7309 pub chain: Option<CopyDescriptorSetChain>,
7310}
7311
7312#[derive(Debug)]
7313struct VkCopyDescriptorSetWrapper {
7314 pub vks_struct: vks::core::VkCopyDescriptorSet,
7315 src_set: DescriptorSet,
7316 dst_set: DescriptorSet,
7317 chain: Option<CopyDescriptorSetChainWrapper>,
7318}
7319
7320impl VkCopyDescriptorSetWrapper {
7321 pub fn new(copy: &CopyDescriptorSet, with_chain: bool) -> Self {
7322 let (pnext, chain) = CopyDescriptorSetChainWrapper::new_optional(©.chain, with_chain);
7323
7324 VkCopyDescriptorSetWrapper {
7325 vks_struct: vks::core::VkCopyDescriptorSet {
7326 sType: vks::core::VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET,
7327 pNext: pnext,
7328 srcSet: copy.src_set.handle(),
7329 srcBinding: copy.src_binding,
7330 srcArrayElement: copy.src_array_element,
7331 dstSet: copy.dst_set.handle(),
7332 dstBinding: copy.dst_binding,
7333 dstArrayElement: copy.dst_array_element,
7334 descriptorCount: copy.descriptor_count,
7335 },
7336 src_set: copy.src_set.clone(),
7337 dst_set: copy.dst_set.clone(),
7338 chain: chain,
7339 }
7340 }
7341}
7342
7343gen_chain_struct! {
7344 name: FramebufferCreateInfoChain [FramebufferCreateInfoChainWrapper],
7345 query: FramebufferCreateInfoChainQuery [FramebufferCreateInfoChainQueryWrapper],
7346 vks: vks::core::VkFramebufferCreateInfo,
7347 input: true,
7348 output: false,
7349}
7350
7351#[derive(Debug, Clone, PartialEq)]
7353pub struct FramebufferCreateInfo {
7354 pub flags: FramebufferCreateFlags,
7355 pub render_pass: RenderPass,
7356 pub attachments: Vec<ImageView>,
7357 pub width: u32,
7358 pub height: u32,
7359 pub layers: u32,
7360 pub chain: Option<FramebufferCreateInfoChain>,
7361}
7362
7363#[derive(Debug)]
7364struct VkFramebufferCreateInfoWrapper {
7365 pub vks_struct: vks::core::VkFramebufferCreateInfo,
7366 render_pass: RenderPass,
7367 attachments: Vec<ImageView>,
7368 vk_attachments: Vec<vks::core::VkImageView>,
7369 chain: Option<FramebufferCreateInfoChainWrapper>,
7370}
7371
7372impl VkFramebufferCreateInfoWrapper {
7373 pub fn new(create_info: &FramebufferCreateInfo, with_chain: bool) -> Self {
7374 let attachments = create_info.attachments.clone();
7375 let vk_attachments: Vec<_> = attachments.iter().map(ImageView::handle).collect();
7376 let vk_attachments_ptr = if !vk_attachments.is_empty() {
7377 vk_attachments.as_ptr()
7378 }
7379 else {
7380 ptr::null()
7381 };
7382
7383 let (pnext, chain) = FramebufferCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
7384
7385 VkFramebufferCreateInfoWrapper {
7386 vks_struct: vks::core::VkFramebufferCreateInfo {
7387 sType: vks::core::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
7388 pNext: pnext,
7389 flags: create_info.flags.bits(),
7390 renderPass: create_info.render_pass.handle(),
7391 attachmentCount: attachments.len() as u32,
7392 pAttachments: vk_attachments_ptr,
7393 width: create_info.width,
7394 height: create_info.height,
7395 layers: create_info.layers,
7396 },
7397 render_pass: create_info.render_pass.clone(),
7398 attachments: attachments,
7399 vk_attachments: vk_attachments,
7400 chain: chain,
7401 }
7402 }
7403}
7404
7405#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7407pub struct AttachmentDescription {
7408 pub flags: AttachmentDescriptionFlags,
7409 pub format: Format,
7410 pub samples: SampleCountFlagBits,
7411 pub load_op: AttachmentLoadOp,
7412 pub store_op: AttachmentStoreOp,
7413 pub stencil_load_op: AttachmentLoadOp,
7414 pub stencil_store_op: AttachmentStoreOp,
7415 pub initial_layout: ImageLayout,
7416 pub final_layout: ImageLayout,
7417}
7418
7419impl<'a> From<&'a AttachmentDescription> for vks::core::VkAttachmentDescription {
7420 fn from(description: &'a AttachmentDescription) -> Self {
7421 vks::core::VkAttachmentDescription {
7422 flags: description.flags.bits(),
7423 format: description.format.into(),
7424 samples: description.samples.bit(),
7425 loadOp: description.load_op.into(),
7426 storeOp: description.store_op.into(),
7427 stencilLoadOp: description.stencil_load_op.into(),
7428 stencilStoreOp: description.stencil_store_op.into(),
7429 initialLayout: description.initial_layout.into(),
7430 finalLayout: description.final_layout.into(),
7431 }
7432 }
7433}
7434
7435impl<'a> From<&'a vks::core::VkAttachmentDescription> for AttachmentDescription {
7436 fn from(description: &'a vks::core::VkAttachmentDescription) -> Self {
7437 AttachmentDescription {
7438 flags: AttachmentDescriptionFlags::from_bits_truncate(description.flags),
7439 format: description.format.into(),
7440 samples: SampleCountFlagBits::from_bits(description.samples).unwrap(),
7441 load_op: description.loadOp.into(),
7442 store_op: description.storeOp.into(),
7443 stencil_load_op: description.stencilLoadOp.into(),
7444 stencil_store_op: description.stencilStoreOp.into(),
7445 initial_layout: description.initialLayout.into(),
7446 final_layout: description.finalLayout.into(),
7447 }
7448 }
7449}
7450
7451#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7453pub struct AttachmentReference {
7454 pub attachment: AttachmentIndex,
7455 pub layout: ImageLayout,
7456}
7457
7458impl<'a> From<&'a AttachmentReference> for vks::core::VkAttachmentReference {
7459 fn from(reference: &'a AttachmentReference) -> Self {
7460 vks::core::VkAttachmentReference {
7461 attachment: reference.attachment.into(),
7462 layout: reference.layout.into(),
7463 }
7464 }
7465}
7466
7467impl<'a> From<&'a vks::core::VkAttachmentReference> for AttachmentReference {
7468 fn from(reference: &'a vks::core::VkAttachmentReference) -> Self {
7469 AttachmentReference {
7470 attachment: reference.attachment.into(),
7471 layout: reference.layout.into(),
7472 }
7473 }
7474}
7475
7476#[derive(Debug, Clone, PartialEq, Eq, Hash)]
7478pub struct SubpassDescription {
7479 pub flags: SubpassDescriptionFlags,
7480 pub pipeline_bind_point: PipelineBindPoint,
7481 pub input_attachments: Vec<AttachmentReference>,
7482 pub color_attachments: Vec<AttachmentReference>,
7483 pub resolve_attachments: Vec<AttachmentReference>,
7484 pub depth_stencil_attachment: Option<AttachmentReference>,
7485 pub preserve_attachments: Vec<u32>,
7486}
7487
7488impl<'a> From<&'a vks::core::VkSubpassDescription> for SubpassDescription {
7489 fn from(description: &'a vks::core::VkSubpassDescription) -> Self {
7490 let input_attachments = if !description.pInputAttachments.is_null() {
7491 let input_attachments = unsafe { slice::from_raw_parts(description.pInputAttachments, description.inputAttachmentCount as usize) };
7492 input_attachments.iter().map(AttachmentReference::from).collect()
7493 }
7494 else {
7495 vec![]
7496 };
7497
7498 let color_attachments = if !description.pColorAttachments.is_null() {
7499 let color_attachments = unsafe { slice::from_raw_parts(description.pColorAttachments, description.colorAttachmentCount as usize) };
7500 color_attachments.iter().map(AttachmentReference::from).collect()
7501 }
7502 else {
7503 vec![]
7504 };
7505
7506 let resolve_attachments = if !description.pResolveAttachments.is_null() {
7507 let resolve_attachments = unsafe { slice::from_raw_parts(description.pResolveAttachments, description.colorAttachmentCount as usize) };
7508 resolve_attachments.iter().map(AttachmentReference::from).collect()
7509 }
7510 else {
7511 vec![]
7512 };
7513
7514 let depth_stencil_attachment = if !description.pDepthStencilAttachment.is_null() {
7515 unsafe { Some((&*description.pDepthStencilAttachment).into()) }
7516 }
7517 else {
7518 None
7519 };
7520
7521 let preserve_attachments = if !description.pPreserveAttachments.is_null() {
7522 unsafe { slice::from_raw_parts(description.pPreserveAttachments, description.preserveAttachmentCount as usize).to_vec() }
7523 }
7524 else {
7525 vec![]
7526 };
7527
7528 SubpassDescription {
7529 flags: SubpassDescriptionFlags::from_bits_truncate(description.flags),
7530 pipeline_bind_point: description.pipelineBindPoint.into(),
7531 input_attachments: input_attachments,
7532 color_attachments: color_attachments,
7533 resolve_attachments: resolve_attachments,
7534 depth_stencil_attachment: depth_stencil_attachment,
7535 preserve_attachments: preserve_attachments,
7536 }
7537 }
7538}
7539
7540#[derive(Debug)]
7541struct VkSubpassDescriptionWrapper {
7542 pub vks_struct: vks::core::VkSubpassDescription,
7543 input_attachments: Vec<vks::core::VkAttachmentReference>,
7544 color_attachments: Vec<vks::core::VkAttachmentReference>,
7545 resolve_attachments: Vec<vks::core::VkAttachmentReference>,
7546 depth_stencil_attachment: Option<Box<vks::core::VkAttachmentReference>>,
7547 preserve_attachments: Vec<u32>,
7548}
7549
7550impl<'a> From<&'a SubpassDescription> for VkSubpassDescriptionWrapper {
7551 fn from(description: &'a SubpassDescription) -> Self {
7552 let input_attachments: Vec<_> = description.input_attachments.iter().map(From::from).collect();
7553 let input_attachments_ptr = if !input_attachments.is_empty() {
7554 input_attachments.as_ptr()
7555 }
7556 else {
7557 ptr::null()
7558 };
7559
7560 let color_attachments: Vec<_> = description.color_attachments.iter().map(From::from).collect();
7561 let color_attachments_ptr = if !color_attachments.is_empty() {
7562 color_attachments.as_ptr()
7563 }
7564 else {
7565 ptr::null()
7566 };
7567
7568 let resolve_attachments: Vec<_> = description.resolve_attachments.iter().map(From::from).collect();
7569 let resolve_attachments_ptr = if !resolve_attachments.is_empty() {
7570 resolve_attachments.as_ptr()
7571 }
7572 else {
7573 ptr::null()
7574 };
7575
7576 let (depth_stencil_attachment_ptr, depth_stencil_attachment) = match description.depth_stencil_attachment {
7577 Some(ref depth_stencil_attachment) => {
7578 let depth_stencil_attachment = Box::new(depth_stencil_attachment.into());
7579 (&*depth_stencil_attachment as *const _, Some(depth_stencil_attachment))
7580 }
7581
7582 None => (ptr::null(), None),
7583 };
7584
7585 let preserve_attachments = description.preserve_attachments.clone();
7586 let preserve_attachments_ptr = if !preserve_attachments.is_empty() {
7587 preserve_attachments.as_ptr()
7588 }
7589 else {
7590 ptr::null()
7591 };
7592
7593 VkSubpassDescriptionWrapper {
7594 vks_struct: vks::core::VkSubpassDescription {
7595 flags: description.flags.bits(),
7596 pipelineBindPoint: description.pipeline_bind_point.into(),
7597 inputAttachmentCount: input_attachments.len() as u32,
7598 pInputAttachments: input_attachments_ptr,
7599 colorAttachmentCount: color_attachments.len() as u32,
7600 pColorAttachments: color_attachments_ptr,
7601 pResolveAttachments: resolve_attachments_ptr,
7602 pDepthStencilAttachment: depth_stencil_attachment_ptr,
7603 preserveAttachmentCount: preserve_attachments.len() as u32,
7604 pPreserveAttachments: preserve_attachments_ptr,
7605 },
7606 input_attachments: input_attachments,
7607 color_attachments: color_attachments,
7608 resolve_attachments: resolve_attachments,
7609 depth_stencil_attachment: depth_stencil_attachment,
7610 preserve_attachments: preserve_attachments,
7611 }
7612 }
7613}
7614
7615#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7617pub struct SubpassDependency {
7618 pub src_subpass: SubpassIndex,
7619 pub dst_subpass: SubpassIndex,
7620 pub src_stage_mask: PipelineStageFlags,
7621 pub dst_stage_mask: PipelineStageFlags,
7622 pub src_access_mask: AccessFlags,
7623 pub dst_access_mask: AccessFlags,
7624 pub dependency_flags: DependencyFlags,
7625}
7626
7627impl<'a> From<&'a SubpassDependency> for vks::core::VkSubpassDependency {
7628 fn from(dependency: &'a SubpassDependency) -> Self {
7629 vks::core::VkSubpassDependency {
7630 srcSubpass: dependency.src_subpass.into(),
7631 dstSubpass: dependency.dst_subpass.into(),
7632 srcStageMask: dependency.src_stage_mask.bits(),
7633 dstStageMask: dependency.dst_stage_mask.bits(),
7634 srcAccessMask: dependency.src_access_mask.bits(),
7635 dstAccessMask: dependency.dst_access_mask.bits(),
7636 dependencyFlags: dependency.dependency_flags.bits(),
7637 }
7638 }
7639}
7640
7641impl<'a> From<&'a vks::core::VkSubpassDependency> for SubpassDependency {
7642 fn from(dependency: &'a vks::core::VkSubpassDependency) -> Self {
7643 SubpassDependency {
7644 src_subpass: dependency.srcSubpass.into(),
7645 dst_subpass: dependency.dstSubpass.into(),
7646 src_stage_mask: PipelineStageFlags::from_bits_truncate(dependency.srcStageMask),
7647 dst_stage_mask: PipelineStageFlags::from_bits_truncate(dependency.dstStageMask),
7648 src_access_mask: AccessFlags::from_bits_truncate(dependency.srcAccessMask),
7649 dst_access_mask: AccessFlags::from_bits_truncate(dependency.dstAccessMask),
7650 dependency_flags: DependencyFlags::from_bits_truncate(dependency.dependencyFlags),
7651 }
7652 }
7653}
7654
7655gen_chain_struct! {
7656 name: RenderPassCreateInfoChain [RenderPassCreateInfoChainWrapper],
7657 query: RenderPassCreateInfoChainQuery [RenderPassCreateInfoChainQueryWrapper],
7658 vks: vks::core::VkRenderPassCreateInfo,
7659 input: true,
7660 output: false,
7661}
7662
7663#[derive(Debug, Clone, PartialEq)]
7665pub struct RenderPassCreateInfo {
7666 pub flags: RenderPassCreateFlags,
7667 pub attachments: Vec<AttachmentDescription>,
7668 pub subpasses: Vec<SubpassDescription>,
7669 pub dependencies: Vec<SubpassDependency>,
7670 pub chain: Option<RenderPassCreateInfoChain>,
7671}
7672
7673#[derive(Debug)]
7674struct VkRenderPassCreateInfoWrapper {
7675 pub vks_struct: vks::core::VkRenderPassCreateInfo,
7676 attachments: Vec<vks::core::VkAttachmentDescription>,
7677 subpasses: Vec<VkSubpassDescriptionWrapper>,
7678 vk_subpasses: Vec<vks::core::VkSubpassDescription>,
7679 dependencies: Vec<vks::core::VkSubpassDependency>,
7680 chain: Option<RenderPassCreateInfoChainWrapper>,
7681}
7682
7683impl VkRenderPassCreateInfoWrapper {
7684 pub fn new(create_info: &RenderPassCreateInfo, with_chain: bool) -> Self {
7685 let attachments: Vec<_> = create_info.attachments.iter().map(From::from).collect();
7686 let attachments_ptr = if !attachments.is_empty() {
7687 attachments.as_ptr()
7688 }
7689 else {
7690 ptr::null()
7691 };
7692
7693 let subpasses: Vec<VkSubpassDescriptionWrapper> = create_info.subpasses.iter().map(From::from).collect();
7694 let vk_subpasses: Vec<vks::core::VkSubpassDescription> = subpasses.iter().map(|s| s.vks_struct).collect();
7695
7696 let dependencies: Vec<_> = create_info.dependencies.iter().map(From::from).collect();
7697 let dependencies_ptr = if !dependencies.is_empty() {
7698 dependencies.as_ptr()
7699 }
7700 else {
7701 ptr::null()
7702 };
7703
7704 let (pnext, chain) = RenderPassCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
7705
7706 VkRenderPassCreateInfoWrapper {
7707 vks_struct: vks::core::VkRenderPassCreateInfo {
7708 sType: vks::core::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
7709 pNext: pnext,
7710 flags: create_info.flags.bits(),
7711 attachmentCount: attachments.len() as u32,
7712 pAttachments: attachments_ptr,
7713 subpassCount: subpasses.len() as u32,
7714 pSubpasses: vk_subpasses.as_ptr(),
7715 dependencyCount: dependencies.len() as u32,
7716 pDependencies: dependencies_ptr,
7717 },
7718 attachments: attachments,
7719 subpasses: subpasses,
7720 vk_subpasses: vk_subpasses,
7721 dependencies: dependencies,
7722 chain: chain,
7723 }
7724 }
7725}
7726
7727gen_chain_struct! {
7728 name: CommandPoolCreateInfoChain [CommandPoolCreateInfoChainWrapper],
7729 query: CommandPoolCreateInfoChainQuery [CommandPoolCreateInfoChainQueryWrapper],
7730 vks: vks::core::VkCommandPoolCreateInfo,
7731 input: true,
7732 output: false,
7733}
7734
7735#[derive(Debug, Clone, PartialEq)]
7737pub struct CommandPoolCreateInfo {
7738 pub flags: CommandPoolCreateFlags,
7739 pub queue_family_index: u32,
7740 pub chain: Option<CommandPoolCreateInfoChain>,
7741}
7742
7743#[derive(Debug)]
7744struct VkCommandPoolCreateInfoWrapper {
7745 pub vks_struct: vks::core::VkCommandPoolCreateInfo,
7746 chain: Option<CommandPoolCreateInfoChainWrapper>,
7747}
7748
7749impl VkCommandPoolCreateInfoWrapper {
7750 pub fn new(create_info: &CommandPoolCreateInfo, with_chain: bool) -> Self {
7751 let (pnext, chain) = CommandPoolCreateInfoChainWrapper::new_optional(&create_info.chain, with_chain);
7752
7753 VkCommandPoolCreateInfoWrapper {
7754 vks_struct: vks::core::VkCommandPoolCreateInfo {
7755 sType: vks::core::VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
7756 pNext: pnext,
7757 flags: create_info.flags.bits(),
7758 queueFamilyIndex: create_info.queue_family_index,
7759 },
7760 chain: chain,
7761 }
7762 }
7763}
7764
7765gen_chain_struct! {
7766 name: CommandBufferAllocateInfoChain [CommandBufferAllocateInfoChainWrapper],
7767 query: CommandBufferAllocateInfoChainQuery [CommandBufferAllocateInfoChainQueryWrapper],
7768 vks: vks::core::VkCommandBufferAllocateInfo,
7769 input: true,
7770 output: false,
7771}
7772
7773#[derive(Debug, Clone, PartialEq)]
7775pub struct CommandBufferAllocateInfo {
7776 pub command_pool: CommandPool,
7777 pub level: CommandBufferLevel,
7778 pub command_buffer_count: u32,
7779 pub chain: Option<CommandBufferAllocateInfoChain>,
7780}
7781
7782#[derive(Debug)]
7783struct VkCommandBufferAllocateInfoWrapper {
7784 pub vks_struct: vks::core::VkCommandBufferAllocateInfo,
7785 command_pool: CommandPool,
7786 chain: Option<CommandBufferAllocateInfoChainWrapper>,
7787}
7788
7789impl VkCommandBufferAllocateInfoWrapper {
7790 pub fn new(info: &CommandBufferAllocateInfo, with_chain: bool) -> Self {
7791 let (pnext, chain) = CommandBufferAllocateInfoChainWrapper::new_optional(&info.chain, with_chain);
7792
7793 VkCommandBufferAllocateInfoWrapper {
7794 vks_struct: vks::core::VkCommandBufferAllocateInfo {
7795 sType: vks::core::VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
7796 pNext: pnext,
7797 commandPool: info.command_pool.handle(),
7798 level: info.level.into(),
7799 commandBufferCount: info.command_buffer_count,
7800 },
7801 command_pool: info.command_pool.clone(),
7802 chain: chain,
7803 }
7804 }
7805}
7806
7807gen_chain_struct! {
7808 name: CommandBufferInheritanceInfoChain [CommandBufferInheritanceInfoChainWrapper],
7809 query: CommandBufferInheritanceInfoChainQuery [CommandBufferInheritanceInfoChainQueryWrapper],
7810 vks: vks::core::VkCommandBufferInheritanceInfo,
7811 input: true,
7812 output: false,
7813}
7814
7815#[derive(Debug, Clone, PartialEq)]
7817pub struct CommandBufferInheritanceInfo {
7818 pub render_pass: Option<RenderPass>,
7819 pub subpass: u32,
7820 pub framebuffer: Option<Framebuffer>,
7821 pub occlusion_query_enable: bool,
7822 pub query_flags: QueryControlFlags,
7823 pub pipeline_statistics: QueryPipelineStatisticFlags,
7824 pub chain: Option<CommandBufferInheritanceInfoChain>,
7825}
7826
7827#[derive(Debug)]
7828struct VkCommandBufferInheritanceInfoWrapper {
7829 pub vks_struct: vks::core::VkCommandBufferInheritanceInfo,
7830 render_pass: Option<RenderPass>,
7831 framebuffer: Option<Framebuffer>,
7832 chain: Option<CommandBufferInheritanceInfoChainWrapper>,
7833}
7834
7835impl VkCommandBufferInheritanceInfoWrapper {
7836 pub fn new(info: &CommandBufferInheritanceInfo, with_chain: bool) -> Self {
7837 let (render_pass_handle, render_pass) = match info.render_pass {
7838 Some(ref render_pass) => (render_pass.handle(), Some(render_pass.clone())),
7839 None => (Default::default(), None),
7840 };
7841
7842 let (framebuffer_handle, framebuffer) = match info.framebuffer {
7843 Some(ref framebuffer) => (framebuffer.handle(), Some(framebuffer.clone())),
7844 None => (Default::default(), None),
7845 };
7846
7847 let (pnext, chain) = CommandBufferInheritanceInfoChainWrapper::new_optional(&info.chain, with_chain);
7848
7849 VkCommandBufferInheritanceInfoWrapper {
7850 vks_struct: vks::core::VkCommandBufferInheritanceInfo {
7851 sType: vks::core::VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
7852 pNext: pnext,
7853 renderPass: render_pass_handle,
7854 subpass: info.subpass,
7855 framebuffer: framebuffer_handle,
7856 occlusionQueryEnable: utils::to_vk_bool(info.occlusion_query_enable),
7857 queryFlags: info.query_flags.bits(),
7858 pipelineStatistics: info.pipeline_statistics.bits(),
7859 },
7860 render_pass: render_pass,
7861 framebuffer: framebuffer,
7862 chain: chain,
7863 }
7864 }
7865}
7866
7867gen_chain_struct! {
7868 name: CommandBufferBeginInfoChain [CommandBufferBeginInfoChainWrapper],
7869 query: CommandBufferBeginInfoChainQuery [CommandBufferBeginInfoChainQueryWrapper],
7870 vks: vks::core::VkCommandBufferBeginInfo,
7871 input: true,
7872 output: false,
7873}
7874
7875#[derive(Debug, Clone, PartialEq)]
7877pub struct CommandBufferBeginInfo {
7878 pub flags: CommandBufferUsageFlags,
7879 pub inheritance_info: Option<CommandBufferInheritanceInfo>,
7880 pub chain: Option<CommandBufferBeginInfoChain>,
7881}
7882
7883#[derive(Debug)]
7884struct VkCommandBufferBeginInfoWrapper {
7885 pub vks_struct: vks::core::VkCommandBufferBeginInfo,
7886 inheritance_info: Option<Box<VkCommandBufferInheritanceInfoWrapper>>,
7887 chain: Option<CommandBufferBeginInfoChainWrapper>,
7888}
7889
7890impl VkCommandBufferBeginInfoWrapper {
7891 pub fn new(begin_info: &CommandBufferBeginInfo, with_chain: bool) -> Self {
7892 let (inheritance_info_ptr, inheritance_info) = match begin_info.inheritance_info {
7893 Some(ref inheritance_info) => {
7894 let inheritance_info: Box<_> = Box::new(VkCommandBufferInheritanceInfoWrapper::new(inheritance_info, true));
7895 (&inheritance_info.vks_struct as *const _, Some(inheritance_info))
7896 }
7897
7898 None => (ptr::null(), None),
7899 };
7900
7901 let (pnext, chain) = CommandBufferBeginInfoChainWrapper::new_optional(&begin_info.chain, with_chain);
7902
7903 VkCommandBufferBeginInfoWrapper {
7904 vks_struct: vks::core::VkCommandBufferBeginInfo {
7905 sType: vks::core::VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
7906 pNext: pnext,
7907 flags: begin_info.flags.bits(),
7908 pInheritanceInfo: inheritance_info_ptr,
7909 },
7910 inheritance_info: inheritance_info,
7911 chain: chain,
7912 }
7913 }
7914}
7915
7916#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7918pub struct BufferCopy {
7919 pub src_offset: u64,
7920 pub dst_offset: u64,
7921 pub size: u64,
7922}
7923
7924impl<'a> From<&'a BufferCopy> for vks::core::VkBufferCopy {
7925 fn from(copy: &'a BufferCopy) -> Self {
7926 vks::core::VkBufferCopy {
7927 srcOffset: copy.src_offset,
7928 dstOffset: copy.dst_offset,
7929 size: copy.size,
7930 }
7931 }
7932}
7933
7934#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7936pub struct ImageSubresourceLayers {
7937 pub aspect_mask: ImageAspectFlags,
7938 pub mip_level: u32,
7939 pub base_array_layer: u32,
7940 pub layer_count: u32,
7941}
7942
7943impl<'a> From<&'a ImageSubresourceLayers> for vks::core::VkImageSubresourceLayers {
7944 fn from(layers: &'a ImageSubresourceLayers) -> Self {
7945 vks::core::VkImageSubresourceLayers {
7946 aspectMask: layers.aspect_mask.bits(),
7947 mipLevel: layers.mip_level,
7948 baseArrayLayer: layers.base_array_layer,
7949 layerCount: layers.layer_count,
7950 }
7951 }
7952}
7953
7954#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7956pub struct ImageCopy {
7957 pub src_subresource: ImageSubresourceLayers,
7958 pub src_offset: Offset3D,
7959 pub dst_subresource: ImageSubresourceLayers,
7960 pub dst_offset: Offset3D,
7961 pub extent: Extent3D,
7962}
7963
7964impl<'a> From<&'a ImageCopy> for vks::core::VkImageCopy {
7965 fn from(copy: &'a ImageCopy) -> Self {
7966 vks::core::VkImageCopy {
7967 srcSubresource: (©.src_subresource).into(),
7968 srcOffset: (©.src_offset).into(),
7969 dstSubresource: (©.dst_subresource).into(),
7970 dstOffset: (©.dst_offset).into(),
7971 extent: (©.extent).into(),
7972 }
7973 }
7974}
7975
7976#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
7978pub struct ImageBlit {
7979 pub src_subresource: ImageSubresourceLayers,
7980 pub src_offsets: [Offset3D; 2],
7981 pub dst_subresource: ImageSubresourceLayers,
7982 pub dst_offsets: [Offset3D; 2],
7983}
7984
7985impl<'a> From<&'a ImageBlit> for vks::core::VkImageBlit {
7986 fn from(blit: &'a ImageBlit) -> Self {
7987 let src_offsets = [(&blit.src_offsets[0]).into(), (&blit.src_offsets[1]).into()];
7988 let dst_offsets = [(&blit.dst_offsets[0]).into(), (&blit.dst_offsets[1]).into()];
7989
7990 vks::core::VkImageBlit {
7991 srcSubresource: (&blit.src_subresource).into(),
7992 srcOffsets: src_offsets,
7993 dstSubresource: (&blit.dst_subresource).into(),
7994 dstOffsets: dst_offsets,
7995 }
7996 }
7997}
7998
7999#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
8001pub struct BufferImageCopy {
8002 pub buffer_offset: u64,
8003 pub buffer_row_length: u32,
8004 pub buffer_image_height: u32,
8005 pub image_subresource: ImageSubresourceLayers,
8006 pub image_offset: Offset3D,
8007 pub image_extent: Extent3D,
8008}
8009
8010impl<'a> From<&'a BufferImageCopy> for vks::core::VkBufferImageCopy {
8011 fn from(copy: &'a BufferImageCopy) -> Self {
8012 vks::core::VkBufferImageCopy {
8013 bufferOffset: copy.buffer_offset,
8014 bufferRowLength: copy.buffer_row_length,
8015 bufferImageHeight: copy.buffer_image_height,
8016 imageSubresource: (©.image_subresource).into(),
8017 imageOffset: (©.image_offset).into(),
8018 imageExtent: (©.image_extent).into(),
8019 }
8020 }
8021}
8022
8023#[derive(Debug, Copy, Clone, PartialEq)]
8025pub enum ClearColorValue {
8026 Float32([f32; 4]),
8027 Int32([i32; 4]),
8028 UInt32([u32; 4]),
8029}
8030
8031impl<'a> From<&'a ClearColorValue> for vks::core::VkClearColorValue {
8032 fn from(value: &'a ClearColorValue) -> Self {
8033 match *value {
8034 ClearColorValue::Float32(value) => vks::core::VkClearColorValue { float32: value },
8035 ClearColorValue::Int32(value) => vks::core::VkClearColorValue { int32: value },
8036 ClearColorValue::UInt32(value) => vks::core::VkClearColorValue { uint32: value },
8037 }
8038 }
8039}
8040
8041#[derive(Debug, Copy, Clone, PartialEq)]
8043pub struct ClearDepthStencilValue {
8044 pub depth: f32,
8045 pub stencil: u32,
8046}
8047
8048impl<'a> From<&'a ClearDepthStencilValue> for vks::core::VkClearDepthStencilValue {
8049 fn from(value: &'a ClearDepthStencilValue) -> Self {
8050 vks::core::VkClearDepthStencilValue {
8051 depth: value.depth,
8052 stencil: value.stencil,
8053 }
8054 }
8055}
8056
8057#[derive(Debug, Copy, Clone, PartialEq)]
8059pub enum ClearValue {
8060 Color(ClearColorValue),
8061 DepthStencil(ClearDepthStencilValue),
8062}
8063
8064impl<'a> From<&'a ClearValue> for vks::core::VkClearValue {
8065 fn from(value: &'a ClearValue) -> Self {
8066 match *value {
8067 ClearValue::Color(ref value) => vks::core::VkClearValue { color: value.into() },
8068 ClearValue::DepthStencil(ref value) => vks::core::VkClearValue { depthStencil: value.into() },
8069 }
8070 }
8071}
8072
8073#[derive(Debug, Copy, Clone, PartialEq)]
8075pub struct ClearAttachment {
8076 pub aspect_mask: ImageAspectFlags,
8077 pub color_attachment: AttachmentIndex,
8078 pub clear_value: ClearValue,
8079}
8080
8081impl<'a> From<&'a ClearAttachment> for vks::core::VkClearAttachment {
8082 fn from(foobar: &'a ClearAttachment) -> Self {
8083 vks::core::VkClearAttachment {
8084 aspectMask: foobar.aspect_mask.bits(),
8085 colorAttachment: foobar.color_attachment.into(),
8086 clearValue: (&foobar.clear_value).into(),
8087 }
8088 }
8089}
8090
8091#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
8093pub struct ClearRect {
8094 pub rect: Rect2D,
8095 pub base_array_layer: u32,
8096 pub layer_count: u32,
8097}
8098
8099impl<'a> From<&'a ClearRect> for vks::core::VkClearRect {
8100 fn from(rect: &'a ClearRect) -> Self {
8101 vks::core::VkClearRect {
8102 rect: (&rect.rect).into(),
8103 baseArrayLayer: rect.base_array_layer,
8104 layerCount: rect.layer_count,
8105 }
8106 }
8107}
8108
8109#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
8111pub struct ImageResolve {
8112 pub src_subresource: ImageSubresourceLayers,
8113 pub src_offset: Offset3D,
8114 pub dst_subresource: ImageSubresourceLayers,
8115 pub dst_offset: Offset3D,
8116 pub extent: Extent3D,
8117}
8118
8119impl<'a> From<&'a ImageResolve> for vks::core::VkImageResolve {
8120 fn from(resolve: &'a ImageResolve) -> Self {
8121 vks::core::VkImageResolve {
8122 srcSubresource: (&resolve.src_subresource).into(),
8123 srcOffset: (&resolve.src_offset).into(),
8124 dstSubresource: (&resolve.dst_subresource).into(),
8125 dstOffset: (&resolve.dst_offset).into(),
8126 extent: (&resolve.extent).into(),
8127 }
8128 }
8129}
8130
8131gen_chain_struct! {
8132 name: MemoryBarrierChain [MemoryBarrierChainWrapper],
8133 query: MemoryBarrierChainQuery [MemoryBarrierChainQueryWrapper],
8134 vks: vks::core::VkMemoryBarrier,
8135 input: true,
8136 output: false,
8137}
8138
8139#[derive(Debug, Clone, PartialEq)]
8141pub struct MemoryBarrier {
8142 pub src_access_mask: AccessFlags,
8143 pub dst_access_mask: AccessFlags,
8144 pub chain: Option<MemoryBarrierChain>,
8145}
8146
8147#[derive(Debug)]
8148struct VkMemoryBarrierWrapper {
8149 pub vks_struct: vks::core::VkMemoryBarrier,
8150 chain: Option<MemoryBarrierChainWrapper>,
8151}
8152
8153impl VkMemoryBarrierWrapper {
8154 pub fn new(barrier: &MemoryBarrier, with_chain: bool) -> Self {
8155 let (pnext, chain) = MemoryBarrierChainWrapper::new_optional(&barrier.chain, with_chain);
8156
8157 VkMemoryBarrierWrapper {
8158 vks_struct: vks::core::VkMemoryBarrier {
8159 sType: vks::core::VK_STRUCTURE_TYPE_MEMORY_BARRIER,
8160 pNext: pnext,
8161 srcAccessMask: barrier.src_access_mask.bits(),
8162 dstAccessMask: barrier.dst_access_mask.bits(),
8163 },
8164 chain: chain,
8165 }
8166 }
8167}
8168
8169gen_chain_struct! {
8170 name: BufferMemoryBarrierChain [BufferMemoryBarrierChainWrapper],
8171 query: BufferMemoryBarrierChainQuery [BufferMemoryBarrierChainQueryWrapper],
8172 vks: vks::core::VkBufferMemoryBarrier,
8173 input: true,
8174 output: false,
8175}
8176
8177#[derive(Debug, Clone, PartialEq)]
8179pub struct BufferMemoryBarrier {
8180 pub src_access_mask: AccessFlags,
8181 pub dst_access_mask: AccessFlags,
8182 pub src_queue_family_index: QueueFamilyIndex,
8183 pub dst_queue_family_index: QueueFamilyIndex,
8184 pub buffer: Buffer,
8185 pub offset: u64,
8186 pub size: OptionalDeviceSize,
8187 pub chain: Option<BufferMemoryBarrierChain>,
8188}
8189
8190#[derive(Debug)]
8191struct VkBufferMemoryBarrierWrapper {
8192 pub vks_struct: vks::core::VkBufferMemoryBarrier,
8193 buffer: Buffer,
8194 chain: Option<BufferMemoryBarrierChainWrapper>,
8195}
8196
8197impl VkBufferMemoryBarrierWrapper {
8198 pub fn new(barrier: &BufferMemoryBarrier, with_chain: bool) -> Self {
8199 let (pnext, chain) = BufferMemoryBarrierChainWrapper::new_optional(&barrier.chain, with_chain);
8200
8201 VkBufferMemoryBarrierWrapper {
8202 vks_struct: vks::core::VkBufferMemoryBarrier {
8203 sType: vks::core::VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
8204 pNext: pnext,
8205 srcAccessMask: barrier.src_access_mask.bits(),
8206 dstAccessMask: barrier.dst_access_mask.bits(),
8207 srcQueueFamilyIndex: barrier.src_queue_family_index.into(),
8208 dstQueueFamilyIndex: barrier.dst_queue_family_index.into(),
8209 buffer: barrier.buffer.handle(),
8210 offset: barrier.offset,
8211 size: barrier.size.into(),
8212 },
8213 buffer: barrier.buffer.clone(),
8214 chain: chain,
8215 }
8216 }
8217}
8218
8219gen_chain_struct! {
8220 name: ImageMemoryBarrierChain [ImageMemoryBarrierChainWrapper],
8221 query: ImageMemoryBarrierChainQuery [ImageMemoryBarrierChainQueryWrapper],
8222 vks: vks::core::VkImageMemoryBarrier,
8223 input: true,
8224 output: false,
8225}
8226
8227#[derive(Debug, Clone, PartialEq)]
8229pub struct ImageMemoryBarrier {
8230 pub src_access_mask: AccessFlags,
8231 pub dst_access_mask: AccessFlags,
8232 pub old_layout: ImageLayout,
8233 pub new_layout: ImageLayout,
8234 pub src_queue_family_index: QueueFamilyIndex,
8235 pub dst_queue_family_index: QueueFamilyIndex,
8236 pub image: Image,
8237 pub subresource_range: ImageSubresourceRange,
8238 pub chain: Option<ImageMemoryBarrierChain>,
8239}
8240
8241#[derive(Debug)]
8242struct VkImageMemoryBarrierWrapper {
8243 pub vks_struct: vks::core::VkImageMemoryBarrier,
8244 image: Image,
8245 chain: Option<ImageMemoryBarrierChainWrapper>,
8246}
8247
8248impl VkImageMemoryBarrierWrapper {
8249 pub fn new(barrier: &ImageMemoryBarrier, with_chain: bool) -> Self {
8250 let (pnext, chain) = ImageMemoryBarrierChainWrapper::new_optional(&barrier.chain, with_chain);
8251
8252 VkImageMemoryBarrierWrapper {
8253 vks_struct: vks::core::VkImageMemoryBarrier {
8254 sType: vks::core::VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
8255 pNext: pnext,
8256 srcAccessMask: barrier.src_access_mask.bits(),
8257 dstAccessMask: barrier.dst_access_mask.bits(),
8258 oldLayout: barrier.old_layout.into(),
8259 newLayout: barrier.new_layout.into(),
8260 srcQueueFamilyIndex: barrier.src_queue_family_index.into(),
8261 dstQueueFamilyIndex: barrier.dst_queue_family_index.into(),
8262 image: barrier.image.handle(),
8263 subresourceRange: (&barrier.subresource_range).into(),
8264 },
8265 image: barrier.image.clone(),
8266 chain: chain,
8267 }
8268 }
8269}
8270
8271gen_chain_struct! {
8272 name: RenderPassBeginInfoChain [RenderPassBeginInfoChainWrapper],
8273 query: RenderPassBeginInfoChainQuery [RenderPassBeginInfoChainQueryWrapper],
8274 vks: vks::core::VkRenderPassBeginInfo,
8275 input: true,
8276 output: false,
8277}
8278
8279#[derive(Debug, Clone, PartialEq)]
8281pub struct RenderPassBeginInfo {
8282 pub render_pass: RenderPass,
8283 pub framebuffer: Framebuffer,
8284 pub render_area: Rect2D,
8285 pub clear_values: Vec<ClearValue>,
8286 pub chain: Option<RenderPassBeginInfoChain>,
8287}
8288
8289#[derive(Debug)]
8290struct VkRenderPassBeginInfoWrapper {
8291 pub vks_struct: vks::core::VkRenderPassBeginInfo,
8292 render_pass: RenderPass,
8293 framebuffer: Framebuffer,
8294 clear_values: Vec<vks::core::VkClearValue>,
8295 chain: Option<RenderPassBeginInfoChainWrapper>,
8296}
8297
8298impl VkRenderPassBeginInfoWrapper {
8299 pub fn new(begin_info: &RenderPassBeginInfo, with_chain: bool) -> Self {
8300 let clear_values: Vec<_> = begin_info.clear_values.iter().map(From::from).collect();
8301 let clear_values_ptr = if !clear_values.is_empty() {
8302 clear_values.as_ptr()
8303 }
8304 else {
8305 ptr::null()
8306 };
8307
8308 let (pnext, chain) = RenderPassBeginInfoChainWrapper::new_optional(&begin_info.chain, with_chain);
8309
8310 VkRenderPassBeginInfoWrapper {
8311 vks_struct: vks::core::VkRenderPassBeginInfo {
8312 sType: vks::core::VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
8313 pNext: pnext,
8314 renderPass: begin_info.render_pass.handle(),
8315 framebuffer: begin_info.framebuffer.handle(),
8316 renderArea: (&begin_info.render_area).into(),
8317 clearValueCount: clear_values.len() as u32,
8318 pClearValues: clear_values_ptr,
8319 },
8320 render_pass: begin_info.render_pass.clone(),
8321 framebuffer: begin_info.framebuffer.clone(),
8322 clear_values: clear_values,
8323 chain: chain,
8324 }
8325 }
8326}
8327
8328#[repr(C)]
8330#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
8331pub struct DispatchIndirectCommand {
8332 pub x: u32,
8333 pub y: u32,
8334 pub z: u32,
8335}
8336
8337#[repr(C)]
8339#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
8340pub struct DrawIndexedIndirectCommand {
8341 pub index_count: u32,
8342 pub instance_count: u32,
8343 pub first_index: u32,
8344 pub vertex_offset: i32,
8345 pub first_instance: u32,
8346}
8347
8348#[repr(C)]
8350#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
8351pub struct DrawIndirectCommand {
8352 pub vertex_count: u32,
8353 pub instance_count: u32,
8354 pub first_vertex: u32,
8355 pub first_instance: u32,
8356}