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