dacite/
ext_validation_flags.rs

1// Copyright (c) 2017, Dennis Hamester <dennis.hamester@startmail.com>
2//
3// Permission to use, copy, modify, and/or distribute this software for any
4// purpose with or without fee is hereby granted, provided that the above
5// copyright notice and this permission notice appear in all copies.
6//
7// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
8// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
9// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
11// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
12// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13// PERFORMANCE OF THIS SOFTWARE.
14
15//! See extension [`VK_EXT_validation_flags`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VK_EXT_validation_flags)
16
17use std::ptr;
18use vks;
19
20/// See [`VkValidationCheckEXT`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkValidationCheckEXT)
21#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
22pub enum ValidationCheckExt {
23    All,
24    Unknown(vks::ext_validation_flags::VkValidationCheckEXT),
25}
26
27impl From<ValidationCheckExt> for vks::ext_validation_flags::VkValidationCheckEXT {
28    fn from(check: ValidationCheckExt) -> Self {
29        match check {
30            ValidationCheckExt::All => vks::ext_validation_flags::VK_VALIDATION_CHECK_ALL_EXT,
31            ValidationCheckExt::Unknown(check) => check,
32        }
33    }
34}
35
36gen_chain_struct! {
37    name: ValidationFlagsChainExt [ValidationFlagsChainExtWrapper],
38    query: ValidationFlagsChainQueryExt [ValidationFlagsChainQueryExtWrapper],
39    vks: vks::ext_validation_flags::VkValidationFlagsEXT,
40    input: true,
41    output: false,
42}
43
44/// See [`VkValidationFlagsEXT`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkValidationFlagsEXT)
45#[derive(Debug, Clone, PartialEq)]
46pub struct ValidationFlagsExt {
47    pub disabled_validation_checks: Vec<ValidationCheckExt>,
48    pub chain: Option<ValidationFlagsChainExt>,
49}
50
51#[derive(Debug)]
52pub(crate) struct VkValidationFlagsEXTWrapper {
53    pub vks_struct: vks::ext_validation_flags::VkValidationFlagsEXT,
54    vk_disabled_validation_checks: Vec<vks::ext_validation_flags::VkValidationCheckEXT>,
55    chain: Option<ValidationFlagsChainExtWrapper>,
56}
57
58impl VkValidationFlagsEXTWrapper {
59    pub fn new(flags: &ValidationFlagsExt, with_chain: bool) -> Self {
60        let vk_disabled_validation_checks: Vec<_> = flags.disabled_validation_checks.iter().cloned().map(From::from).collect();
61        let vk_disabled_validation_checks_ptr = if !vk_disabled_validation_checks.is_empty() {
62            vk_disabled_validation_checks.as_ptr() as _
63        }
64        else {
65            ptr::null_mut()
66        };
67
68        let (pnext, chain) = ValidationFlagsChainExtWrapper::new_optional(&flags.chain, with_chain);
69
70        VkValidationFlagsEXTWrapper {
71            vks_struct: vks::ext_validation_flags::VkValidationFlagsEXT {
72                sType: vks::core::VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT,
73                pNext: pnext,
74                disabledValidationCheckCount: vk_disabled_validation_checks.len() as u32,
75                pDisabledValidationChecks: vk_disabled_validation_checks_ptr,
76            },
77            vk_disabled_validation_checks: vk_disabled_validation_checks,
78            chain: chain,
79        }
80    }
81}