dacite/ext_debug_report/
mod.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_debug_report`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VK_EXT_debug_report)
16
17mod callback_helper;
18mod debug_report_callback;
19
20use self::callback_helper::CallbackHelper;
21use std::fmt;
22use std::sync::Arc;
23use vks;
24
25pub use self::debug_report_callback::{DebugReportCallbackExt, FromNativeDebugReportCallbackExtParameters};
26
27/// See [`VkDebugReportObjectTypeEXT`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkDebugReportObjectTypeEXT)
28#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
29pub enum DebugReportObjectTypeExt {
30    Unknown,
31    Instance,
32    PhysicalDevice,
33    Device,
34    Queue,
35    Semaphore,
36    CommandBuffer,
37    Fence,
38    DeviceMemory,
39    Buffer,
40    Image,
41    Event,
42    QueryPool,
43    BufferView,
44    ImageView,
45    ShaderModule,
46    PipelineCache,
47    PipelineLayout,
48    RenderPass,
49    Pipeline,
50    DescriptorSetLayout,
51    Sampler,
52    DescriptorPool,
53    DescriptorSet,
54    Framebuffer,
55    CommandPool,
56    DebugReport,
57
58    /// See extension [`VK_KHR_surface`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VK_KHR_surface)
59    SurfaceKhr,
60
61    /// See extension [`VK_KHR_swapchain`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VK_KHR_swapchain)
62    SwapchainKhr,
63
64    UnknownValue(vks::ext_debug_report::VkDebugReportObjectTypeEXT),
65}
66
67impl From<vks::ext_debug_report::VkDebugReportObjectTypeEXT> for DebugReportObjectTypeExt {
68    fn from(ty: vks::ext_debug_report::VkDebugReportObjectTypeEXT) -> Self {
69        match ty {
70            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT => DebugReportObjectTypeExt::Unknown,
71            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT => DebugReportObjectTypeExt::Instance,
72            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT => DebugReportObjectTypeExt::PhysicalDevice,
73            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT => DebugReportObjectTypeExt::Device,
74            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT => DebugReportObjectTypeExt::Queue,
75            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT => DebugReportObjectTypeExt::Semaphore,
76            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT => DebugReportObjectTypeExt::CommandBuffer,
77            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT => DebugReportObjectTypeExt::Fence,
78            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT => DebugReportObjectTypeExt::DeviceMemory,
79            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT => DebugReportObjectTypeExt::Buffer,
80            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT => DebugReportObjectTypeExt::Image,
81            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT => DebugReportObjectTypeExt::Event,
82            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT => DebugReportObjectTypeExt::QueryPool,
83            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT => DebugReportObjectTypeExt::BufferView,
84            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT => DebugReportObjectTypeExt::ImageView,
85            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT => DebugReportObjectTypeExt::ShaderModule,
86            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT => DebugReportObjectTypeExt::PipelineCache,
87            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT => DebugReportObjectTypeExt::PipelineLayout,
88            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT => DebugReportObjectTypeExt::RenderPass,
89            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT => DebugReportObjectTypeExt::Pipeline,
90            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT => DebugReportObjectTypeExt::DescriptorSetLayout,
91            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT => DebugReportObjectTypeExt::Sampler,
92            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT => DebugReportObjectTypeExt::DescriptorPool,
93            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT => DebugReportObjectTypeExt::DescriptorSet,
94            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT => DebugReportObjectTypeExt::Framebuffer,
95            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT => DebugReportObjectTypeExt::CommandPool,
96            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT => DebugReportObjectTypeExt::DebugReport,
97            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT => DebugReportObjectTypeExt::SurfaceKhr,
98            vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT => DebugReportObjectTypeExt::SwapchainKhr,
99            _ => DebugReportObjectTypeExt::UnknownValue(ty),
100        }
101    }
102}
103
104impl From<DebugReportObjectTypeExt> for vks::ext_debug_report::VkDebugReportObjectTypeEXT {
105    fn from(ty: DebugReportObjectTypeExt) -> Self {
106        match ty {
107            DebugReportObjectTypeExt::Unknown => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,
108            DebugReportObjectTypeExt::Instance => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT,
109            DebugReportObjectTypeExt::PhysicalDevice => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT,
110            DebugReportObjectTypeExt::Device => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
111            DebugReportObjectTypeExt::Queue => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT,
112            DebugReportObjectTypeExt::Semaphore => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT,
113            DebugReportObjectTypeExt::CommandBuffer => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
114            DebugReportObjectTypeExt::Fence => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT,
115            DebugReportObjectTypeExt::DeviceMemory => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
116            DebugReportObjectTypeExt::Buffer => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT,
117            DebugReportObjectTypeExt::Image => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT,
118            DebugReportObjectTypeExt::Event => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT,
119            DebugReportObjectTypeExt::QueryPool => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT,
120            DebugReportObjectTypeExt::BufferView => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT,
121            DebugReportObjectTypeExt::ImageView => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT,
122            DebugReportObjectTypeExt::ShaderModule => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT,
123            DebugReportObjectTypeExt::PipelineCache => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT,
124            DebugReportObjectTypeExt::PipelineLayout => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT,
125            DebugReportObjectTypeExt::RenderPass => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT,
126            DebugReportObjectTypeExt::Pipeline => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
127            DebugReportObjectTypeExt::DescriptorSetLayout => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT,
128            DebugReportObjectTypeExt::Sampler => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT,
129            DebugReportObjectTypeExt::DescriptorPool => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT,
130            DebugReportObjectTypeExt::DescriptorSet => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
131            DebugReportObjectTypeExt::Framebuffer => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT,
132            DebugReportObjectTypeExt::CommandPool => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT,
133            DebugReportObjectTypeExt::DebugReport => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT,
134            DebugReportObjectTypeExt::SurfaceKhr => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT,
135            DebugReportObjectTypeExt::SwapchainKhr => vks::ext_debug_report::VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT,
136            DebugReportObjectTypeExt::UnknownValue(ty) => ty,
137        }
138    }
139}
140
141dacite_bitflags! {
142    /// See [`VkDebugReportFlagBitsEXT`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkDebugReportFlagBitsEXT)
143    pub struct DebugReportFlagsExt: vks::ext_debug_report::VkDebugReportFlagsEXT;
144    pub enum DebugReportFlagBitsExt: vks::ext_debug_report::VkDebugReportFlagBitsEXT;
145    max_enum: vks::ext_debug_report::VK_DEBUG_REPORT_FLAG_BITS_MAX_ENUM_EXT;
146
147    flags {
148        const INFORMATION [Information] = vks::ext_debug_report::VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
149        const WARNING [Warning] = vks::ext_debug_report::VK_DEBUG_REPORT_WARNING_BIT_EXT;
150        const PERFORMANCE_WARNING [PerformanceWarning] = vks::ext_debug_report::VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
151        const ERROR [Error] = vks::ext_debug_report::VK_DEBUG_REPORT_ERROR_BIT_EXT;
152        const DEBUG [Debug] = vks::ext_debug_report::VK_DEBUG_REPORT_DEBUG_BIT_EXT;
153    }
154
155    no_bits {}
156}
157
158/// See [`PFN_vkDebugReportCallbackEXT`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#PFN_vkDebugReportCallbackEXT)
159pub trait DebugReportCallbacksExt: Send + Sync + fmt::Debug {
160    #[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
161    fn callback(&self, flags: DebugReportFlagsExt, object_type: DebugReportObjectTypeExt, object: u64, location: usize, message_code: i32, layer_prefix: Option<&str>, message: Option<&str>) -> bool;
162}
163
164gen_chain_struct! {
165    name: DebugReportCallbackCreateInfoChainExt [DebugReportCallbackCreateInfoChainWrapperExt],
166    query: DebugReportCallbackCreateInfoChainQueryExt [DebugReportCallbackCreateInfoChainQueryWrapperExt],
167    vks: vks::ext_debug_report::VkDebugReportCallbackCreateInfoEXT,
168    input: true,
169    output: false,
170}
171
172/// See [`VkDebugReportCallbackCreateInfoEXT`](https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VkDebugReportCallbackCreateInfoEXT)
173#[derive(Debug, Clone)]
174pub struct DebugReportCallbackCreateInfoExt {
175    pub flags: DebugReportFlagsExt,
176    pub callback: Arc<DebugReportCallbacksExt>,
177    pub chain: Option<DebugReportCallbackCreateInfoChainExt>,
178}
179
180impl PartialEq for DebugReportCallbackCreateInfoExt {
181    fn eq(&self, other: &Self) -> bool {
182        (self.flags == other.flags) &&
183        Arc::ptr_eq(&self.callback, &other.callback) &&
184        (self.chain == other.chain)
185    }
186}
187
188#[derive(Debug)]
189pub(crate) struct VkDebugReportCallbackCreateInfoEXTWrapper {
190    pub vks_struct: vks::ext_debug_report::VkDebugReportCallbackCreateInfoEXT,
191    pub callback_helper: CallbackHelper,
192    chain: Option<DebugReportCallbackCreateInfoChainWrapperExt>,
193}
194
195impl VkDebugReportCallbackCreateInfoEXTWrapper {
196    pub fn new(create_info: &DebugReportCallbackCreateInfoExt, with_chain: bool) -> Self {
197        let callback_helper = CallbackHelper::new(Arc::clone(&create_info.callback));
198        let (pnext, chain) = DebugReportCallbackCreateInfoChainWrapperExt::new_optional(&create_info.chain, with_chain);
199
200        VkDebugReportCallbackCreateInfoEXTWrapper {
201            vks_struct: vks::ext_debug_report::VkDebugReportCallbackCreateInfoEXT {
202                sType: vks::core::VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
203                pNext: pnext,
204                flags: create_info.flags.bits(),
205                pfnCallback: callback_helper.vks_callback,
206                pUserData: callback_helper.user_data,
207            },
208            callback_helper: callback_helper,
209            chain: chain,
210        }
211    }
212}