blob: 648f28f0358c6c3ba805e172eb31473c19645738 [file] [log] [blame]
#![allow(clippy::unreadable_literal)]
/*
***********************************************************************************************************************
*
* Copyright (c) 2014-2019 Advanced Micro Devices, Inc. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
**********************************************************************************************************************/
use crate::vk::*;
use std::fmt;
use std::os::raw::*;
// Extension: `VK_AMD_gpa_interface`
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct GpaSqShaderStageFlags(pub(crate) Flags);
vk_bitflags_wrapped!(
GpaSqShaderStageFlags,
0b1111111111111111111111111111111,
Flags
);
// ignore clippy::use_self false positives
// changing GpaSqShaderStageFlags::PS.0 to Self::PS.0 as suggested by clippy generates:
// error[E0401]: can't use generic parameters from outer function
#[allow(clippy::use_self)]
impl fmt::Debug for GpaSqShaderStageFlags {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
const KNOWN: &[(Flags, &str)] = &[
(GpaSqShaderStageFlags::PS.0, "PS"),
(GpaSqShaderStageFlags::VS.0, "VS"),
(GpaSqShaderStageFlags::GS.0, "GS"),
(GpaSqShaderStageFlags::ES.0, "ES"),
(GpaSqShaderStageFlags::HS.0, "HS"),
(GpaSqShaderStageFlags::LS.0, "LS"),
(GpaSqShaderStageFlags::CS.0, "CS"),
];
debug_flags(f, KNOWN, self.0)
}
}
impl GpaSqShaderStageFlags {
pub const PS: Self = Self(0b1);
pub const VS: Self = Self(0b10);
pub const GS: Self = Self(0b100);
pub const ES: Self = Self(0b1000);
pub const HS: Self = Self(0b10000);
pub const LS: Self = Self(0b100000);
pub const CS: Self = Self(0b1000000);
}
impl StructureType {
pub const PHYSICAL_DEVICE_GPA_FEATURES_AMD: Self = Self(1000133000);
pub const PHYSICAL_DEVICE_GPA_PROPERTIES_AMD: Self = Self(1000133001);
pub const GPA_SAMPLE_BEGIN_INFO_AMD: Self = Self(1000133002);
pub const GPA_SESSION_CREATE_INFO_AMD: Self = Self(1000133003);
pub const GPA_DEVICE_CLOCK_MODE_INFO_AMD: Self = Self(1000133004);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)]
pub struct GpaDeviceClockModeAmd(pub(crate) i32);
impl GpaDeviceClockModeAmd {
pub fn from_raw(x: i32) -> Self {
Self(x)
}
pub fn as_raw(self) -> i32 {
self.0
}
}
impl GpaDeviceClockModeAmd {
pub const DEFAULT: Self = Self(0);
pub const QUERY: Self = Self(1);
pub const PROFILING: Self = Self(2);
pub const MIN_MEMORY: Self = Self(3);
pub const MIN_ENGINE: Self = Self(4);
pub const PEAK: Self = Self(5);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)]
pub struct GpaPerfBlockAmd(pub(crate) i32);
impl GpaPerfBlockAmd {
pub fn from_raw(x: i32) -> Self {
Self(x)
}
pub fn as_raw(self) -> i32 {
self.0
}
}
impl GpaPerfBlockAmd {
pub const CPF: Self = Self(0);
pub const IA: Self = Self(1);
pub const VGT: Self = Self(2);
pub const PA: Self = Self(3);
pub const SC: Self = Self(4);
pub const SPI: Self = Self(5);
pub const SQ: Self = Self(6);
pub const SX: Self = Self(7);
pub const TA: Self = Self(8);
pub const TD: Self = Self(9);
pub const TCP: Self = Self(10);
pub const TCC: Self = Self(11);
pub const TCA: Self = Self(12);
pub const DB: Self = Self(13);
pub const CB: Self = Self(14);
pub const GDS: Self = Self(15);
pub const SRBM: Self = Self(16);
pub const GRBM: Self = Self(17);
pub const GRBM_SE: Self = Self(18);
pub const RLC: Self = Self(19);
pub const DMA: Self = Self(20);
pub const MC: Self = Self(21);
pub const CPG: Self = Self(22);
pub const CPC: Self = Self(23);
pub const WD: Self = Self(24);
pub const TCS: Self = Self(25);
pub const ATC: Self = Self(26);
pub const ATC_L2: Self = Self(27);
pub const MC_VM_L2: Self = Self(28);
pub const EA: Self = Self(29);
pub const RPB: Self = Self(30);
pub const RMI: Self = Self(31);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(transparent)]
pub struct GpaSampleTypeAmd(pub(crate) i32);
impl GpaSampleTypeAmd {
pub fn from_raw(x: i32) -> Self {
Self(x)
}
pub fn as_raw(self) -> i32 {
self.0
}
}
impl GpaSampleTypeAmd {
pub const CUMULATIVE: Self = Self(0);
pub const TRACE: Self = Self(1);
pub const TIMING: Self = Self(2);
}
handle_nondispatchable!(GpaSessionAmd, UNKNOWN);
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct GpaSessionCreateInfoAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub secondary_copy_source: GpaSessionAmd,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct GpaPerfBlockPropertiesAmd {
pub block_type: GpaPerfBlockAmd,
pub flags: Flags,
pub instance_count: u32,
pub max_event_id: u32,
pub max_global_only_counters: u32,
pub max_global_shared_counters: u32,
pub max_streaming_counters: u32,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct PhysicalDeviceGpaFeaturesAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub perf_counters: Bool32,
pub streaming_perf_counters: Bool32,
pub sq_thread_tracing: Bool32,
pub clock_modes: Bool32,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct PhysicalDeviceGpaPropertiesAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub flags: Flags,
pub max_sqtt_se_buffer_size: DeviceSize,
pub shader_engine_count: u32,
pub perf_block_count: u32,
pub p_perf_block_properties: *mut GpaPerfBlockPropertiesAmd,
}
impl ::std::default::Default for PhysicalDeviceGpaPropertiesAmd {
fn default() -> Self {
Self {
s_type: StructureType::PHYSICAL_DEVICE_GPA_PROPERTIES_AMD,
p_next: ::std::ptr::null_mut(),
flags: Flags::default(),
max_sqtt_se_buffer_size: DeviceSize::default(),
shader_engine_count: u32::default(),
perf_block_count: u32::default(),
p_perf_block_properties: ::std::ptr::null_mut(),
}
}
}
impl PhysicalDeviceGpaPropertiesAmd {
pub fn builder<'a>() -> PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
PhysicalDeviceGpaPropertiesAmdBuilder {
inner: Self::default(),
marker: ::std::marker::PhantomData,
}
}
}
pub struct PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
inner: PhysicalDeviceGpaPropertiesAmd,
marker: ::std::marker::PhantomData<&'a ()>,
}
pub unsafe trait ExtendsPhysicalDeviceGpaPropertiesAmd {}
unsafe impl ExtendsPhysicalDeviceProperties2 for PhysicalDeviceGpaPropertiesAmd {}
impl<'a> ::std::ops::Deref for PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
type Target = PhysicalDeviceGpaPropertiesAmd;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<'a> PhysicalDeviceGpaPropertiesAmdBuilder<'a> {
pub fn next<T>(mut self, next: &'a mut T) -> PhysicalDeviceGpaPropertiesAmdBuilder<'a>
where
T: ExtendsPhysicalDeviceGpaPropertiesAmd,
{
self.inner.p_next = next as *mut T as *mut c_void;
self
}
pub fn build(self) -> PhysicalDeviceGpaPropertiesAmd {
self.inner
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct GpaPerfCounterAmd {
pub block_type: GpaPerfBlockAmd,
pub block_instance: u32,
pub event_id: u32,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct GpaSampleBeginInfoAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub sample_type: GpaSampleTypeAmd,
pub sample_internal_operations: Bool32,
pub cache_flush_on_counter_collection: Bool32,
pub sq_shader_mask_enable: Bool32,
pub sq_shader_mask: GpaSqShaderStageFlags,
pub perf_counter_count: u32,
pub p_perf_counters: *const GpaPerfCounterAmd,
pub streaming_perf_trace_sample_interval: u32,
pub perf_counter_device_memory_limit: DeviceSize,
pub sq_thread_trace_enable: Bool32,
pub sq_thread_trace_suppress_instruction_tokens: Bool32,
pub sq_thread_trace_device_memory_limit: DeviceSize,
pub timing_pre_sample: PipelineStageFlags,
pub timing_post_sample: PipelineStageFlags,
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct GpaDeviceClockModeInfoAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub clock_mode: GpaDeviceClockModeAmd,
pub memory_clock_ratio_to_peak: f32,
pub engine_clock_ratio_to_peak: f32,
}
#[allow(non_camel_case_types)]
pub type PFN_vkCreateGpaSessionAMD = extern "system" fn(
device: Device,
p_create_info: *const GpaSessionCreateInfoAmd,
p_allocator: *const AllocationCallbacks,
p_gpa_session: *mut GpaSessionAmd,
) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkDestroyGpaSessionAMD = extern "system" fn(
device: Device,
gpa_session: GpaSessionAmd,
p_allocator: *const AllocationCallbacks,
) -> c_void;
#[allow(non_camel_case_types)]
pub type PFN_vkSetGpaDeviceClockModeAMD =
extern "system" fn(device: Device, p_info: *mut GpaDeviceClockModeInfoAmd) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkCmdBeginGpaSessionAMD =
extern "system" fn(commandBuffer: CommandBuffer, gpa_session: GpaSessionAmd) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkCmdEndGpaSessionAMD =
extern "system" fn(commandBuffer: CommandBuffer, gpa_session: GpaSessionAmd) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkCmdBeginGpaSampleAMD = extern "system" fn(
commandBuffer: CommandBuffer,
gpa_session: GpaSessionAmd,
p_gpa_sample_begin_info: *const GpaSampleBeginInfoAmd,
p_sample_id: *mut u32,
) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkCmdEndGpaSampleAMD = extern "system" fn(
commandBuffer: CommandBuffer,
gpa_session: GpaSessionAmd,
sample_id: u32,
) -> c_void;
#[allow(non_camel_case_types)]
pub type PFN_vkGetGpaSessionStatusAMD =
extern "system" fn(device: Device, gpaSession: GpaSessionAmd) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkGetGpaSessionResultsAMD = extern "system" fn(
device: Device,
gpaSession: GpaSessionAmd,
sample_id: u32,
p_size_in_bytes: *mut usize,
p_data: *mut c_void,
) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkResetGpaSessionAMD =
extern "system" fn(device: Device, gpaSession: GpaSessionAmd) -> Result;
#[allow(non_camel_case_types)]
pub type PFN_vkCmdCopyGpaSessionResultsAMD =
extern "system" fn(commandBuffer: CommandBuffer, gpaSession: GpaSessionAmd) -> c_void;
pub struct AmdGpaInterfaceFn {
pub create_gpa_session: PFN_vkCreateGpaSessionAMD,
pub destroy_gpa_session: PFN_vkDestroyGpaSessionAMD,
pub set_gpa_device_clock_mode: PFN_vkSetGpaDeviceClockModeAMD,
pub cmd_begin_gpa_session: PFN_vkCmdBeginGpaSessionAMD,
pub cmd_end_gpa_session: PFN_vkCmdEndGpaSessionAMD,
pub cmd_begin_gpa_sample: PFN_vkCmdBeginGpaSampleAMD,
pub cmd_end_gpa_sample: PFN_vkCmdEndGpaSampleAMD,
pub get_gpa_session_status: PFN_vkGetGpaSessionStatusAMD,
pub get_gpa_session_results: PFN_vkGetGpaSessionResultsAMD,
pub reset_gpa_session: PFN_vkResetGpaSessionAMD,
pub cmd_copy_gpa_session_results: PFN_vkCmdCopyGpaSessionResultsAMD,
}
unsafe impl Send for AmdGpaInterfaceFn {}
unsafe impl Sync for AmdGpaInterfaceFn {}
impl ::std::clone::Clone for AmdGpaInterfaceFn {
fn clone(&self) -> Self {
Self {
create_gpa_session: self.create_gpa_session,
destroy_gpa_session: self.destroy_gpa_session,
set_gpa_device_clock_mode: self.set_gpa_device_clock_mode,
cmd_begin_gpa_session: self.cmd_begin_gpa_session,
cmd_end_gpa_session: self.cmd_end_gpa_session,
cmd_begin_gpa_sample: self.cmd_begin_gpa_sample,
cmd_end_gpa_sample: self.cmd_end_gpa_sample,
get_gpa_session_status: self.get_gpa_session_status,
get_gpa_session_results: self.get_gpa_session_results,
reset_gpa_session: self.reset_gpa_session,
cmd_copy_gpa_session_results: self.cmd_copy_gpa_session_results,
}
}
}
impl AmdGpaInterfaceFn {
pub fn load<F>(mut _f: F) -> Self
where
F: FnMut(&::std::ffi::CStr) -> *const c_void,
{
Self {
create_gpa_session: unsafe {
extern "system" fn create_gpa_session_amd(
_device: Device,
_p_create_info: *const GpaSessionCreateInfoAmd,
_p_allocator: *const AllocationCallbacks,
_p_gpa_session: *mut GpaSessionAmd,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(create_gpa_session_amd)
))
}
let raw_name = stringify!(vkCreateGpaSessionAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
create_gpa_session_amd
} else {
::std::mem::transmute(val)
}
},
destroy_gpa_session: unsafe {
extern "system" fn destroy_gpa_session_amd(
_device: Device,
_gpa_session: GpaSessionAmd,
_p_allocator: *const AllocationCallbacks,
) -> c_void {
panic!(concat!(
"Unable to load ",
stringify!(destroy_gpa_session_amd)
))
}
let raw_name = stringify!(vkDestroyGpaSessionAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
destroy_gpa_session_amd
} else {
::std::mem::transmute(val)
}
},
set_gpa_device_clock_mode: unsafe {
extern "system" fn set_gpa_device_clock_mode_amd(
_device: Device,
_p_info: *mut GpaDeviceClockModeInfoAmd,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(set_gpa_device_clock_mode_amd)
))
}
let raw_name = stringify!(vkSetGpaDeviceClockModeAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
set_gpa_device_clock_mode_amd
} else {
::std::mem::transmute(val)
}
},
cmd_begin_gpa_session: unsafe {
extern "system" fn cmd_begin_gpa_session_amd(
_command_buffer: CommandBuffer,
_gpa_session: GpaSessionAmd,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(cmd_begin_gpa_session_amd)
))
}
let raw_name = stringify!(vkCmdBeginGpaSessionAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
cmd_begin_gpa_session_amd
} else {
::std::mem::transmute(val)
}
},
cmd_end_gpa_session: unsafe {
extern "system" fn cmd_end_gpa_session_amd(
_command_buffer: CommandBuffer,
_gpa_session: GpaSessionAmd,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(cmd_end_gpa_session_amd)
))
}
let raw_name = stringify!(vkCmdEndGpaSessionAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
cmd_end_gpa_session_amd
} else {
::std::mem::transmute(val)
}
},
cmd_begin_gpa_sample: unsafe {
extern "system" fn cmd_begin_gpa_sample_amd(
_command_buffer: CommandBuffer,
_gpa_session: GpaSessionAmd,
_p_gpa_sample_begin_info: *const GpaSampleBeginInfoAmd,
_p_sample_id: *mut u32,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(cmd_begin_gpa_sample_amd)
))
}
let raw_name = stringify!(vkCmdBeginGpaSampleAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
cmd_begin_gpa_sample_amd
} else {
::std::mem::transmute(val)
}
},
cmd_end_gpa_sample: unsafe {
extern "system" fn cmd_end_gpa_sample_amd(
_command_buffer: CommandBuffer,
_gpa_session: GpaSessionAmd,
_sample_id: u32,
) -> c_void {
panic!(concat!(
"Unable to load ",
stringify!(cmd_end_gpa_sample_amd)
))
}
let raw_name = stringify!(vkCmdEndGpaSampleAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
cmd_end_gpa_sample_amd
} else {
::std::mem::transmute(val)
}
},
get_gpa_session_status: unsafe {
extern "system" fn get_gpa_session_status_amd(
_device: Device,
_gpa_session: GpaSessionAmd,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(get_gpa_session_status_amd)
))
}
let raw_name = stringify!(vkGetGpaSessionStatusAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
get_gpa_session_status_amd
} else {
::std::mem::transmute(val)
}
},
get_gpa_session_results: unsafe {
extern "system" fn get_gpa_session_results_amd(
_device: Device,
_gpa_session: GpaSessionAmd,
_sample_id: u32,
_p_size_in_bytes: *mut usize,
_p_data: *mut c_void,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(get_gpa_session_results_amd)
))
}
let raw_name = stringify!(vkGetGpaSessionResultsAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
get_gpa_session_results_amd
} else {
::std::mem::transmute(val)
}
},
reset_gpa_session: unsafe {
extern "system" fn reset_gpa_session_amd(
_device: Device,
_gpa_session: GpaSessionAmd,
) -> Result {
panic!(concat!(
"Unable to load ",
stringify!(reset_gpa_session_amd)
))
}
let raw_name = stringify!(vkCmdEndGpaSampleAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
reset_gpa_session_amd
} else {
::std::mem::transmute(val)
}
},
cmd_copy_gpa_session_results: unsafe {
extern "system" fn cmd_copy_gpa_session_results_amd(
_command_buffer: CommandBuffer,
_gpa_session: GpaSessionAmd,
) -> c_void {
panic!(concat!(
"Unable to load ",
stringify!(cmd_copy_gpa_session_results_amd)
))
}
let raw_name = stringify!(vkCmdCopyGpaSessionResultsAMD);
let cname = ::std::ffi::CString::new(raw_name).unwrap();
let val = _f(&cname);
if val.is_null() {
cmd_copy_gpa_session_results_amd
} else {
::std::mem::transmute(val)
}
},
}
}
pub unsafe fn create_gpa_session(
&self,
device: Device,
create_info: *const GpaSessionCreateInfoAmd,
allocator: *const AllocationCallbacks,
gpa_session: *mut GpaSessionAmd,
) -> Result {
(self.create_gpa_session)(device, create_info, allocator, gpa_session)
}
pub unsafe fn destroy_gpa_session(
&self,
device: Device,
gpa_session: GpaSessionAmd,
allocator: *const AllocationCallbacks,
) -> c_void {
(self.destroy_gpa_session)(device, gpa_session, allocator)
}
}
// Extension: `VK_AMD_wave_limits`
impl StructureType {
pub const WAVE_LIMIT_AMD: Self = Self(1000045000);
pub const PHYSICAL_DEVICE_WAVE_LIMIT_PROPERTIES_AMD: Self = Self(1000045001);
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct PhysicalDeviceWaveLimitPropertiesAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub cu_count: u32,
pub max_waves_per_cu: u32,
}
impl ::std::default::Default for PhysicalDeviceWaveLimitPropertiesAmd {
fn default() -> Self {
Self {
s_type: StructureType::PHYSICAL_DEVICE_WAVE_LIMIT_PROPERTIES_AMD,
p_next: ::std::ptr::null_mut(),
cu_count: u32::default(),
max_waves_per_cu: u32::default(),
}
}
}
impl PhysicalDeviceWaveLimitPropertiesAmd {
pub fn builder<'a>() -> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
PhysicalDeviceWaveLimitPropertiesAmdBuilder {
inner: Self::default(),
marker: ::std::marker::PhantomData,
}
}
}
pub struct PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
inner: PhysicalDeviceWaveLimitPropertiesAmd,
marker: ::std::marker::PhantomData<&'a ()>,
}
pub unsafe trait ExtendsPhysicalDeviceWaveLimitPropertiesAmd {}
unsafe impl ExtendsPhysicalDeviceProperties2 for PhysicalDeviceWaveLimitPropertiesAmd {}
impl<'a> ::std::ops::Deref for PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
type Target = PhysicalDeviceWaveLimitPropertiesAmd;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<'a> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a> {
pub fn push_next<T>(
mut self,
next: &'a mut T,
) -> PhysicalDeviceWaveLimitPropertiesAmdBuilder<'a>
where
T: ExtendsPhysicalDeviceWaveLimitPropertiesAmd,
{
unsafe {
let next_ptr = next as *mut T as *mut BaseOutStructure;
let last_next = ptr_chain_iter(next).last().unwrap();
(*last_next).p_next = self.inner.p_next as _;
self.inner.p_next = next_ptr as _;
}
self
}
pub fn build(self) -> PhysicalDeviceWaveLimitPropertiesAmd {
self.inner
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct PipelineShaderStageCreateInfoWaveLimitAmd {
pub s_type: StructureType,
pub p_next: *const c_void,
pub waves_per_cu: f32,
pub cu_enable_mask: *mut u32,
}