pub fn extract(&mut self, obj: &Symbol, idx: &Symbol)-> Result<Var>{ let obj = self.get(&obj)?; match obj.ty.clone() { SpirvType::Var(ty) => { match ty { Type::Array(ty, num)=> { panic!("{:?}", ty) } Type::Vec(ty, num)=> { //注意 Vec 只能支持简单类型 let idx = self.get_const(idx).unwrap(); let ty = SpirvType::Var((*ty).clone()); let ty_id = self.get_type(ty.clone()); let id = self.builder.composite_extract(ty_id, None, obj.id, vec![idx.id])?; return Ok(Var{id, ty}); } Type::Struct(def)=> { panic!("{:?}", def) } _=> { panic!("{:?}", obj) } } } SpirvType::Pointer(ty, cls)=> { if let Type::Struct(def) = ty { let def = self.get_def(&def.name.as_str()); let name = SmolStr::try_from(self.get_const(idx).unwrap().val).unwrap(); let (idx, field_ty) = def.get_field(name.as_str()).unwrap(); let idx = Symbol::Const(self.add_const(Dynamic::U32(idx as u32))); let field_ty = SpirvType::Pointer(field_ty, cls); let pt_id = self.get_type(field_ty.clone()); let id = self.builder.access_chain(pt_id, None, obj.id, vec![self.get_const(&idx).unwrap().id])?; return Ok(Var{id, ty: field_ty}); } else if let Type::Array(elem_ty, num) = ty { let pt_ty = SpirvType::Pointer((*elem_ty).clone(), cls); let pt_id = self.get_type(pt_ty.clone()); let idx = self.get(idx)?; let id = self.builder.access_chain(pt_id, None, obj.id, vec![idx.id])?; return Ok(Var{id, ty: pt_ty}); } } _=> { panic!("{:?}", obj) } } panic!("") }
评论