1mod 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#[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 SurfaceKhr,
60
61 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 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
158pub 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#[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}