1  #![allow(clippy::unreadable_literal)]
2  
3  /*
4   ***********************************************************************************************************************
5   *
6   *  Copyright (c) 2014-2019 Advanced Micro Devices, Inc. All Rights Reserved.
7   *
8   *  Permission is hereby granted, free of charge, to any person obtaining a copy
9   *  of this software and associated documentation files (the "Software"), to deal
10   *  in the Software without restriction, including without limitation the rights
11   *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12   *  copies of the Software, and to permit persons to whom the Software is
13   *  furnished to do so, subject to the following conditions:
14   *
15   *  The above copyright notice and this permission notice shall be included in all
16   *  copies or substantial portions of the Software.
17   *
18   *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19   *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20   *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21   *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22   *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23   *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24   *  SOFTWARE.
25   *
26   **********************************************************************************************************************/
27  
28  #[cfg(feature = "debug")]
29  use crate::prelude::debug_flags;
30  use crate::vk::*;
31  
32  use std::fmt;
33  use std::os::raw::*;
34  
35  // Extension: `VK_AMD_gpa_interface`
36  
37  #[repr(transparent)]
38  #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
39  pub struct GpaSqShaderStageFlags(pub(crate) Flags);
40  vk_bitflags_wrapped!(GpaSqShaderStageFlags, Flags);
41  #[cfg(feature = "debug")]
42  impl fmt::Debug for GpaSqShaderStageFlags {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result43      fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
44          const KNOWN: &[(Flags, &str)] = &[
45              (GpaSqShaderStageFlags::PS.0, "PS"),
46              (GpaSqShaderStageFlags::VS.0, "VS"),
47              (GpaSqShaderStageFlags::GS.0, "GS"),
48              (GpaSqShaderStageFlags::ES.0, "ES"),
49              (GpaSqShaderStageFlags::HS.0, "HS"),
50              (GpaSqShaderStageFlags::LS.0, "LS"),
51              (GpaSqShaderStageFlags::CS.0, "CS"),
52          ];
53          debug_flags(f, KNOWN, self.0)
54      }
55  }
56  impl GpaSqShaderStageFlags {
57      pub const PS: Self = Self(0b1);
58      pub const VS: Self = Self(0b10);
59      pub const GS: Self = Self(0b100);
60      pub const ES: Self = Self(0b1000);
61      pub const HS: Self = Self(0b10000);
62      pub const LS: Self = Self(0b100000);
63      pub const CS: Self = Self(0b1000000);
64  }
65  
66  impl StructureType {
67      pub const PHYSICAL_DEVICE_GPA_FEATURES_AMD: Self = Self(1000133000);
68      pub const PHYSICAL_DEVICE_GPA_PROPERTIES_AMD: Self = Self(1000133001);
69      pub const GPA_SAMPLE_BEGIN_INFO_AMD: Self = Self(1000133002);
70      pub const GPA_SESSION_CREATE_INFO_AMD: Self = Self(1000133003);
71      pub const GPA_DEVICE_CLOCK_MODE_INFO_AMD: Self = Self(1000133004);
72  }
73  
74  #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
75  #[cfg_attr(feature = "debug", derive(Debug))]
76  #[repr(transparent)]
77  pub struct GpaDeviceClockModeAmd(pub(crate) i32);
78  impl GpaDeviceClockModeAmd {
from_raw(x: i32) -> Self79      pub fn from_raw(x: i32) -> Self {
80          Self(x)
81      }
as_raw(self) -> i3282      pub fn as_raw(self) -> i32 {
83          self.0
84      }
85  }
86  impl GpaDeviceClockModeAmd {
87      pub const DEFAULT: Self = Self(0);
88      pub const QUERY: Self = Self(1);
89      pub const PROFILING: Self = Self(2);
90      pub const MIN_MEMORY: Self = Self(3);
91      pub const MIN_ENGINE: Self = Self(4);
92      pub const PEAK: Self = Self(5);
93  }
94  
95  #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
96  #[cfg_attr(feature = "debug", derive(Debug))]
97  #[repr(transparent)]
98  pub struct GpaPerfBlockAmd(pub(crate) i32);
99  impl GpaPerfBlockAmd {
from_raw(x: i32) -> Self100      pub fn from_raw(x: i32) -> Self {
101          Self(x)
102      }
as_raw(self) -> i32103      pub fn as_raw(self) -> i32 {
104          self.0
105      }
106  }
107  impl GpaPerfBlockAmd {
108      pub const CPF: Self = Self(0);
109      pub const IA: Self = Self(1);
110      pub const VGT: Self = Self(2);
111      pub const PA: Self = Self(3);
112      pub const SC: Self = Self(4);
113      pub const SPI: Self = Self(5);
114      pub const SQ: Self = Self(6);
115      pub const SX: Self = Self(7);
116      pub const TA: Self = Self(8);
117      pub const TD: Self = Self(9);
118      pub const TCP: Self = Self(10);
119      pub const TCC: Self = Self(11);
120      pub const TCA: Self = Self(12);
121      pub const DB: Self = Self(13);
122      pub const CB: Self = Self(14);
123      pub const GDS: Self = Self(15);
124      pub const SRBM: Self = Self(16);
125      pub const GRBM: Self = Self(17);
126      pub const GRBM_SE: Self = Self(18);
127      pub const RLC: Self = Self(19);
128      pub const DMA: Self = Self(20);
129      pub const MC: Self = Self(21);
130      pub const CPG: Self = Self(22);
131      pub const CPC: Self = Self(23);
132      pub const WD: Self = Self(24);
133      pub const TCS: Self = Self(25);
134      pub const ATC: Self = Self(26);
135      pub const ATC_L2: Self = Self(27);
136      pub const MC_VM_L2: Self = Self(28);
137      pub const EA: Self = Self(29);
138      pub const RPB: Self = Self(30);
139      pub const RMI: Self = Self(31);
140  }
141  
142  #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
143  #[cfg_attr(feature = "debug", derive(Debug))]
144  #[repr(transparent)]
145  pub struct GpaSampleTypeAmd(pub(crate) i32);
146  impl GpaSampleTypeAmd {
from_raw(x: i32) -> Self147      pub fn from_raw(x: i32) -> Self {
148          Self(x)
149      }
as_raw(self) -> i32150      pub fn as_raw(self) -> i32 {
151          self.0
152      }
153  }
154  impl GpaSampleTypeAmd {
155      pub const CUMULATIVE: Self = Self(0);
156      pub const TRACE: Self = Self(1);
157      pub const TIMING: Self = Self(2);
158  }
159  
160  handle_nondispatchable!(GpaSessionAmd, UNKNOWN);
161  
162  #[repr(C)]
163  #[derive(Copy, Clone)]
164  #[cfg_attr(feature = "debug", derive(Debug))]
165  pub struct GpaSessionCreateInfoAmd {
166      pub s_type: StructureType,
167      pub p_next: *const c_void,
168      pub secondary_copy_source: GpaSessionAmd,
169  }
170  
171  #[repr(C)]
172  #[derive(Copy, Clone)]
173  #[cfg_attr(feature = "debug", derive(Debug))]
174  pub struct GpaPerfBlockPropertiesAmd {
175      pub block_type: GpaPerfBlockAmd,
176      pub flags: Flags,
177      pub instance_count: u32,
178      pub max_event_id: u32,
179      pub max_global_only_counters: u32,
180      pub max_global_shared_counters: u32,
181      pub max_streaming_counters: u32,
182  }
183  
184  #[repr(C)]
185  #[derive(Copy, Clone)]
186  #[cfg_attr(feature = "debug", derive(Debug))]
187  pub struct PhysicalDeviceGpaFeaturesAmd {
188      pub s_type: StructureType,
189      pub p_next: *const c_void,
190      pub perf_counters: Bool32,
191      pub streaming_perf_counters: Bool32,
192      pub sq_thread_tracing: Bool32,
193      pub clock_modes: Bool32,
194  }
195  
196  #[repr(C)]
197  #[derive(Copy, Clone)]
198  #[cfg_attr(feature = "debug", derive(Debug))]
199  pub struct PhysicalDeviceGpaPropertiesAmd {
200      pub s_type: StructureType,
201      pub p_next: *const c_void,
202      pub flags: Flags,
203      pub max_sqtt_se_buffer_size: DeviceSize,
204      pub shader_engine_count: u32,
205      pub perf_block_count: u32,
206      pub p_perf_block_properties: *mut GpaPerfBlockPropertiesAmd,
207  }
208  
209  impl ::std::default::Default for PhysicalDeviceGpaPropertiesAmd {
default() -> Self210      fn default() -> Self {
211          Self {
212              s_type: StructureType::PHYSICAL_DEVICE_GPA_PROPERTIES_AMD,
213              p_next: ::std::ptr::null_mut(),
214              flags: Flags::default(),
215              max_sqtt_se_buffer_size: DeviceSize::default(),
216              shader_engine_count: u32::default(),
217              perf_block_count: u32::default(),
218              p_perf_block_properties: ::std::ptr::null_mut(),
219          }
220      }
221  }
222  impl PhysicalDeviceGpaPropertiesAmd {
builder<'a>() -> PhysicalDeviceGpaPropertiesAmdBuilder<'a>223      pub fn builder<'a>() -> PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
224          PhysicalDeviceGpaPropertiesAmdBuilder {
225              inner: Self::default(),
226              marker: ::std::marker::PhantomData,
227          }
228      }
229  }
230  pub struct PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
231      inner: PhysicalDeviceGpaPropertiesAmd,
232      marker: ::std::marker::PhantomData<&'a ()>,
233  }
234  pub unsafe trait ExtendsPhysicalDeviceGpaPropertiesAmd {}
235  unsafe impl ExtendsPhysicalDeviceProperties2 for PhysicalDeviceGpaPropertiesAmd {}
236  impl<'a> ::std::ops::Deref for PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
237      type Target = PhysicalDeviceGpaPropertiesAmd;
deref(&self) -> &Self::Target238      fn deref(&self) -> &Self::Target {
239          &self.inner
240      }
241  }
242  impl<'a> PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
push_next<T>(mut self, next: &'a mut T) -> PhysicalDeviceGpaPropertiesAmdBuilder<'a> where T: ExtendsPhysicalDeviceGpaPropertiesAmd,243      pub fn push_next<T>(mut self, next: &'a mut T) -> PhysicalDeviceGpaPropertiesAmdBuilder<'a>
244      where
245          T: ExtendsPhysicalDeviceGpaPropertiesAmd,
246      {
247          unsafe {
248              let next_ptr = <*const T>::cast(next);
249              let last_next = ptr_chain_iter(next).last().unwrap();
250              (*last_next).p_next = self.inner.p_next as _;
251              self.inner.p_next = next_ptr;
252          }
253          self
254      }
build(self) -> PhysicalDeviceGpaPropertiesAmd255      pub fn build(self) -> PhysicalDeviceGpaPropertiesAmd {
256          self.inner
257      }
258  }
259  
260  #[repr(C)]
261  #[derive(Copy, Clone)]
262  #[cfg_attr(feature = "debug", derive(Debug))]
263  pub struct GpaPerfCounterAmd {
264      pub block_type: GpaPerfBlockAmd,
265      pub block_instance: u32,
266      pub event_id: u32,
267  }
268  
269  #[repr(C)]
270  #[derive(Copy, Clone)]
271  #[cfg_attr(feature = "debug", derive(Debug))]
272  pub struct GpaSampleBeginInfoAmd {
273      pub s_type: StructureType,
274      pub p_next: *const c_void,
275      pub sample_type: GpaSampleTypeAmd,
276      pub sample_internal_operations: Bool32,
277      pub cache_flush_on_counter_collection: Bool32,
278      pub sq_shader_mask_enable: Bool32,
279      pub sq_shader_mask: GpaSqShaderStageFlags,
280      pub perf_counter_count: u32,
281      pub p_perf_counters: *const GpaPerfCounterAmd,
282      pub streaming_perf_trace_sample_interval: u32,
283      pub perf_counter_device_memory_limit: DeviceSize,
284      pub sq_thread_trace_enable: Bool32,
285      pub sq_thread_trace_suppress_instruction_tokens: Bool32,
286      pub sq_thread_trace_device_memory_limit: DeviceSize,
287      pub timing_pre_sample: PipelineStageFlags,
288      pub timing_post_sample: PipelineStageFlags,
289  }
290  
291  #[repr(C)]
292  #[derive(Copy, Clone)]
293  #[cfg_attr(feature = "debug", derive(Debug))]
294  pub struct GpaDeviceClockModeInfoAmd {
295      pub s_type: StructureType,
296      pub p_next: *const c_void,
297      pub clock_mode: GpaDeviceClockModeAmd,
298      pub memory_clock_ratio_to_peak: f32,
299      pub engine_clock_ratio_to_peak: f32,
300  }
301  
302  #[allow(non_camel_case_types)]
303  pub type PFN_vkCreateGpaSessionAMD = extern "system" fn(
304      device: Device,
305      p_create_info: *const GpaSessionCreateInfoAmd,
306      p_allocator: *const AllocationCallbacks,
307      p_gpa_session: *mut GpaSessionAmd,
308  ) -> Result;
309  
310  #[allow(non_camel_case_types)]
311  pub type PFN_vkDestroyGpaSessionAMD = extern "system" fn(
312      device: Device,
313      gpa_session: GpaSessionAmd,
314      p_allocator: *const AllocationCallbacks,
315  ) -> c_void;
316  
317  #[allow(non_camel_case_types)]
318  pub type PFN_vkSetGpaDeviceClockModeAMD =
319      extern "system" fn(device: Device, p_info: *mut GpaDeviceClockModeInfoAmd) -> Result;
320  
321  #[allow(non_camel_case_types)]
322  pub type PFN_vkCmdBeginGpaSessionAMD =
323      extern "system" fn(commandBuffer: CommandBuffer, gpa_session: GpaSessionAmd) -> Result;
324  
325  #[allow(non_camel_case_types)]
326  pub type PFN_vkCmdEndGpaSessionAMD =
327      extern "system" fn(commandBuffer: CommandBuffer, gpa_session: GpaSessionAmd) -> Result;
328  
329  #[allow(non_camel_case_types)]
330  pub type PFN_vkCmdBeginGpaSampleAMD = extern "system" fn(
331      commandBuffer: CommandBuffer,
332      gpa_session: GpaSessionAmd,
333      p_gpa_sample_begin_info: *const GpaSampleBeginInfoAmd,
334      p_sample_id: *mut u32,
335  ) -> Result;
336  
337  #[allow(non_camel_case_types)]
338  pub type PFN_vkCmdEndGpaSampleAMD = extern "system" fn(
339      commandBuffer: CommandBuffer,
340      gpa_session: GpaSessionAmd,
341      sample_id: u32,
342  ) -> c_void;
343  
344  #[allow(non_camel_case_types)]
345  pub type PFN_vkGetGpaSessionStatusAMD =
346      extern "system" fn(device: Device, gpaSession: GpaSessionAmd) -> Result;
347  
348  #[allow(non_camel_case_types)]
349  pub type PFN_vkGetGpaSessionResultsAMD = extern "system" fn(
350      device: Device,
351      gpaSession: GpaSessionAmd,
352      sample_id: u32,
353      p_size_in_bytes: *mut usize,
354      p_data: *mut c_void,
355  ) -> Result;
356  
357  #[allow(non_camel_case_types)]
358  pub type PFN_vkResetGpaSessionAMD =
359      extern "system" fn(device: Device, gpaSession: GpaSessionAmd) -> Result;
360  
361  #[allow(non_camel_case_types)]
362  pub type PFN_vkCmdCopyGpaSessionResultsAMD =
363      extern "system" fn(commandBuffer: CommandBuffer, gpaSession: GpaSessionAmd) -> c_void;
364  
365  pub struct AmdGpaInterfaceFn {
366      pub create_gpa_session: PFN_vkCreateGpaSessionAMD,
367      pub destroy_gpa_session: PFN_vkDestroyGpaSessionAMD,
368      pub set_gpa_device_clock_mode: PFN_vkSetGpaDeviceClockModeAMD,
369      pub cmd_begin_gpa_session: PFN_vkCmdBeginGpaSessionAMD,
370      pub cmd_end_gpa_session: PFN_vkCmdEndGpaSessionAMD,
371      pub cmd_begin_gpa_sample: PFN_vkCmdBeginGpaSampleAMD,
372      pub cmd_end_gpa_sample: PFN_vkCmdEndGpaSampleAMD,
373      pub get_gpa_session_status: PFN_vkGetGpaSessionStatusAMD,
374      pub get_gpa_session_results: PFN_vkGetGpaSessionResultsAMD,
375      pub reset_gpa_session: PFN_vkResetGpaSessionAMD,
376      pub cmd_copy_gpa_session_results: PFN_vkCmdCopyGpaSessionResultsAMD,
377  }
378  unsafe impl Send for AmdGpaInterfaceFn {}
379  unsafe impl Sync for AmdGpaInterfaceFn {}
380  
381  impl ::std::clone::Clone for AmdGpaInterfaceFn {
clone(&self) -> Self382      fn clone(&self) -> Self {
383          Self {
384              create_gpa_session: self.create_gpa_session,
385              destroy_gpa_session: self.destroy_gpa_session,
386              set_gpa_device_clock_mode: self.set_gpa_device_clock_mode,
387              cmd_begin_gpa_session: self.cmd_begin_gpa_session,
388              cmd_end_gpa_session: self.cmd_end_gpa_session,
389              cmd_begin_gpa_sample: self.cmd_begin_gpa_sample,
390              cmd_end_gpa_sample: self.cmd_end_gpa_sample,
391              get_gpa_session_status: self.get_gpa_session_status,
392              get_gpa_session_results: self.get_gpa_session_results,
393              reset_gpa_session: self.reset_gpa_session,
394              cmd_copy_gpa_session_results: self.cmd_copy_gpa_session_results,
395          }
396      }
397  }
398  
399  impl AmdGpaInterfaceFn {
load<F>(mut _f: F) -> Self where F: FnMut(&::std::ffi::CStr) -> *const c_void,400      pub fn load<F>(mut _f: F) -> Self
401      where
402          F: FnMut(&::std::ffi::CStr) -> *const c_void,
403      {
404          Self {
405              create_gpa_session: unsafe {
406                  extern "system" fn create_gpa_session_amd(
407                      _device: Device,
408                      _p_create_info: *const GpaSessionCreateInfoAmd,
409                      _p_allocator: *const AllocationCallbacks,
410                      _p_gpa_session: *mut GpaSessionAmd,
411                  ) -> Result {
412                      panic!(concat!(
413                          "Unable to load ",
414                          stringify!(create_gpa_session_amd)
415                      ))
416                  }
417                  let cname =
418                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkCreateGpaSessionAMD\0");
419                  let val = _f(cname);
420                  if val.is_null() {
421                      create_gpa_session_amd
422                  } else {
423                      ::std::mem::transmute(val)
424                  }
425              },
426              destroy_gpa_session: unsafe {
427                  extern "system" fn destroy_gpa_session_amd(
428                      _device: Device,
429                      _gpa_session: GpaSessionAmd,
430                      _p_allocator: *const AllocationCallbacks,
431                  ) -> c_void {
432                      panic!(concat!(
433                          "Unable to load ",
434                          stringify!(destroy_gpa_session_amd)
435                      ))
436                  }
437                  let cname =
438                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkDestroyGpaSessionAMD\0");
439                  let val = _f(cname);
440                  if val.is_null() {
441                      destroy_gpa_session_amd
442                  } else {
443                      ::std::mem::transmute(val)
444                  }
445              },
446              set_gpa_device_clock_mode: unsafe {
447                  extern "system" fn set_gpa_device_clock_mode_amd(
448                      _device: Device,
449                      _p_info: *mut GpaDeviceClockModeInfoAmd,
450                  ) -> Result {
451                      panic!(concat!(
452                          "Unable to load ",
453                          stringify!(set_gpa_device_clock_mode_amd)
454                      ))
455                  }
456                  let cname = ::std::ffi::CStr::from_bytes_with_nul_unchecked(
457                      b"vkSetGpaDeviceClockModeAMD\0",
458                  );
459                  let val = _f(cname);
460                  if val.is_null() {
461                      set_gpa_device_clock_mode_amd
462                  } else {
463                      ::std::mem::transmute(val)
464                  }
465              },
466              cmd_begin_gpa_session: unsafe {
467                  extern "system" fn cmd_begin_gpa_session_amd(
468                      _command_buffer: CommandBuffer,
469                      _gpa_session: GpaSessionAmd,
470                  ) -> Result {
471                      panic!(concat!(
472                          "Unable to load ",
473                          stringify!(cmd_begin_gpa_session_amd)
474                      ))
475                  }
476                  let cname =
477                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkCmdBeginGpaSessionAMD\0");
478                  let val = _f(cname);
479                  if val.is_null() {
480                      cmd_begin_gpa_session_amd
481                  } else {
482                      ::std::mem::transmute(val)
483                  }
484              },
485              cmd_end_gpa_session: unsafe {
486                  extern "system" fn cmd_end_gpa_session_amd(
487                      _command_buffer: CommandBuffer,
488                      _gpa_session: GpaSessionAmd,
489                  ) -> Result {
490                      panic!(concat!(
491                          "Unable to load ",
492                          stringify!(cmd_end_gpa_session_amd)
493                      ))
494                  }
495                  let cname =
496                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkCmdEndGpaSessionAMD\0");
497                  let val = _f(cname);
498                  if val.is_null() {
499                      cmd_end_gpa_session_amd
500                  } else {
501                      ::std::mem::transmute(val)
502                  }
503              },
504              cmd_begin_gpa_sample: unsafe {
505                  extern "system" fn cmd_begin_gpa_sample_amd(
506                      _command_buffer: CommandBuffer,
507                      _gpa_session: GpaSessionAmd,
508                      _p_gpa_sample_begin_info: *const GpaSampleBeginInfoAmd,
509                      _p_sample_id: *mut u32,
510                  ) -> Result {
511                      panic!(concat!(
512                          "Unable to load ",
513                          stringify!(cmd_begin_gpa_sample_amd)
514                      ))
515                  }
516                  let cname =
517                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkCmdBeginGpaSampleAMD\0");
518                  let val = _f(cname);
519                  if val.is_null() {
520                      cmd_begin_gpa_sample_amd
521                  } else {
522                      ::std::mem::transmute(val)
523                  }
524              },
525              cmd_end_gpa_sample: unsafe {
526                  extern "system" fn cmd_end_gpa_sample_amd(
527                      _command_buffer: CommandBuffer,
528                      _gpa_session: GpaSessionAmd,
529                      _sample_id: u32,
530                  ) -> c_void {
531                      panic!(concat!(
532                          "Unable to load ",
533                          stringify!(cmd_end_gpa_sample_amd)
534                      ))
535                  }
536                  let cname =
537                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkCmdEndGpaSampleAMD\0");
538                  let val = _f(cname);
539                  if val.is_null() {
540                      cmd_end_gpa_sample_amd
541                  } else {
542                      ::std::mem::transmute(val)
543                  }
544              },
545              get_gpa_session_status: unsafe {
546                  extern "system" fn get_gpa_session_status_amd(
547                      _device: Device,
548                      _gpa_session: GpaSessionAmd,
549                  ) -> Result {
550                      panic!(concat!(
551                          "Unable to load ",
552                          stringify!(get_gpa_session_status_amd)
553                      ))
554                  }
555                  let cname =
556                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkGetGpaSessionStatusAMD\0");
557                  let val = _f(cname);
558                  if val.is_null() {
559                      get_gpa_session_status_amd
560                  } else {
561                      ::std::mem::transmute(val)
562                  }
563              },
564              get_gpa_session_results: unsafe {
565                  extern "system" fn get_gpa_session_results_amd(
566                      _device: Device,
567                      _gpa_session: GpaSessionAmd,
568                      _sample_id: u32,
569                      _p_size_in_bytes: *mut usize,
570                      _p_data: *mut c_void,
571                  ) -> Result {
572                      panic!(concat!(
573                          "Unable to load ",
574                          stringify!(get_gpa_session_results_amd)
575                      ))
576                  }
577                  let cname =
578                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkGetGpaSessionResultsAMD\0");
579                  let val = _f(cname);
580                  if val.is_null() {
581                      get_gpa_session_results_amd
582                  } else {
583                      ::std::mem::transmute(val)
584                  }
585              },
586              reset_gpa_session: unsafe {
587                  extern "system" fn reset_gpa_session_amd(
588                      _device: Device,
589                      _gpa_session: GpaSessionAmd,
590                  ) -> Result {
591                      panic!(concat!(
592                          "Unable to load ",
593                          stringify!(reset_gpa_session_amd)
594                      ))
595                  }
596                  let cname =
597                      ::std::ffi::CStr::from_bytes_with_nul_unchecked(b"vkCmdEndGpaSampleAMD\0");
598                  let val = _f(cname);
599                  if val.is_null() {
600                      reset_gpa_session_amd
601                  } else {
602                      ::std::mem::transmute(val)
603                  }
604              },
605              cmd_copy_gpa_session_results: unsafe {
606                  extern "system" fn cmd_copy_gpa_session_results_amd(
607                      _command_buffer: CommandBuffer,
608                      _gpa_session: GpaSessionAmd,
609                  ) -> c_void {
610                      panic!(concat!(
611                          "Unable to load ",
612                          stringify!(cmd_copy_gpa_session_results_amd)
613                      ))
614                  }
615                  let cname = ::std::ffi::CStr::from_bytes_with_nul_unchecked(
616                      b"vkCmdCopyGpaSessionResultsAMD\0",
617                  );
618                  let val = _f(cname);
619                  if val.is_null() {
620                      cmd_copy_gpa_session_results_amd
621                  } else {
622                      ::std::mem::transmute(val)
623                  }
624              },
625          }
626      }
create_gpa_session( &self, device: Device, create_info: *const GpaSessionCreateInfoAmd, allocator: *const AllocationCallbacks, gpa_session: *mut GpaSessionAmd, ) -> Result627      pub unsafe fn create_gpa_session(
628          &self,
629          device: Device,
630          create_info: *const GpaSessionCreateInfoAmd,
631          allocator: *const AllocationCallbacks,
632          gpa_session: *mut GpaSessionAmd,
633      ) -> Result {
634          (self.create_gpa_session)(device, create_info, allocator, gpa_session)
635      }
destroy_gpa_session( &self, device: Device, gpa_session: GpaSessionAmd, allocator: *const AllocationCallbacks, ) -> c_void636      pub unsafe fn destroy_gpa_session(
637          &self,
638          device: Device,
639          gpa_session: GpaSessionAmd,
640          allocator: *const AllocationCallbacks,
641      ) -> c_void {
642          (self.destroy_gpa_session)(device, gpa_session, allocator)
643      }
644  }
645  
646  // Extension: `VK_AMD_wave_limits`
647  
648  impl StructureType {
649      pub const WAVE_LIMIT_AMD: Self = Self(1000045000);
650      pub const PHYSICAL_DEVICE_WAVE_LIMIT_PROPERTIES_AMD: Self = Self(1000045001);
651  }
652  
653  #[repr(C)]
654  #[derive(Copy, Clone)]
655  #[cfg_attr(feature = "debug", derive(Debug))]
656  pub struct PhysicalDeviceWaveLimitPropertiesAmd {
657      pub s_type: StructureType,
658      pub p_next: *const c_void,
659      pub cu_count: u32,
660      pub max_waves_per_cu: u32,
661  }
662  
663  impl ::std::default::Default for PhysicalDeviceWaveLimitPropertiesAmd {
default() -> Self664      fn default() -> Self {
665          Self {
666              s_type: StructureType::PHYSICAL_DEVICE_WAVE_LIMIT_PROPERTIES_AMD,
667              p_next: ::std::ptr::null_mut(),
668              cu_count: u32::default(),
669              max_waves_per_cu: u32::default(),
670          }
671      }
672  }
673  impl PhysicalDeviceWaveLimitPropertiesAmd {
builder<'a>() -> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a>674      pub fn builder<'a>() -> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
675          PhysicalDeviceWaveLimitPropertiesAmdBuilder {
676              inner: Self::default(),
677              marker: ::std::marker::PhantomData,
678          }
679      }
680  }
681  pub struct PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
682      inner: PhysicalDeviceWaveLimitPropertiesAmd,
683      marker: ::std::marker::PhantomData<&'a ()>,
684  }
685  pub unsafe trait ExtendsPhysicalDeviceWaveLimitPropertiesAmd {}
686  unsafe impl ExtendsPhysicalDeviceProperties2 for PhysicalDeviceWaveLimitPropertiesAmd {}
687  impl<'a> ::std::ops::Deref for PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
688      type Target = PhysicalDeviceWaveLimitPropertiesAmd;
deref(&self) -> &Self::Target689      fn deref(&self) -> &Self::Target {
690          &self.inner
691      }
692  }
693  impl<'a> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
push_next<T>( mut self, next: &'a mut T, ) -> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> where T: ExtendsPhysicalDeviceWaveLimitPropertiesAmd,694      pub fn push_next<T>(
695          mut self,
696          next: &'a mut T,
697      ) -> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a>
698      where
699          T: ExtendsPhysicalDeviceWaveLimitPropertiesAmd,
700      {
701          unsafe {
702              let next_ptr = <*const T>::cast(next);
703              let last_next = ptr_chain_iter(next).last().unwrap();
704              (*last_next).p_next = self.inner.p_next as _;
705              self.inner.p_next = next_ptr;
706          }
707          self
708      }
build(self) -> PhysicalDeviceWaveLimitPropertiesAmd709      pub fn build(self) -> PhysicalDeviceWaveLimitPropertiesAmd {
710          self.inner
711      }
712  }
713  
714  #[repr(C)]
715  #[derive(Copy, Clone)]
716  #[cfg_attr(feature = "debug", derive(Debug))]
717  pub struct PipelineShaderStageCreateInfoWaveLimitAmd {
718      pub s_type: StructureType,
719      pub p_next: *const c_void,
720      pub waves_per_cu: f32,
721      pub cu_enable_mask: *mut u32,
722  }
723