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!("")
}
评论