xref: /aosp_15_r20/external/mesa3d/src/compiler/rust/nir.rs (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker // Copyright © 2022 Collabora, Ltd.
2*61046927SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker 
4*61046927SAndroid Build Coastguard Worker use crate::bindings::*;
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker use std::ffi::{c_void, CStr};
7*61046927SAndroid Build Coastguard Worker use std::marker::PhantomData;
8*61046927SAndroid Build Coastguard Worker use std::ptr::NonNull;
9*61046927SAndroid Build Coastguard Worker use std::str;
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker // from https://internals.rust-lang.org/t/discussion-on-offset-of/7440/2
12*61046927SAndroid Build Coastguard Worker macro_rules! offset_of {
13*61046927SAndroid Build Coastguard Worker     ($Struct:path, $field:ident) => {{
14*61046927SAndroid Build Coastguard Worker         // Using a separate function to minimize unhygienic hazards
15*61046927SAndroid Build Coastguard Worker         // (e.g. unsafety of #[repr(packed)] field borrows).
16*61046927SAndroid Build Coastguard Worker         // Uncomment `const` when `const fn`s can juggle pointers.
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker         // const
19*61046927SAndroid Build Coastguard Worker         fn offset() -> usize {
20*61046927SAndroid Build Coastguard Worker             let u = std::mem::MaybeUninit::<$Struct>::uninit();
21*61046927SAndroid Build Coastguard Worker             // Use pattern-matching to avoid accidentally going through Deref.
22*61046927SAndroid Build Coastguard Worker             let &$Struct { $field: ref f, .. } = unsafe { &*u.as_ptr() };
23*61046927SAndroid Build Coastguard Worker             let o =
24*61046927SAndroid Build Coastguard Worker                 (f as *const _ as usize).wrapping_sub(&u as *const _ as usize);
25*61046927SAndroid Build Coastguard Worker             // Triple check that we are within `u` still.
26*61046927SAndroid Build Coastguard Worker             assert!((0..=std::mem::size_of_val(&u)).contains(&o));
27*61046927SAndroid Build Coastguard Worker             o
28*61046927SAndroid Build Coastguard Worker         }
29*61046927SAndroid Build Coastguard Worker         offset()
30*61046927SAndroid Build Coastguard Worker     }};
31*61046927SAndroid Build Coastguard Worker }
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker pub struct ExecListIter<'a, T> {
34*61046927SAndroid Build Coastguard Worker     n: &'a exec_node,
35*61046927SAndroid Build Coastguard Worker     offset: usize,
36*61046927SAndroid Build Coastguard Worker     rev: bool,
37*61046927SAndroid Build Coastguard Worker     _marker: PhantomData<T>,
38*61046927SAndroid Build Coastguard Worker }
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker impl<'a, T> ExecListIter<'a, T> {
new(l: &'a exec_list, offset: usize) -> Self41*61046927SAndroid Build Coastguard Worker     fn new(l: &'a exec_list, offset: usize) -> Self {
42*61046927SAndroid Build Coastguard Worker         Self {
43*61046927SAndroid Build Coastguard Worker             n: &l.head_sentinel,
44*61046927SAndroid Build Coastguard Worker             offset: offset,
45*61046927SAndroid Build Coastguard Worker             rev: false,
46*61046927SAndroid Build Coastguard Worker             _marker: PhantomData,
47*61046927SAndroid Build Coastguard Worker         }
48*61046927SAndroid Build Coastguard Worker     }
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker     #[allow(dead_code)]
new_rev(l: &'a exec_list, offset: usize) -> Self51*61046927SAndroid Build Coastguard Worker     fn new_rev(l: &'a exec_list, offset: usize) -> Self {
52*61046927SAndroid Build Coastguard Worker         Self {
53*61046927SAndroid Build Coastguard Worker             n: &l.tail_sentinel,
54*61046927SAndroid Build Coastguard Worker             offset: offset,
55*61046927SAndroid Build Coastguard Worker             rev: true,
56*61046927SAndroid Build Coastguard Worker             _marker: PhantomData,
57*61046927SAndroid Build Coastguard Worker         }
58*61046927SAndroid Build Coastguard Worker     }
59*61046927SAndroid Build Coastguard Worker 
at(n: &'a exec_node, offset: usize, rev: bool) -> Self60*61046927SAndroid Build Coastguard Worker     fn at(n: &'a exec_node, offset: usize, rev: bool) -> Self {
61*61046927SAndroid Build Coastguard Worker         Self {
62*61046927SAndroid Build Coastguard Worker             n,
63*61046927SAndroid Build Coastguard Worker             offset: offset,
64*61046927SAndroid Build Coastguard Worker             rev: rev,
65*61046927SAndroid Build Coastguard Worker             _marker: PhantomData,
66*61046927SAndroid Build Coastguard Worker         }
67*61046927SAndroid Build Coastguard Worker     }
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker impl<'a, T: 'a> Iterator for ExecListIter<'a, T> {
71*61046927SAndroid Build Coastguard Worker     type Item = &'a T;
72*61046927SAndroid Build Coastguard Worker 
next(&mut self) -> Option<Self::Item>73*61046927SAndroid Build Coastguard Worker     fn next(&mut self) -> Option<Self::Item> {
74*61046927SAndroid Build Coastguard Worker         if self.rev {
75*61046927SAndroid Build Coastguard Worker             self.n = unsafe { &*self.n.prev };
76*61046927SAndroid Build Coastguard Worker             if self.n.prev.is_null() {
77*61046927SAndroid Build Coastguard Worker                 None
78*61046927SAndroid Build Coastguard Worker             } else {
79*61046927SAndroid Build Coastguard Worker                 let t: *const c_void = (self.n as *const exec_node).cast();
80*61046927SAndroid Build Coastguard Worker                 Some(unsafe { &*(t.sub(self.offset).cast()) })
81*61046927SAndroid Build Coastguard Worker             }
82*61046927SAndroid Build Coastguard Worker         } else {
83*61046927SAndroid Build Coastguard Worker             self.n = unsafe { &*self.n.next };
84*61046927SAndroid Build Coastguard Worker             if self.n.next.is_null() {
85*61046927SAndroid Build Coastguard Worker                 None
86*61046927SAndroid Build Coastguard Worker             } else {
87*61046927SAndroid Build Coastguard Worker                 let t: *const c_void = (self.n as *const exec_node).cast();
88*61046927SAndroid Build Coastguard Worker                 Some(unsafe { &*(t.sub(self.offset).cast()) })
89*61046927SAndroid Build Coastguard Worker             }
90*61046927SAndroid Build Coastguard Worker         }
91*61046927SAndroid Build Coastguard Worker     }
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker impl nir_def {
parent_instr<'a>(&'a self) -> &'a nir_instr95*61046927SAndroid Build Coastguard Worker     pub fn parent_instr<'a>(&'a self) -> &'a nir_instr {
96*61046927SAndroid Build Coastguard Worker         unsafe { NonNull::new(self.parent_instr).unwrap().as_ref() }
97*61046927SAndroid Build Coastguard Worker     }
98*61046927SAndroid Build Coastguard Worker 
components_read(&self) -> nir_component_mask_t99*61046927SAndroid Build Coastguard Worker     pub fn components_read(&self) -> nir_component_mask_t {
100*61046927SAndroid Build Coastguard Worker         unsafe { nir_def_components_read(self as *const _) }
101*61046927SAndroid Build Coastguard Worker     }
102*61046927SAndroid Build Coastguard Worker 
all_uses_are_fsat(&self) -> bool103*61046927SAndroid Build Coastguard Worker     pub fn all_uses_are_fsat(&self) -> bool {
104*61046927SAndroid Build Coastguard Worker         unsafe { nir_def_all_uses_are_fsat(self as *const _) }
105*61046927SAndroid Build Coastguard Worker     }
106*61046927SAndroid Build Coastguard Worker }
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker pub trait AsDef {
as_def<'a>(&'a self) -> &'a nir_def109*61046927SAndroid Build Coastguard Worker     fn as_def<'a>(&'a self) -> &'a nir_def;
110*61046927SAndroid Build Coastguard Worker 
bit_size(&self) -> u8111*61046927SAndroid Build Coastguard Worker     fn bit_size(&self) -> u8 {
112*61046927SAndroid Build Coastguard Worker         self.as_def().bit_size
113*61046927SAndroid Build Coastguard Worker     }
114*61046927SAndroid Build Coastguard Worker 
num_components(&self) -> u8115*61046927SAndroid Build Coastguard Worker     fn num_components(&self) -> u8 {
116*61046927SAndroid Build Coastguard Worker         self.as_def().num_components
117*61046927SAndroid Build Coastguard Worker     }
118*61046927SAndroid Build Coastguard Worker 
as_load_const<'a>(&'a self) -> Option<&'a nir_load_const_instr>119*61046927SAndroid Build Coastguard Worker     fn as_load_const<'a>(&'a self) -> Option<&'a nir_load_const_instr> {
120*61046927SAndroid Build Coastguard Worker         self.as_def().parent_instr().as_load_const()
121*61046927SAndroid Build Coastguard Worker     }
122*61046927SAndroid Build Coastguard Worker 
is_const(&self) -> bool123*61046927SAndroid Build Coastguard Worker     fn is_const(&self) -> bool {
124*61046927SAndroid Build Coastguard Worker         self.as_load_const().is_some()
125*61046927SAndroid Build Coastguard Worker     }
126*61046927SAndroid Build Coastguard Worker 
comp_as_int(&self, comp: u8) -> Option<i64>127*61046927SAndroid Build Coastguard Worker     fn comp_as_int(&self, comp: u8) -> Option<i64> {
128*61046927SAndroid Build Coastguard Worker         if let Some(load) = self.as_load_const() {
129*61046927SAndroid Build Coastguard Worker             assert!(comp < load.def.num_components);
130*61046927SAndroid Build Coastguard Worker             Some(unsafe {
131*61046927SAndroid Build Coastguard Worker                 let comp = usize::from(comp);
132*61046927SAndroid Build Coastguard Worker                 match self.bit_size() {
133*61046927SAndroid Build Coastguard Worker                     8 => load.values()[comp].i8_ as i64,
134*61046927SAndroid Build Coastguard Worker                     16 => load.values()[comp].i16_ as i64,
135*61046927SAndroid Build Coastguard Worker                     32 => load.values()[comp].i32_ as i64,
136*61046927SAndroid Build Coastguard Worker                     64 => load.values()[comp].i64_,
137*61046927SAndroid Build Coastguard Worker                     _ => panic!("Invalid bit size"),
138*61046927SAndroid Build Coastguard Worker                 }
139*61046927SAndroid Build Coastguard Worker             })
140*61046927SAndroid Build Coastguard Worker         } else {
141*61046927SAndroid Build Coastguard Worker             None
142*61046927SAndroid Build Coastguard Worker         }
143*61046927SAndroid Build Coastguard Worker     }
144*61046927SAndroid Build Coastguard Worker 
comp_as_uint(&self, comp: u8) -> Option<u64>145*61046927SAndroid Build Coastguard Worker     fn comp_as_uint(&self, comp: u8) -> Option<u64> {
146*61046927SAndroid Build Coastguard Worker         if let Some(load) = self.as_load_const() {
147*61046927SAndroid Build Coastguard Worker             assert!(comp < load.def.num_components);
148*61046927SAndroid Build Coastguard Worker             Some(unsafe {
149*61046927SAndroid Build Coastguard Worker                 let comp = usize::from(comp);
150*61046927SAndroid Build Coastguard Worker                 match self.bit_size() {
151*61046927SAndroid Build Coastguard Worker                     8 => load.values()[comp].u8_ as u64,
152*61046927SAndroid Build Coastguard Worker                     16 => load.values()[comp].u16_ as u64,
153*61046927SAndroid Build Coastguard Worker                     32 => load.values()[comp].u32_ as u64,
154*61046927SAndroid Build Coastguard Worker                     64 => load.values()[comp].u64_,
155*61046927SAndroid Build Coastguard Worker                     _ => panic!("Invalid bit size"),
156*61046927SAndroid Build Coastguard Worker                 }
157*61046927SAndroid Build Coastguard Worker             })
158*61046927SAndroid Build Coastguard Worker         } else {
159*61046927SAndroid Build Coastguard Worker             None
160*61046927SAndroid Build Coastguard Worker         }
161*61046927SAndroid Build Coastguard Worker     }
162*61046927SAndroid Build Coastguard Worker 
as_int(&self) -> Option<i64>163*61046927SAndroid Build Coastguard Worker     fn as_int(&self) -> Option<i64> {
164*61046927SAndroid Build Coastguard Worker         assert!(self.num_components() == 1);
165*61046927SAndroid Build Coastguard Worker         self.comp_as_int(0)
166*61046927SAndroid Build Coastguard Worker     }
167*61046927SAndroid Build Coastguard Worker 
as_uint(&self) -> Option<u64>168*61046927SAndroid Build Coastguard Worker     fn as_uint(&self) -> Option<u64> {
169*61046927SAndroid Build Coastguard Worker         assert!(self.num_components() == 1);
170*61046927SAndroid Build Coastguard Worker         self.comp_as_uint(0)
171*61046927SAndroid Build Coastguard Worker     }
172*61046927SAndroid Build Coastguard Worker 
is_zero(&self) -> bool173*61046927SAndroid Build Coastguard Worker     fn is_zero(&self) -> bool {
174*61046927SAndroid Build Coastguard Worker         self.num_components() == 1 && self.as_uint() == Some(0)
175*61046927SAndroid Build Coastguard Worker     }
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker impl AsDef for nir_def {
as_def<'a>(&'a self) -> &'a nir_def179*61046927SAndroid Build Coastguard Worker     fn as_def<'a>(&'a self) -> &'a nir_def {
180*61046927SAndroid Build Coastguard Worker         self
181*61046927SAndroid Build Coastguard Worker     }
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker impl AsDef for nir_src {
as_def<'a>(&'a self) -> &'a nir_def185*61046927SAndroid Build Coastguard Worker     fn as_def<'a>(&'a self) -> &'a nir_def {
186*61046927SAndroid Build Coastguard Worker         unsafe { NonNull::new(self.ssa).unwrap().as_ref() }
187*61046927SAndroid Build Coastguard Worker     }
188*61046927SAndroid Build Coastguard Worker }
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker impl nir_alu_instr {
info(&self) -> &'static nir_op_info191*61046927SAndroid Build Coastguard Worker     pub fn info(&self) -> &'static nir_op_info {
192*61046927SAndroid Build Coastguard Worker         let info_idx: usize = self.op.try_into().unwrap();
193*61046927SAndroid Build Coastguard Worker         unsafe { &nir_op_infos[info_idx] }
194*61046927SAndroid Build Coastguard Worker     }
195*61046927SAndroid Build Coastguard Worker 
src_components(&self, src_idx: u8) -> u8196*61046927SAndroid Build Coastguard Worker     pub fn src_components(&self, src_idx: u8) -> u8 {
197*61046927SAndroid Build Coastguard Worker         assert!(src_idx < self.info().num_inputs);
198*61046927SAndroid Build Coastguard Worker         unsafe {
199*61046927SAndroid Build Coastguard Worker             nir_ssa_alu_instr_src_components(self as *const _, src_idx.into())
200*61046927SAndroid Build Coastguard Worker                 .try_into()
201*61046927SAndroid Build Coastguard Worker                 .unwrap()
202*61046927SAndroid Build Coastguard Worker         }
203*61046927SAndroid Build Coastguard Worker     }
204*61046927SAndroid Build Coastguard Worker 
srcs_as_slice<'a>(&'a self) -> &'a [nir_alu_src]205*61046927SAndroid Build Coastguard Worker     pub fn srcs_as_slice<'a>(&'a self) -> &'a [nir_alu_src] {
206*61046927SAndroid Build Coastguard Worker         unsafe {
207*61046927SAndroid Build Coastguard Worker             self.src
208*61046927SAndroid Build Coastguard Worker                 .as_slice(self.info().num_inputs.try_into().unwrap())
209*61046927SAndroid Build Coastguard Worker         }
210*61046927SAndroid Build Coastguard Worker     }
211*61046927SAndroid Build Coastguard Worker 
get_src(&self, idx: usize) -> &nir_alu_src212*61046927SAndroid Build Coastguard Worker     pub fn get_src(&self, idx: usize) -> &nir_alu_src {
213*61046927SAndroid Build Coastguard Worker         &self.srcs_as_slice()[idx]
214*61046927SAndroid Build Coastguard Worker     }
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker impl nir_op_info {
name(&self) -> &'static str218*61046927SAndroid Build Coastguard Worker     pub fn name(&self) -> &'static str {
219*61046927SAndroid Build Coastguard Worker         unsafe { CStr::from_ptr(self.name).to_str().expect("Invalid UTF-8") }
220*61046927SAndroid Build Coastguard Worker     }
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker impl nir_alu_src {
bit_size(&self) -> u8224*61046927SAndroid Build Coastguard Worker     pub fn bit_size(&self) -> u8 {
225*61046927SAndroid Build Coastguard Worker         self.src.bit_size()
226*61046927SAndroid Build Coastguard Worker     }
227*61046927SAndroid Build Coastguard Worker 
comp_as_int(&self, comp: u8) -> Option<i64>228*61046927SAndroid Build Coastguard Worker     pub fn comp_as_int(&self, comp: u8) -> Option<i64> {
229*61046927SAndroid Build Coastguard Worker         self.src.comp_as_int(self.swizzle[usize::from(comp)])
230*61046927SAndroid Build Coastguard Worker     }
231*61046927SAndroid Build Coastguard Worker 
comp_as_uint(&self, comp: u8) -> Option<u64>232*61046927SAndroid Build Coastguard Worker     pub fn comp_as_uint(&self, comp: u8) -> Option<u64> {
233*61046927SAndroid Build Coastguard Worker         self.src.comp_as_uint(self.swizzle[usize::from(comp)])
234*61046927SAndroid Build Coastguard Worker     }
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker impl nir_tex_instr {
srcs_as_slice<'a>(&'a self) -> &'a [nir_tex_src]238*61046927SAndroid Build Coastguard Worker     pub fn srcs_as_slice<'a>(&'a self) -> &'a [nir_tex_src] {
239*61046927SAndroid Build Coastguard Worker         unsafe { std::slice::from_raw_parts(self.src, self.num_srcs as usize) }
240*61046927SAndroid Build Coastguard Worker     }
241*61046927SAndroid Build Coastguard Worker 
get_src(&self, idx: usize) -> &nir_tex_src242*61046927SAndroid Build Coastguard Worker     pub fn get_src(&self, idx: usize) -> &nir_tex_src {
243*61046927SAndroid Build Coastguard Worker         &self.srcs_as_slice()[idx]
244*61046927SAndroid Build Coastguard Worker     }
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker impl nir_intrinsic_instr {
info(&self) -> &'static nir_intrinsic_info248*61046927SAndroid Build Coastguard Worker     pub fn info(&self) -> &'static nir_intrinsic_info {
249*61046927SAndroid Build Coastguard Worker         let info_idx: usize = self.intrinsic.try_into().unwrap();
250*61046927SAndroid Build Coastguard Worker         unsafe { &nir_intrinsic_infos[info_idx] }
251*61046927SAndroid Build Coastguard Worker     }
252*61046927SAndroid Build Coastguard Worker 
srcs_as_slice<'a>(&'a self) -> &'a [nir_src]253*61046927SAndroid Build Coastguard Worker     pub fn srcs_as_slice<'a>(&'a self) -> &'a [nir_src] {
254*61046927SAndroid Build Coastguard Worker         unsafe { self.src.as_slice(self.info().num_srcs.try_into().unwrap()) }
255*61046927SAndroid Build Coastguard Worker     }
256*61046927SAndroid Build Coastguard Worker 
get_src(&self, idx: usize) -> &nir_src257*61046927SAndroid Build Coastguard Worker     pub fn get_src(&self, idx: usize) -> &nir_src {
258*61046927SAndroid Build Coastguard Worker         &self.srcs_as_slice()[idx]
259*61046927SAndroid Build Coastguard Worker     }
260*61046927SAndroid Build Coastguard Worker 
get_const_index(&self, name: u32) -> u32261*61046927SAndroid Build Coastguard Worker     pub fn get_const_index(&self, name: u32) -> u32 {
262*61046927SAndroid Build Coastguard Worker         let name: usize = name.try_into().unwrap();
263*61046927SAndroid Build Coastguard Worker         let idx = self.info().index_map[name];
264*61046927SAndroid Build Coastguard Worker         assert!(idx > 0);
265*61046927SAndroid Build Coastguard Worker         self.const_index[usize::from(idx - 1)] as u32
266*61046927SAndroid Build Coastguard Worker     }
267*61046927SAndroid Build Coastguard Worker 
base(&self) -> i32268*61046927SAndroid Build Coastguard Worker     pub fn base(&self) -> i32 {
269*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_BASE) as i32
270*61046927SAndroid Build Coastguard Worker     }
271*61046927SAndroid Build Coastguard Worker 
range_base(&self) -> i32272*61046927SAndroid Build Coastguard Worker     pub fn range_base(&self) -> i32 {
273*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_RANGE_BASE) as i32
274*61046927SAndroid Build Coastguard Worker     }
275*61046927SAndroid Build Coastguard Worker 
range(&self) -> i32276*61046927SAndroid Build Coastguard Worker     pub fn range(&self) -> i32 {
277*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_RANGE) as i32
278*61046927SAndroid Build Coastguard Worker     }
279*61046927SAndroid Build Coastguard Worker 
write_mask(&self) -> u32280*61046927SAndroid Build Coastguard Worker     pub fn write_mask(&self) -> u32 {
281*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_WRITE_MASK)
282*61046927SAndroid Build Coastguard Worker     }
283*61046927SAndroid Build Coastguard Worker 
stream_id(&self) -> u32284*61046927SAndroid Build Coastguard Worker     pub fn stream_id(&self) -> u32 {
285*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_STREAM_ID)
286*61046927SAndroid Build Coastguard Worker     }
287*61046927SAndroid Build Coastguard Worker 
component(&self) -> u32288*61046927SAndroid Build Coastguard Worker     pub fn component(&self) -> u32 {
289*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_COMPONENT)
290*61046927SAndroid Build Coastguard Worker     }
291*61046927SAndroid Build Coastguard Worker 
interp_mode(&self) -> u32292*61046927SAndroid Build Coastguard Worker     pub fn interp_mode(&self) -> u32 {
293*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_INTERP_MODE)
294*61046927SAndroid Build Coastguard Worker     }
295*61046927SAndroid Build Coastguard Worker 
reduction_op(&self) -> nir_op296*61046927SAndroid Build Coastguard Worker     pub fn reduction_op(&self) -> nir_op {
297*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_REDUCTION_OP) as nir_op
298*61046927SAndroid Build Coastguard Worker     }
299*61046927SAndroid Build Coastguard Worker 
cluster_size(&self) -> u32300*61046927SAndroid Build Coastguard Worker     pub fn cluster_size(&self) -> u32 {
301*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_CLUSTER_SIZE)
302*61046927SAndroid Build Coastguard Worker     }
303*61046927SAndroid Build Coastguard Worker 
image_dim(&self) -> glsl_sampler_dim304*61046927SAndroid Build Coastguard Worker     pub fn image_dim(&self) -> glsl_sampler_dim {
305*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_IMAGE_DIM) as glsl_sampler_dim
306*61046927SAndroid Build Coastguard Worker     }
307*61046927SAndroid Build Coastguard Worker 
image_array(&self) -> bool308*61046927SAndroid Build Coastguard Worker     pub fn image_array(&self) -> bool {
309*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_IMAGE_ARRAY) != 0
310*61046927SAndroid Build Coastguard Worker     }
311*61046927SAndroid Build Coastguard Worker 
access(&self) -> gl_access_qualifier312*61046927SAndroid Build Coastguard Worker     pub fn access(&self) -> gl_access_qualifier {
313*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_ACCESS) as gl_access_qualifier
314*61046927SAndroid Build Coastguard Worker     }
315*61046927SAndroid Build Coastguard Worker 
align(&self) -> u32316*61046927SAndroid Build Coastguard Worker     pub fn align(&self) -> u32 {
317*61046927SAndroid Build Coastguard Worker         let mul = self.align_mul();
318*61046927SAndroid Build Coastguard Worker         let offset = self.align_offset();
319*61046927SAndroid Build Coastguard Worker         assert!(offset < mul);
320*61046927SAndroid Build Coastguard Worker         if offset > 0 {
321*61046927SAndroid Build Coastguard Worker             1 << offset.trailing_zeros()
322*61046927SAndroid Build Coastguard Worker         } else {
323*61046927SAndroid Build Coastguard Worker             mul
324*61046927SAndroid Build Coastguard Worker         }
325*61046927SAndroid Build Coastguard Worker     }
326*61046927SAndroid Build Coastguard Worker 
align_mul(&self) -> u32327*61046927SAndroid Build Coastguard Worker     pub fn align_mul(&self) -> u32 {
328*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_ALIGN_MUL)
329*61046927SAndroid Build Coastguard Worker     }
330*61046927SAndroid Build Coastguard Worker 
align_offset(&self) -> u32331*61046927SAndroid Build Coastguard Worker     pub fn align_offset(&self) -> u32 {
332*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_ALIGN_OFFSET)
333*61046927SAndroid Build Coastguard Worker     }
334*61046927SAndroid Build Coastguard Worker 
execution_scope(&self) -> mesa_scope335*61046927SAndroid Build Coastguard Worker     pub fn execution_scope(&self) -> mesa_scope {
336*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_EXECUTION_SCOPE)
337*61046927SAndroid Build Coastguard Worker     }
338*61046927SAndroid Build Coastguard Worker 
memory_scope(&self) -> mesa_scope339*61046927SAndroid Build Coastguard Worker     pub fn memory_scope(&self) -> mesa_scope {
340*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_MEMORY_SCOPE)
341*61046927SAndroid Build Coastguard Worker     }
342*61046927SAndroid Build Coastguard Worker 
memory_semantics(&self) -> nir_memory_semantics343*61046927SAndroid Build Coastguard Worker     pub fn memory_semantics(&self) -> nir_memory_semantics {
344*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_MEMORY_SEMANTICS)
345*61046927SAndroid Build Coastguard Worker     }
346*61046927SAndroid Build Coastguard Worker 
memory_modes(&self) -> nir_variable_mode347*61046927SAndroid Build Coastguard Worker     pub fn memory_modes(&self) -> nir_variable_mode {
348*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_MEMORY_MODES)
349*61046927SAndroid Build Coastguard Worker     }
350*61046927SAndroid Build Coastguard Worker 
flags(&self) -> u32351*61046927SAndroid Build Coastguard Worker     pub fn flags(&self) -> u32 {
352*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_FLAGS)
353*61046927SAndroid Build Coastguard Worker     }
354*61046927SAndroid Build Coastguard Worker 
atomic_op(&self) -> nir_atomic_op355*61046927SAndroid Build Coastguard Worker     pub fn atomic_op(&self) -> nir_atomic_op {
356*61046927SAndroid Build Coastguard Worker         self.get_const_index(NIR_INTRINSIC_ATOMIC_OP) as nir_atomic_op
357*61046927SAndroid Build Coastguard Worker     }
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker impl nir_intrinsic_info {
name(&self) -> &'static str361*61046927SAndroid Build Coastguard Worker     pub fn name(&self) -> &'static str {
362*61046927SAndroid Build Coastguard Worker         unsafe { CStr::from_ptr(self.name).to_str().expect("Invalid UTF-8") }
363*61046927SAndroid Build Coastguard Worker     }
364*61046927SAndroid Build Coastguard Worker }
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker impl nir_load_const_instr {
values<'a>(&'a self) -> &'a [nir_const_value]367*61046927SAndroid Build Coastguard Worker     pub fn values<'a>(&'a self) -> &'a [nir_const_value] {
368*61046927SAndroid Build Coastguard Worker         unsafe { self.value.as_slice(self.def.num_components as usize) }
369*61046927SAndroid Build Coastguard Worker     }
370*61046927SAndroid Build Coastguard Worker }
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker impl nir_phi_src {
pred<'a>(&'a self) -> &'a nir_block373*61046927SAndroid Build Coastguard Worker     pub fn pred<'a>(&'a self) -> &'a nir_block {
374*61046927SAndroid Build Coastguard Worker         unsafe { NonNull::new(self.pred).unwrap().as_ref() }
375*61046927SAndroid Build Coastguard Worker     }
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker impl nir_phi_instr {
iter_srcs(&self) -> ExecListIter<nir_phi_src>379*61046927SAndroid Build Coastguard Worker     pub fn iter_srcs(&self) -> ExecListIter<nir_phi_src> {
380*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.srcs, offset_of!(nir_phi_src, node))
381*61046927SAndroid Build Coastguard Worker     }
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker impl nir_jump_instr {
target<'a>(&'a self) -> Option<&'a nir_block>385*61046927SAndroid Build Coastguard Worker     pub fn target<'a>(&'a self) -> Option<&'a nir_block> {
386*61046927SAndroid Build Coastguard Worker         NonNull::new(self.target).map(|b| unsafe { b.as_ref() })
387*61046927SAndroid Build Coastguard Worker     }
388*61046927SAndroid Build Coastguard Worker 
else_target<'a>(&'a self) -> Option<&'a nir_block>389*61046927SAndroid Build Coastguard Worker     pub fn else_target<'a>(&'a self) -> Option<&'a nir_block> {
390*61046927SAndroid Build Coastguard Worker         NonNull::new(self.else_target).map(|b| unsafe { b.as_ref() })
391*61046927SAndroid Build Coastguard Worker     }
392*61046927SAndroid Build Coastguard Worker }
393*61046927SAndroid Build Coastguard Worker 
394*61046927SAndroid Build Coastguard Worker impl nir_instr {
as_alu<'a>(&'a self) -> Option<&'a nir_alu_instr>395*61046927SAndroid Build Coastguard Worker     pub fn as_alu<'a>(&'a self) -> Option<&'a nir_alu_instr> {
396*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_alu {
397*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
398*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_alu_instr) })
399*61046927SAndroid Build Coastguard Worker         } else {
400*61046927SAndroid Build Coastguard Worker             None
401*61046927SAndroid Build Coastguard Worker         }
402*61046927SAndroid Build Coastguard Worker     }
403*61046927SAndroid Build Coastguard Worker 
as_jump<'a>(&'a self) -> Option<&'a nir_jump_instr>404*61046927SAndroid Build Coastguard Worker     pub fn as_jump<'a>(&'a self) -> Option<&'a nir_jump_instr> {
405*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_jump {
406*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
407*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_jump_instr) })
408*61046927SAndroid Build Coastguard Worker         } else {
409*61046927SAndroid Build Coastguard Worker             None
410*61046927SAndroid Build Coastguard Worker         }
411*61046927SAndroid Build Coastguard Worker     }
412*61046927SAndroid Build Coastguard Worker 
as_tex<'a>(&'a self) -> Option<&'a nir_tex_instr>413*61046927SAndroid Build Coastguard Worker     pub fn as_tex<'a>(&'a self) -> Option<&'a nir_tex_instr> {
414*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_tex {
415*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
416*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_tex_instr) })
417*61046927SAndroid Build Coastguard Worker         } else {
418*61046927SAndroid Build Coastguard Worker             None
419*61046927SAndroid Build Coastguard Worker         }
420*61046927SAndroid Build Coastguard Worker     }
421*61046927SAndroid Build Coastguard Worker 
as_intrinsic<'a>(&'a self) -> Option<&'a nir_intrinsic_instr>422*61046927SAndroid Build Coastguard Worker     pub fn as_intrinsic<'a>(&'a self) -> Option<&'a nir_intrinsic_instr> {
423*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_intrinsic {
424*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
425*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_intrinsic_instr) })
426*61046927SAndroid Build Coastguard Worker         } else {
427*61046927SAndroid Build Coastguard Worker             None
428*61046927SAndroid Build Coastguard Worker         }
429*61046927SAndroid Build Coastguard Worker     }
430*61046927SAndroid Build Coastguard Worker 
as_load_const<'a>(&'a self) -> Option<&'a nir_load_const_instr>431*61046927SAndroid Build Coastguard Worker     pub fn as_load_const<'a>(&'a self) -> Option<&'a nir_load_const_instr> {
432*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_load_const {
433*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
434*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_load_const_instr) })
435*61046927SAndroid Build Coastguard Worker         } else {
436*61046927SAndroid Build Coastguard Worker             None
437*61046927SAndroid Build Coastguard Worker         }
438*61046927SAndroid Build Coastguard Worker     }
439*61046927SAndroid Build Coastguard Worker 
as_undef<'a>(&'a self) -> Option<&'a nir_undef_instr>440*61046927SAndroid Build Coastguard Worker     pub fn as_undef<'a>(&'a self) -> Option<&'a nir_undef_instr> {
441*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_undef {
442*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
443*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_undef_instr) })
444*61046927SAndroid Build Coastguard Worker         } else {
445*61046927SAndroid Build Coastguard Worker             None
446*61046927SAndroid Build Coastguard Worker         }
447*61046927SAndroid Build Coastguard Worker     }
448*61046927SAndroid Build Coastguard Worker 
as_phi<'a>(&'a self) -> Option<&'a nir_phi_instr>449*61046927SAndroid Build Coastguard Worker     pub fn as_phi<'a>(&'a self) -> Option<&'a nir_phi_instr> {
450*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_instr_type_phi {
451*61046927SAndroid Build Coastguard Worker             let p = self as *const nir_instr;
452*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(p as *const nir_phi_instr) })
453*61046927SAndroid Build Coastguard Worker         } else {
454*61046927SAndroid Build Coastguard Worker             None
455*61046927SAndroid Build Coastguard Worker         }
456*61046927SAndroid Build Coastguard Worker     }
457*61046927SAndroid Build Coastguard Worker 
def<'a>(&'a self) -> Option<&'a nir_def>458*61046927SAndroid Build Coastguard Worker     pub fn def<'a>(&'a self) -> Option<&'a nir_def> {
459*61046927SAndroid Build Coastguard Worker         unsafe {
460*61046927SAndroid Build Coastguard Worker             let def = nir_instr_def(self as *const _ as *mut _);
461*61046927SAndroid Build Coastguard Worker             NonNull::new(def).map(|d| d.as_ref())
462*61046927SAndroid Build Coastguard Worker         }
463*61046927SAndroid Build Coastguard Worker     }
464*61046927SAndroid Build Coastguard Worker }
465*61046927SAndroid Build Coastguard Worker 
466*61046927SAndroid Build Coastguard Worker impl nir_block {
iter_instr_list(&self) -> ExecListIter<nir_instr>467*61046927SAndroid Build Coastguard Worker     pub fn iter_instr_list(&self) -> ExecListIter<nir_instr> {
468*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.instr_list, offset_of!(nir_instr, node))
469*61046927SAndroid Build Coastguard Worker     }
470*61046927SAndroid Build Coastguard Worker 
successors<'a>(&'a self) -> [Option<&'a nir_block>; 2]471*61046927SAndroid Build Coastguard Worker     pub fn successors<'a>(&'a self) -> [Option<&'a nir_block>; 2] {
472*61046927SAndroid Build Coastguard Worker         [
473*61046927SAndroid Build Coastguard Worker             NonNull::new(self.successors[0]).map(|b| unsafe { b.as_ref() }),
474*61046927SAndroid Build Coastguard Worker             NonNull::new(self.successors[1]).map(|b| unsafe { b.as_ref() }),
475*61046927SAndroid Build Coastguard Worker         ]
476*61046927SAndroid Build Coastguard Worker     }
477*61046927SAndroid Build Coastguard Worker 
following_if<'a>(&'a self) -> Option<&'a nir_if>478*61046927SAndroid Build Coastguard Worker     pub fn following_if<'a>(&'a self) -> Option<&'a nir_if> {
479*61046927SAndroid Build Coastguard Worker         let self_ptr = self as *const _ as *mut _;
480*61046927SAndroid Build Coastguard Worker         unsafe { nir_block_get_following_if(self_ptr).as_ref() }
481*61046927SAndroid Build Coastguard Worker     }
482*61046927SAndroid Build Coastguard Worker 
following_loop<'a>(&'a self) -> Option<&'a nir_loop>483*61046927SAndroid Build Coastguard Worker     pub fn following_loop<'a>(&'a self) -> Option<&'a nir_loop> {
484*61046927SAndroid Build Coastguard Worker         let self_ptr = self as *const _ as *mut _;
485*61046927SAndroid Build Coastguard Worker         unsafe { nir_block_get_following_loop(self_ptr).as_ref() }
486*61046927SAndroid Build Coastguard Worker     }
487*61046927SAndroid Build Coastguard Worker 
parent(&self) -> &nir_cf_node488*61046927SAndroid Build Coastguard Worker     pub fn parent(&self) -> &nir_cf_node {
489*61046927SAndroid Build Coastguard Worker         self.cf_node.parent().unwrap()
490*61046927SAndroid Build Coastguard Worker     }
491*61046927SAndroid Build Coastguard Worker }
492*61046927SAndroid Build Coastguard Worker 
493*61046927SAndroid Build Coastguard Worker impl nir_if {
first_then_block(&self) -> &nir_block494*61046927SAndroid Build Coastguard Worker     pub fn first_then_block(&self) -> &nir_block {
495*61046927SAndroid Build Coastguard Worker         self.iter_then_list().next().unwrap().as_block().unwrap()
496*61046927SAndroid Build Coastguard Worker     }
497*61046927SAndroid Build Coastguard Worker 
first_else_block(&self) -> &nir_block498*61046927SAndroid Build Coastguard Worker     pub fn first_else_block(&self) -> &nir_block {
499*61046927SAndroid Build Coastguard Worker         self.iter_else_list().next().unwrap().as_block().unwrap()
500*61046927SAndroid Build Coastguard Worker     }
501*61046927SAndroid Build Coastguard Worker 
iter_then_list(&self) -> ExecListIter<nir_cf_node>502*61046927SAndroid Build Coastguard Worker     pub fn iter_then_list(&self) -> ExecListIter<nir_cf_node> {
503*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.then_list, offset_of!(nir_cf_node, node))
504*61046927SAndroid Build Coastguard Worker     }
505*61046927SAndroid Build Coastguard Worker 
iter_else_list(&self) -> ExecListIter<nir_cf_node>506*61046927SAndroid Build Coastguard Worker     pub fn iter_else_list(&self) -> ExecListIter<nir_cf_node> {
507*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.else_list, offset_of!(nir_cf_node, node))
508*61046927SAndroid Build Coastguard Worker     }
509*61046927SAndroid Build Coastguard Worker 
following_block(&self) -> &nir_block510*61046927SAndroid Build Coastguard Worker     pub fn following_block(&self) -> &nir_block {
511*61046927SAndroid Build Coastguard Worker         self.cf_node.next().unwrap().as_block().unwrap()
512*61046927SAndroid Build Coastguard Worker     }
513*61046927SAndroid Build Coastguard Worker }
514*61046927SAndroid Build Coastguard Worker 
515*61046927SAndroid Build Coastguard Worker impl nir_loop {
iter_body(&self) -> ExecListIter<nir_cf_node>516*61046927SAndroid Build Coastguard Worker     pub fn iter_body(&self) -> ExecListIter<nir_cf_node> {
517*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.body, offset_of!(nir_cf_node, node))
518*61046927SAndroid Build Coastguard Worker     }
519*61046927SAndroid Build Coastguard Worker 
first_block(&self) -> &nir_block520*61046927SAndroid Build Coastguard Worker     pub fn first_block(&self) -> &nir_block {
521*61046927SAndroid Build Coastguard Worker         self.iter_body().next().unwrap().as_block().unwrap()
522*61046927SAndroid Build Coastguard Worker     }
523*61046927SAndroid Build Coastguard Worker 
following_block(&self) -> &nir_block524*61046927SAndroid Build Coastguard Worker     pub fn following_block(&self) -> &nir_block {
525*61046927SAndroid Build Coastguard Worker         self.cf_node.next().unwrap().as_block().unwrap()
526*61046927SAndroid Build Coastguard Worker     }
527*61046927SAndroid Build Coastguard Worker }
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker impl nir_cf_node {
as_block<'a>(&'a self) -> Option<&'a nir_block>530*61046927SAndroid Build Coastguard Worker     pub fn as_block<'a>(&'a self) -> Option<&'a nir_block> {
531*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_cf_node_block {
532*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(self as *const nir_cf_node as *const nir_block) })
533*61046927SAndroid Build Coastguard Worker         } else {
534*61046927SAndroid Build Coastguard Worker             None
535*61046927SAndroid Build Coastguard Worker         }
536*61046927SAndroid Build Coastguard Worker     }
537*61046927SAndroid Build Coastguard Worker 
as_if<'a>(&'a self) -> Option<&'a nir_if>538*61046927SAndroid Build Coastguard Worker     pub fn as_if<'a>(&'a self) -> Option<&'a nir_if> {
539*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_cf_node_if {
540*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(self as *const nir_cf_node as *const nir_if) })
541*61046927SAndroid Build Coastguard Worker         } else {
542*61046927SAndroid Build Coastguard Worker             None
543*61046927SAndroid Build Coastguard Worker         }
544*61046927SAndroid Build Coastguard Worker     }
545*61046927SAndroid Build Coastguard Worker 
as_loop<'a>(&'a self) -> Option<&'a nir_loop>546*61046927SAndroid Build Coastguard Worker     pub fn as_loop<'a>(&'a self) -> Option<&'a nir_loop> {
547*61046927SAndroid Build Coastguard Worker         if self.type_ == nir_cf_node_loop {
548*61046927SAndroid Build Coastguard Worker             Some(unsafe { &*(self as *const nir_cf_node as *const nir_loop) })
549*61046927SAndroid Build Coastguard Worker         } else {
550*61046927SAndroid Build Coastguard Worker             None
551*61046927SAndroid Build Coastguard Worker         }
552*61046927SAndroid Build Coastguard Worker     }
553*61046927SAndroid Build Coastguard Worker 
next(&self) -> Option<&nir_cf_node>554*61046927SAndroid Build Coastguard Worker     pub fn next(&self) -> Option<&nir_cf_node> {
555*61046927SAndroid Build Coastguard Worker         let mut iter: ExecListIter<nir_cf_node> =
556*61046927SAndroid Build Coastguard Worker             ExecListIter::at(&self.node, offset_of!(nir_cf_node, node), false);
557*61046927SAndroid Build Coastguard Worker         iter.next()
558*61046927SAndroid Build Coastguard Worker     }
559*61046927SAndroid Build Coastguard Worker 
prev(&self) -> Option<&nir_cf_node>560*61046927SAndroid Build Coastguard Worker     pub fn prev(&self) -> Option<&nir_cf_node> {
561*61046927SAndroid Build Coastguard Worker         let mut iter: ExecListIter<nir_cf_node> =
562*61046927SAndroid Build Coastguard Worker             ExecListIter::at(&self.node, offset_of!(nir_cf_node, node), true);
563*61046927SAndroid Build Coastguard Worker         iter.next()
564*61046927SAndroid Build Coastguard Worker     }
565*61046927SAndroid Build Coastguard Worker 
parent<'a>(&'a self) -> Option<&'a nir_cf_node>566*61046927SAndroid Build Coastguard Worker     pub fn parent<'a>(&'a self) -> Option<&'a nir_cf_node> {
567*61046927SAndroid Build Coastguard Worker         NonNull::new(self.parent).map(|b| unsafe { b.as_ref() })
568*61046927SAndroid Build Coastguard Worker     }
569*61046927SAndroid Build Coastguard Worker }
570*61046927SAndroid Build Coastguard Worker 
571*61046927SAndroid Build Coastguard Worker impl nir_function_impl {
iter_body(&self) -> ExecListIter<nir_cf_node>572*61046927SAndroid Build Coastguard Worker     pub fn iter_body(&self) -> ExecListIter<nir_cf_node> {
573*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.body, offset_of!(nir_cf_node, node))
574*61046927SAndroid Build Coastguard Worker     }
575*61046927SAndroid Build Coastguard Worker 
end_block<'a>(&'a self) -> &'a nir_block576*61046927SAndroid Build Coastguard Worker     pub fn end_block<'a>(&'a self) -> &'a nir_block {
577*61046927SAndroid Build Coastguard Worker         unsafe { NonNull::new(self.end_block).unwrap().as_ref() }
578*61046927SAndroid Build Coastguard Worker     }
579*61046927SAndroid Build Coastguard Worker 
function<'a>(&'a self) -> &'a nir_function580*61046927SAndroid Build Coastguard Worker     pub fn function<'a>(&'a self) -> &'a nir_function {
581*61046927SAndroid Build Coastguard Worker         unsafe { self.function.as_ref() }.unwrap()
582*61046927SAndroid Build Coastguard Worker     }
583*61046927SAndroid Build Coastguard Worker }
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker impl nir_function {
get_impl(&self) -> Option<&nir_function_impl>586*61046927SAndroid Build Coastguard Worker     pub fn get_impl(&self) -> Option<&nir_function_impl> {
587*61046927SAndroid Build Coastguard Worker         unsafe { self.impl_.as_ref() }
588*61046927SAndroid Build Coastguard Worker     }
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker 
591*61046927SAndroid Build Coastguard Worker impl nir_shader {
iter_functions(&self) -> ExecListIter<nir_function>592*61046927SAndroid Build Coastguard Worker     pub fn iter_functions(&self) -> ExecListIter<nir_function> {
593*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.functions, offset_of!(nir_function, node))
594*61046927SAndroid Build Coastguard Worker     }
595*61046927SAndroid Build Coastguard Worker 
iter_variables(&self) -> ExecListIter<nir_variable>596*61046927SAndroid Build Coastguard Worker     pub fn iter_variables(&self) -> ExecListIter<nir_variable> {
597*61046927SAndroid Build Coastguard Worker         ExecListIter::new(&self.variables, offset_of!(nir_variable, node))
598*61046927SAndroid Build Coastguard Worker     }
599*61046927SAndroid Build Coastguard Worker }
600