gfx_backend_vulkan/
conv.rs

1use crate::native as n;
2
3use ash::vk;
4
5use hal::{
6    buffer, command, format, image, memory,
7    memory::Segment,
8    pass, pso, query,
9    window::{CompositeAlphaMode, PresentMode},
10    IndexType,
11};
12
13use std::mem;
14
15pub fn map_format(format: format::Format) -> vk::Format {
16    vk::Format::from_raw(format as i32)
17}
18
19pub fn map_vk_format(vk_format: vk::Format) -> Option<format::Format> {
20    if (vk_format.as_raw() as usize) < format::NUM_FORMATS && vk_format != vk::Format::UNDEFINED {
21        Some(unsafe { mem::transmute(vk_format) })
22    } else {
23        None
24    }
25}
26
27pub fn map_tiling(tiling: image::Tiling) -> vk::ImageTiling {
28    vk::ImageTiling::from_raw(tiling as i32)
29}
30
31pub fn map_component(component: format::Component) -> vk::ComponentSwizzle {
32    use hal::format::Component::*;
33    match component {
34        Zero => vk::ComponentSwizzle::ZERO,
35        One => vk::ComponentSwizzle::ONE,
36        R => vk::ComponentSwizzle::R,
37        G => vk::ComponentSwizzle::G,
38        B => vk::ComponentSwizzle::B,
39        A => vk::ComponentSwizzle::A,
40    }
41}
42
43pub fn map_swizzle(swizzle: format::Swizzle) -> vk::ComponentMapping {
44    vk::ComponentMapping {
45        r: map_component(swizzle.0),
46        g: map_component(swizzle.1),
47        b: map_component(swizzle.2),
48        a: map_component(swizzle.3),
49    }
50}
51
52pub fn map_index_type(index_type: IndexType) -> vk::IndexType {
53    match index_type {
54        IndexType::U16 => vk::IndexType::UINT16,
55        IndexType::U32 => vk::IndexType::UINT32,
56    }
57}
58
59pub fn map_image_layout(layout: image::Layout) -> vk::ImageLayout {
60    use hal::image::Layout as Il;
61    match layout {
62        Il::General => vk::ImageLayout::GENERAL,
63        Il::ColorAttachmentOptimal => vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
64        Il::DepthStencilAttachmentOptimal => vk::ImageLayout::DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
65        Il::DepthStencilReadOnlyOptimal => vk::ImageLayout::DEPTH_STENCIL_READ_ONLY_OPTIMAL,
66        Il::ShaderReadOnlyOptimal => vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL,
67        Il::TransferSrcOptimal => vk::ImageLayout::TRANSFER_SRC_OPTIMAL,
68        Il::TransferDstOptimal => vk::ImageLayout::TRANSFER_DST_OPTIMAL,
69        Il::Undefined => vk::ImageLayout::UNDEFINED,
70        Il::Preinitialized => vk::ImageLayout::PREINITIALIZED,
71        Il::Present => vk::ImageLayout::PRESENT_SRC_KHR,
72    }
73}
74
75pub fn map_image_aspects(aspects: format::Aspects) -> vk::ImageAspectFlags {
76    vk::ImageAspectFlags::from_raw(aspects.bits() as u32)
77}
78
79pub fn map_offset(offset: image::Offset) -> vk::Offset3D {
80    vk::Offset3D {
81        x: offset.x,
82        y: offset.y,
83        z: offset.z,
84    }
85}
86
87pub fn map_extent(offset: image::Extent) -> vk::Extent3D {
88    vk::Extent3D {
89        width: offset.width,
90        height: offset.height,
91        depth: offset.depth,
92    }
93}
94
95pub fn map_subresource(sub: &image::Subresource) -> vk::ImageSubresource {
96    vk::ImageSubresource {
97        aspect_mask: map_image_aspects(sub.aspects),
98        mip_level: sub.level as _,
99        array_layer: sub.layer as _,
100    }
101}
102
103pub fn map_subresource_layers(sub: &image::SubresourceLayers) -> vk::ImageSubresourceLayers {
104    vk::ImageSubresourceLayers {
105        aspect_mask: map_image_aspects(sub.aspects),
106        mip_level: sub.level as _,
107        base_array_layer: sub.layers.start as _,
108        layer_count: (sub.layers.end - sub.layers.start) as _,
109    }
110}
111
112pub fn map_subresource_range(range: &image::SubresourceRange) -> vk::ImageSubresourceRange {
113    vk::ImageSubresourceRange {
114        aspect_mask: map_image_aspects(range.aspects),
115        base_mip_level: range.level_start as _,
116        level_count: range
117            .level_count
118            .map_or(vk::REMAINING_MIP_LEVELS, |c| c as _),
119        base_array_layer: range.layer_start as _,
120        layer_count: range
121            .layer_count
122            .map_or(vk::REMAINING_ARRAY_LAYERS, |c| c as _),
123    }
124}
125
126pub fn map_attachment_load_op(op: pass::AttachmentLoadOp) -> vk::AttachmentLoadOp {
127    use hal::pass::AttachmentLoadOp as Alo;
128    match op {
129        Alo::Load => vk::AttachmentLoadOp::LOAD,
130        Alo::Clear => vk::AttachmentLoadOp::CLEAR,
131        Alo::DontCare => vk::AttachmentLoadOp::DONT_CARE,
132    }
133}
134
135pub fn map_attachment_store_op(op: pass::AttachmentStoreOp) -> vk::AttachmentStoreOp {
136    use hal::pass::AttachmentStoreOp as Aso;
137    match op {
138        Aso::Store => vk::AttachmentStoreOp::STORE,
139        Aso::DontCare => vk::AttachmentStoreOp::DONT_CARE,
140    }
141}
142
143pub fn map_buffer_access(access: buffer::Access) -> vk::AccessFlags {
144    vk::AccessFlags::from_raw(access.bits())
145}
146
147pub fn map_image_access(access: image::Access) -> vk::AccessFlags {
148    vk::AccessFlags::from_raw(access.bits())
149}
150
151pub fn map_pipeline_stage(stage: pso::PipelineStage) -> vk::PipelineStageFlags {
152    vk::PipelineStageFlags::from_raw(stage.bits())
153}
154
155pub fn map_buffer_usage(usage: buffer::Usage) -> vk::BufferUsageFlags {
156    vk::BufferUsageFlags::from_raw(usage.bits())
157}
158
159pub fn map_buffer_create_flags(sparse: memory::SparseFlags) -> vk::BufferCreateFlags {
160    vk::BufferCreateFlags::from_raw(sparse.bits())
161}
162
163pub fn map_image_usage(usage: image::Usage) -> vk::ImageUsageFlags {
164    vk::ImageUsageFlags::from_raw(usage.bits())
165}
166
167pub fn map_vk_image_usage(usage: vk::ImageUsageFlags) -> image::Usage {
168    image::Usage::from_bits_truncate(usage.as_raw())
169}
170
171pub fn map_descriptor_type(ty: pso::DescriptorType) -> vk::DescriptorType {
172    match ty {
173        pso::DescriptorType::Sampler => vk::DescriptorType::SAMPLER,
174        pso::DescriptorType::Image { ty } => match ty {
175            pso::ImageDescriptorType::Sampled { with_sampler } => match with_sampler {
176                true => vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
177                false => vk::DescriptorType::SAMPLED_IMAGE,
178            },
179            pso::ImageDescriptorType::Storage { .. } => vk::DescriptorType::STORAGE_IMAGE,
180        },
181        pso::DescriptorType::Buffer { ty, format } => match ty {
182            pso::BufferDescriptorType::Storage { .. } => match format {
183                pso::BufferDescriptorFormat::Structured { dynamic_offset } => {
184                    match dynamic_offset {
185                        true => vk::DescriptorType::STORAGE_BUFFER_DYNAMIC,
186                        false => vk::DescriptorType::STORAGE_BUFFER,
187                    }
188                }
189                pso::BufferDescriptorFormat::Texel => vk::DescriptorType::STORAGE_TEXEL_BUFFER,
190            },
191            pso::BufferDescriptorType::Uniform => match format {
192                pso::BufferDescriptorFormat::Structured { dynamic_offset } => {
193                    match dynamic_offset {
194                        true => vk::DescriptorType::UNIFORM_BUFFER_DYNAMIC,
195                        false => vk::DescriptorType::UNIFORM_BUFFER,
196                    }
197                }
198                pso::BufferDescriptorFormat::Texel => vk::DescriptorType::UNIFORM_TEXEL_BUFFER,
199            },
200        },
201        pso::DescriptorType::InputAttachment => vk::DescriptorType::INPUT_ATTACHMENT,
202    }
203}
204
205pub fn map_stage_flags(stages: pso::ShaderStageFlags) -> vk::ShaderStageFlags {
206    vk::ShaderStageFlags::from_raw(stages.bits())
207}
208
209pub fn map_filter(filter: image::Filter) -> vk::Filter {
210    vk::Filter::from_raw(filter as i32)
211}
212
213pub fn map_mip_filter(filter: image::Filter) -> vk::SamplerMipmapMode {
214    vk::SamplerMipmapMode::from_raw(filter as i32)
215}
216
217pub fn map_wrap(wrap: image::WrapMode) -> vk::SamplerAddressMode {
218    use hal::image::WrapMode as Wm;
219    match wrap {
220        Wm::Tile => vk::SamplerAddressMode::REPEAT,
221        Wm::Mirror => vk::SamplerAddressMode::MIRRORED_REPEAT,
222        Wm::Clamp => vk::SamplerAddressMode::CLAMP_TO_EDGE,
223        Wm::Border => vk::SamplerAddressMode::CLAMP_TO_BORDER,
224        Wm::MirrorClamp => vk::SamplerAddressMode::MIRROR_CLAMP_TO_EDGE,
225    }
226}
227
228pub fn map_reduction(reduction: image::ReductionMode) -> vk::SamplerReductionMode {
229    use hal::image::ReductionMode as Rm;
230    match reduction {
231        Rm::WeightedAverage => vk::SamplerReductionMode::WEIGHTED_AVERAGE,
232        Rm::Minimum => vk::SamplerReductionMode::MIN,
233        Rm::Maximum => vk::SamplerReductionMode::MAX,
234    }
235}
236
237pub fn map_border_color(border_color: image::BorderColor) -> vk::BorderColor {
238    match border_color {
239        image::BorderColor::TransparentBlack => vk::BorderColor::FLOAT_TRANSPARENT_BLACK,
240        image::BorderColor::OpaqueBlack => vk::BorderColor::FLOAT_OPAQUE_BLACK,
241        image::BorderColor::OpaqueWhite => vk::BorderColor::FLOAT_OPAQUE_WHITE,
242    }
243}
244
245pub fn map_topology(ia: &pso::InputAssemblerDesc) -> vk::PrimitiveTopology {
246    match (ia.primitive, ia.with_adjacency) {
247        (pso::Primitive::PointList, false) => vk::PrimitiveTopology::POINT_LIST,
248        (pso::Primitive::PointList, true) => panic!("Points can't have adjacency info"),
249        (pso::Primitive::LineList, false) => vk::PrimitiveTopology::LINE_LIST,
250        (pso::Primitive::LineList, true) => vk::PrimitiveTopology::LINE_LIST_WITH_ADJACENCY,
251        (pso::Primitive::LineStrip, false) => vk::PrimitiveTopology::LINE_STRIP,
252        (pso::Primitive::LineStrip, true) => vk::PrimitiveTopology::LINE_STRIP_WITH_ADJACENCY,
253        (pso::Primitive::TriangleList, false) => vk::PrimitiveTopology::TRIANGLE_LIST,
254        (pso::Primitive::TriangleList, true) => vk::PrimitiveTopology::TRIANGLE_LIST_WITH_ADJACENCY,
255        (pso::Primitive::TriangleStrip, false) => vk::PrimitiveTopology::TRIANGLE_STRIP,
256        (pso::Primitive::TriangleStrip, true) => {
257            vk::PrimitiveTopology::TRIANGLE_STRIP_WITH_ADJACENCY
258        }
259        (pso::Primitive::PatchList(_), false) => vk::PrimitiveTopology::PATCH_LIST,
260        (pso::Primitive::PatchList(_), true) => panic!("Patches can't have adjacency info"),
261    }
262}
263
264pub fn map_cull_face(cf: pso::Face) -> vk::CullModeFlags {
265    match cf {
266        pso::Face::NONE => vk::CullModeFlags::NONE,
267        pso::Face::FRONT => vk::CullModeFlags::FRONT,
268        pso::Face::BACK => vk::CullModeFlags::BACK,
269        _ => vk::CullModeFlags::FRONT_AND_BACK,
270    }
271}
272
273pub fn map_front_face(ff: pso::FrontFace) -> vk::FrontFace {
274    match ff {
275        pso::FrontFace::Clockwise => vk::FrontFace::CLOCKWISE,
276        pso::FrontFace::CounterClockwise => vk::FrontFace::COUNTER_CLOCKWISE,
277    }
278}
279
280pub fn map_comparison(fun: pso::Comparison) -> vk::CompareOp {
281    use hal::pso::Comparison::*;
282    match fun {
283        Never => vk::CompareOp::NEVER,
284        Less => vk::CompareOp::LESS,
285        LessEqual => vk::CompareOp::LESS_OR_EQUAL,
286        Equal => vk::CompareOp::EQUAL,
287        GreaterEqual => vk::CompareOp::GREATER_OR_EQUAL,
288        Greater => vk::CompareOp::GREATER,
289        NotEqual => vk::CompareOp::NOT_EQUAL,
290        Always => vk::CompareOp::ALWAYS,
291    }
292}
293
294pub fn map_stencil_op(op: pso::StencilOp) -> vk::StencilOp {
295    use hal::pso::StencilOp::*;
296    match op {
297        Keep => vk::StencilOp::KEEP,
298        Zero => vk::StencilOp::ZERO,
299        Replace => vk::StencilOp::REPLACE,
300        IncrementClamp => vk::StencilOp::INCREMENT_AND_CLAMP,
301        IncrementWrap => vk::StencilOp::INCREMENT_AND_WRAP,
302        DecrementClamp => vk::StencilOp::DECREMENT_AND_CLAMP,
303        DecrementWrap => vk::StencilOp::DECREMENT_AND_WRAP,
304        Invert => vk::StencilOp::INVERT,
305    }
306}
307
308pub fn map_stencil_side(side: &pso::StencilFace) -> vk::StencilOpState {
309    vk::StencilOpState {
310        fail_op: map_stencil_op(side.op_fail),
311        pass_op: map_stencil_op(side.op_pass),
312        depth_fail_op: map_stencil_op(side.op_depth_fail),
313        compare_op: map_comparison(side.fun),
314        compare_mask: !0,
315        write_mask: !0,
316        reference: 0,
317    }
318}
319
320pub fn map_blend_factor(factor: pso::Factor) -> vk::BlendFactor {
321    use hal::pso::Factor::*;
322    match factor {
323        Zero => vk::BlendFactor::ZERO,
324        One => vk::BlendFactor::ONE,
325        SrcColor => vk::BlendFactor::SRC_COLOR,
326        OneMinusSrcColor => vk::BlendFactor::ONE_MINUS_SRC_COLOR,
327        DstColor => vk::BlendFactor::DST_COLOR,
328        OneMinusDstColor => vk::BlendFactor::ONE_MINUS_DST_COLOR,
329        SrcAlpha => vk::BlendFactor::SRC_ALPHA,
330        OneMinusSrcAlpha => vk::BlendFactor::ONE_MINUS_SRC_ALPHA,
331        DstAlpha => vk::BlendFactor::DST_ALPHA,
332        OneMinusDstAlpha => vk::BlendFactor::ONE_MINUS_DST_ALPHA,
333        ConstColor => vk::BlendFactor::CONSTANT_COLOR,
334        OneMinusConstColor => vk::BlendFactor::ONE_MINUS_CONSTANT_COLOR,
335        ConstAlpha => vk::BlendFactor::CONSTANT_ALPHA,
336        OneMinusConstAlpha => vk::BlendFactor::ONE_MINUS_CONSTANT_ALPHA,
337        SrcAlphaSaturate => vk::BlendFactor::SRC_ALPHA_SATURATE,
338        Src1Color => vk::BlendFactor::SRC1_COLOR,
339        OneMinusSrc1Color => vk::BlendFactor::ONE_MINUS_SRC1_COLOR,
340        Src1Alpha => vk::BlendFactor::SRC1_ALPHA,
341        OneMinusSrc1Alpha => vk::BlendFactor::ONE_MINUS_SRC1_ALPHA,
342    }
343}
344
345pub fn map_blend_op(operation: pso::BlendOp) -> (vk::BlendOp, vk::BlendFactor, vk::BlendFactor) {
346    use hal::pso::BlendOp::*;
347    match operation {
348        Add { src, dst } => (
349            vk::BlendOp::ADD,
350            map_blend_factor(src),
351            map_blend_factor(dst),
352        ),
353        Sub { src, dst } => (
354            vk::BlendOp::SUBTRACT,
355            map_blend_factor(src),
356            map_blend_factor(dst),
357        ),
358        RevSub { src, dst } => (
359            vk::BlendOp::REVERSE_SUBTRACT,
360            map_blend_factor(src),
361            map_blend_factor(dst),
362        ),
363        Min => (
364            vk::BlendOp::MIN,
365            vk::BlendFactor::ZERO,
366            vk::BlendFactor::ZERO,
367        ),
368        Max => (
369            vk::BlendOp::MAX,
370            vk::BlendFactor::ZERO,
371            vk::BlendFactor::ZERO,
372        ),
373    }
374}
375
376pub fn map_pipeline_statistics(
377    statistics: query::PipelineStatistic,
378) -> vk::QueryPipelineStatisticFlags {
379    vk::QueryPipelineStatisticFlags::from_raw(statistics.bits())
380}
381
382pub fn map_query_control_flags(flags: query::ControlFlags) -> vk::QueryControlFlags {
383    // Safe due to equivalence of HAL values and Vulkan values
384    vk::QueryControlFlags::from_raw(flags.bits() & vk::QueryControlFlags::all().as_raw())
385}
386
387pub fn map_query_result_flags(flags: query::ResultFlags) -> vk::QueryResultFlags {
388    vk::QueryResultFlags::from_raw(flags.bits() & vk::QueryResultFlags::all().as_raw())
389}
390
391pub fn map_image_features(
392    features: vk::FormatFeatureFlags,
393    supports_transfer_bits: bool,
394    supports_sampler_filter_minmax: bool,
395) -> format::ImageFeature {
396    let mut mapped_flags = format::ImageFeature::empty();
397    if features.contains(vk::FormatFeatureFlags::SAMPLED_IMAGE) {
398        mapped_flags |= format::ImageFeature::SAMPLED;
399    }
400    if features.contains(vk::FormatFeatureFlags::SAMPLED_IMAGE_FILTER_LINEAR) {
401        mapped_flags |= format::ImageFeature::SAMPLED_LINEAR;
402    }
403    if supports_sampler_filter_minmax
404        && features.contains(vk::FormatFeatureFlags::SAMPLED_IMAGE_FILTER_MINMAX)
405    {
406        mapped_flags |= format::ImageFeature::SAMPLED_MINMAX;
407    }
408
409    if features.contains(vk::FormatFeatureFlags::STORAGE_IMAGE) {
410        mapped_flags |= format::ImageFeature::STORAGE;
411        mapped_flags |= format::ImageFeature::STORAGE_READ_WRITE;
412    }
413    if features.contains(vk::FormatFeatureFlags::STORAGE_IMAGE_ATOMIC) {
414        mapped_flags |= format::ImageFeature::STORAGE_ATOMIC;
415    }
416
417    if features.contains(vk::FormatFeatureFlags::COLOR_ATTACHMENT) {
418        mapped_flags |= format::ImageFeature::COLOR_ATTACHMENT;
419    }
420    if features.contains(vk::FormatFeatureFlags::COLOR_ATTACHMENT_BLEND) {
421        mapped_flags |= format::ImageFeature::COLOR_ATTACHMENT_BLEND;
422    }
423    if features.contains(vk::FormatFeatureFlags::DEPTH_STENCIL_ATTACHMENT) {
424        mapped_flags |= format::ImageFeature::DEPTH_STENCIL_ATTACHMENT;
425    }
426
427    if features.contains(vk::FormatFeatureFlags::BLIT_SRC) {
428        mapped_flags |= format::ImageFeature::BLIT_SRC;
429        if !supports_transfer_bits {
430            mapped_flags |= format::ImageFeature::TRANSFER_SRC;
431        }
432    }
433    if features.contains(vk::FormatFeatureFlags::BLIT_DST) {
434        mapped_flags |= format::ImageFeature::BLIT_DST;
435        if !supports_transfer_bits {
436            mapped_flags |= format::ImageFeature::TRANSFER_DST;
437        }
438    }
439    if supports_transfer_bits {
440        if features.contains(vk::FormatFeatureFlags::TRANSFER_SRC) {
441            mapped_flags |= format::ImageFeature::TRANSFER_SRC;
442        }
443        if features.contains(vk::FormatFeatureFlags::TRANSFER_DST) {
444            mapped_flags |= format::ImageFeature::TRANSFER_DST;
445        }
446    }
447
448    mapped_flags
449}
450
451pub fn map_buffer_features(features: vk::FormatFeatureFlags) -> format::BufferFeature {
452    format::BufferFeature::from_bits_truncate(features.as_raw())
453}
454
455pub fn map_memory_range<'a>((memory, segment): (&'a n::Memory, Segment)) -> vk::MappedMemoryRange {
456    vk::MappedMemoryRange::builder()
457        .memory(memory.raw)
458        .offset(segment.offset)
459        .size(segment.size.unwrap_or(vk::WHOLE_SIZE))
460        .build()
461}
462
463pub fn map_command_buffer_flags(flags: command::CommandBufferFlags) -> vk::CommandBufferUsageFlags {
464    // Safe due to equivalence of HAL values and Vulkan values
465    vk::CommandBufferUsageFlags::from_raw(flags.bits())
466}
467
468pub fn map_command_buffer_level(level: command::Level) -> vk::CommandBufferLevel {
469    match level {
470        command::Level::Primary => vk::CommandBufferLevel::PRIMARY,
471        command::Level::Secondary => vk::CommandBufferLevel::SECONDARY,
472    }
473}
474
475pub fn map_view_kind(
476    kind: image::ViewKind,
477    ty: vk::ImageType,
478    is_cube: bool,
479) -> Option<vk::ImageViewType> {
480    use crate::image::ViewKind::*;
481    use crate::vk::ImageType;
482
483    Some(match (ty, kind) {
484        (ImageType::TYPE_1D, D1) => vk::ImageViewType::TYPE_1D,
485        (ImageType::TYPE_1D, D1Array) => vk::ImageViewType::TYPE_1D_ARRAY,
486        (ImageType::TYPE_2D, D2) => vk::ImageViewType::TYPE_2D,
487        (ImageType::TYPE_2D, D2Array) => vk::ImageViewType::TYPE_2D_ARRAY,
488        (ImageType::TYPE_3D, D3) => vk::ImageViewType::TYPE_3D,
489        (ImageType::TYPE_2D, Cube) if is_cube => vk::ImageViewType::CUBE,
490        (ImageType::TYPE_2D, CubeArray) if is_cube => vk::ImageViewType::CUBE_ARRAY,
491        (ImageType::TYPE_3D, Cube) if is_cube => vk::ImageViewType::CUBE,
492        (ImageType::TYPE_3D, CubeArray) if is_cube => vk::ImageViewType::CUBE_ARRAY,
493        _ => return None,
494    })
495}
496
497pub fn map_rect(rect: &pso::Rect) -> vk::Rect2D {
498    vk::Rect2D {
499        offset: vk::Offset2D {
500            x: rect.x as _,
501            y: rect.y as _,
502        },
503        extent: vk::Extent2D {
504            width: rect.w as _,
505            height: rect.h as _,
506        },
507    }
508}
509
510pub fn map_clear_rect(rect: &pso::ClearRect) -> vk::ClearRect {
511    vk::ClearRect {
512        base_array_layer: rect.layers.start as _,
513        layer_count: (rect.layers.end - rect.layers.start) as _,
514        rect: map_rect(&rect.rect),
515    }
516}
517
518pub fn map_viewport(vp: &pso::Viewport, flip_y: bool, shift_y: bool) -> vk::Viewport {
519    vk::Viewport {
520        x: vp.rect.x as _,
521        y: if shift_y {
522            vp.rect.y + vp.rect.h
523        } else {
524            vp.rect.y
525        } as _,
526        width: vp.rect.w as _,
527        height: if flip_y { -vp.rect.h } else { vp.rect.h } as _,
528        min_depth: vp.depth.start,
529        max_depth: vp.depth.end,
530    }
531}
532
533pub fn map_view_capabilities(caps: image::ViewCapabilities) -> vk::ImageCreateFlags {
534    vk::ImageCreateFlags::from_raw(caps.bits())
535}
536
537pub fn map_view_capabilities_sparse(
538    sparse: memory::SparseFlags,
539    caps: image::ViewCapabilities,
540) -> vk::ImageCreateFlags {
541    vk::ImageCreateFlags::from_raw(sparse.bits() | caps.bits())
542}
543
544pub fn map_present_mode(mode: PresentMode) -> vk::PresentModeKHR {
545    if mode == PresentMode::IMMEDIATE {
546        vk::PresentModeKHR::IMMEDIATE
547    } else if mode == PresentMode::MAILBOX {
548        vk::PresentModeKHR::MAILBOX
549    } else if mode == PresentMode::FIFO {
550        vk::PresentModeKHR::FIFO
551    } else if mode == PresentMode::RELAXED {
552        vk::PresentModeKHR::FIFO_RELAXED
553    } else {
554        panic!("Unexpected present mode {:?}", mode)
555    }
556}
557
558pub fn map_vk_present_mode(mode: vk::PresentModeKHR) -> PresentMode {
559    if mode == vk::PresentModeKHR::IMMEDIATE {
560        PresentMode::IMMEDIATE
561    } else if mode == vk::PresentModeKHR::MAILBOX {
562        PresentMode::MAILBOX
563    } else if mode == vk::PresentModeKHR::FIFO {
564        PresentMode::FIFO
565    } else if mode == vk::PresentModeKHR::FIFO_RELAXED {
566        PresentMode::RELAXED
567    } else {
568        warn!("Unrecognized present mode {:?}", mode);
569        PresentMode::IMMEDIATE
570    }
571}
572
573pub fn map_composite_alpha_mode(
574    composite_alpha_mode: CompositeAlphaMode,
575) -> vk::CompositeAlphaFlagsKHR {
576    vk::CompositeAlphaFlagsKHR::from_raw(composite_alpha_mode.bits())
577}
578
579pub fn map_vk_composite_alpha(composite_alpha: vk::CompositeAlphaFlagsKHR) -> CompositeAlphaMode {
580    CompositeAlphaMode::from_bits_truncate(composite_alpha.as_raw())
581}
582
583pub fn map_descriptor_pool_create_flags(
584    flags: pso::DescriptorPoolCreateFlags,
585) -> vk::DescriptorPoolCreateFlags {
586    vk::DescriptorPoolCreateFlags::from_raw(flags.bits())
587}
588
589pub fn map_sample_count_flags(samples: image::NumSamples) -> vk::SampleCountFlags {
590    vk::SampleCountFlags::from_raw((samples as u32) & vk::SampleCountFlags::all().as_raw())
591}
592
593pub fn map_vk_memory_properties(flags: vk::MemoryPropertyFlags) -> hal::memory::Properties {
594    use crate::memory::Properties;
595    let mut properties = Properties::empty();
596
597    if flags.contains(vk::MemoryPropertyFlags::DEVICE_LOCAL) {
598        properties |= Properties::DEVICE_LOCAL;
599    }
600    if flags.contains(vk::MemoryPropertyFlags::HOST_VISIBLE) {
601        properties |= Properties::CPU_VISIBLE;
602    }
603    if flags.contains(vk::MemoryPropertyFlags::HOST_COHERENT) {
604        properties |= Properties::COHERENT;
605    }
606    if flags.contains(vk::MemoryPropertyFlags::HOST_CACHED) {
607        properties |= Properties::CPU_CACHED;
608    }
609    if flags.contains(vk::MemoryPropertyFlags::LAZILY_ALLOCATED) {
610        properties |= Properties::LAZILY_ALLOCATED;
611    }
612
613    properties
614}
615
616pub fn map_vk_memory_heap_flags(flags: vk::MemoryHeapFlags) -> hal::memory::HeapFlags {
617    use hal::memory::HeapFlags;
618    let mut hal_flags = HeapFlags::empty();
619
620    if flags.contains(vk::MemoryHeapFlags::DEVICE_LOCAL) {
621        hal_flags |= HeapFlags::DEVICE_LOCAL;
622    }
623
624    hal_flags
625}