1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use crate::*;
use crate::d3d11::*;
use winapi::um::d3d11shader::*;
use std::marker::PhantomData;
use std::ptr::NonNull;
/// \[[docs.microsoft.com](https://docs.microsoft.com/en-us/windows/win32/api/d3d11shader/nn-d3d11shader-id3d11functionparameterreflection)\]
/// ID3D11FunctionParameterReflection
///
/// A function-parameter-reflection interface accesses function-parameter info.
///
/// ### See Also
/// * [FunctionReflection::get_function_parameter]
#[derive(Clone)] #[repr(transparent)]
pub struct FunctionParameterReflection<'r> {
ptr: NonNull<ID3D11FunctionParameterReflection>,
phantom: PhantomData<&'r ShaderReflection>,
}
impl<'r> FunctionParameterReflection<'r> {
pub(crate) unsafe fn from_raw(_: impl ParentOrPhantom<'r>, ptr: *mut ID3D11FunctionParameterReflection) -> Self {
Self {
ptr: NonNull::new(ptr).expect("FunctionParameterReflection should never be null"),
phantom: PhantomData,
}
}
}
impl<'r> FunctionParameterReflection<'r> {
/// \[[docs.microsoft.com](https://docs.microsoft.com/en-us/windows/win32/api/d3d11shader/nf-d3d11shader-id3d11functionparameterreflection-getdesc)\]
/// ID3D11FunctionParameterReflection::GetDesc
///
/// ### Errors
/// * [E::FAIL] if `self` is a stub object for an invalid parameter
///
/// ### Example
/// ```rust
/// # use thindx::*;
/// # let d3dc = d3d::Compiler::load_system(47).unwrap();
/// # let shader = d3dc.compile_from_file(r"test\data\library.hlsl", None, None, (), "lib_5_0", d3d::Compile::Debug, d3d::CompileEffect::None).unwrap();
/// # let lib : d3d11::LibraryReflection = d3dc.reflect_library(&shader).unwrap();
/// # let scale4 = lib.functions().unwrap().find(|f| f.get_desc().unwrap().name.to_bytes() == b"scale4").unwrap();
/// #
/// let ret = scale4.get_function_parameter(-1).get_desc().unwrap();
/// assert_eq!(ret.name.as_ref().unwrap().to_bytes(), b"scale4");
/// assert_eq!(ret.ty, d3d::SVT::Float);
/// assert_eq!(ret.class, d3d::SVC::Vector);
/// assert_eq!(ret.rows, 1);
/// assert_eq!(ret.columns, 4);
/// println!("{:#?}", ret);
///
/// let v = scale4.get_function_parameter(0).get_desc().unwrap();
/// assert_eq!(v.name.as_ref().unwrap().to_bytes(), b"v");
/// assert_eq!(v.ty, d3d::SVT::Float);
/// assert_eq!(v.class, d3d::SVC::Vector);
/// assert_eq!(v.rows, 1);
/// assert_eq!(v.columns, 4);
/// println!("{:#?}", v);
///
/// assert_eq!(E::FAIL, scale4.get_function_parameter(-2).get_desc().unwrap_err().kind());
/// assert_eq!(E::FAIL, scale4.get_function_parameter( 1).get_desc().unwrap_err().kind());
/// #
/// # assert_eq!(scale4.get_function_parameter(std::i32::MIN).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(-1000000).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(-10000).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(-100).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(100).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(10000).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(1000000).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(std::i32::MAX-100).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(std::i32::MAX-16).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(std::i32::MAX-10).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(std::i32::MAX-4).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(std::i32::MAX-1).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// # assert_eq!(scale4.get_function_parameter(std::i32::MAX).get_desc().err().map(|err| err.kind()), Some(E::FAIL));
/// ```
///
/// ### Output
/// ```text
/// ParameterDesc {
/// name: Some(
/// "scale4",
/// ),
/// semantic_name: None,
/// ty: SVT::Float,
/// class: SVC::Vector,
/// rows: 1,
/// columns: 4,
/// interpolation_mode: Interpolation::Undefined,
/// flags: PF::Out,
/// first_in_register: 4294967295,
/// first_in_component: 4294967295,
/// first_out_register: 0,
/// first_out_component: 0,
/// }
/// ParameterDesc {
/// name: Some(
/// "v",
/// ),
/// semantic_name: None,
/// ty: SVT::Float,
/// class: SVC::Vector,
/// rows: 1,
/// columns: 4,
/// interpolation_mode: Interpolation::Undefined,
/// flags: PF::In,
/// first_in_register: 0,
/// first_in_component: 0,
/// first_out_register: 4294967295,
/// first_out_component: 4294967295,
/// }
/// ```
pub fn get_desc(&self) -> Result<ParameterDesc<'r>, MethodError> {
let mut desc = ParameterDesc::default();
let hr = unsafe { self.ptr.as_ref().GetDesc(&mut desc as *mut _ as *mut _) };
MethodError::check("ID3D11FunctionParameterReflection::GetDesc", hr)?;
Ok(desc)
}
}