This commit is contained in:
marc0246 2023-03-30 20:55:53 +02:00 committed by GitHub
parent 5a050d85bf
commit 836b9098ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -52,7 +52,7 @@ pub fn derive_vertex(ast: syn::DeriveInput) -> Result<TokenStream> {
} else if attr_ident == "format" { } else if attr_ident == "format" {
let format_ident = attr.parse_args_with(Ident::parse)?; let format_ident = attr.parse_args_with(Ident::parse)?;
format = quote! { format = quote! {
let format = ::#crate_ident::format::Format::#format_ident; ::#crate_ident::format::Format::#format_ident;
}; };
} }
} }
@ -66,23 +66,34 @@ pub fn derive_vertex(ast: syn::DeriveInput) -> Result<TokenStream> {
members = quote! { members = quote! {
#members #members
let field_size = ::std::mem::size_of::<#field_ty>() as u32;
{ {
#format let field_align = ::std::mem::align_of::<#field_ty>();
let format_size = format.block_size().expect("no block size for format") as u32; offset = (offset + field_align - 1) & !(field_align - 1);
let field_size = ::std::mem::size_of::<#field_ty>();
let format = #format;
let format_size = format
.block_size()
.expect("no block size for format") as usize;
let num_elements = field_size / format_size; let num_elements = field_size / format_size;
let remainder = field_size % format_size; let remainder = field_size % format_size;
::std::assert!(remainder == 0, "struct field `{}` size does not fit multiple of format size", #field_name_lit); ::std::assert!(
remainder == 0,
"struct field `{}` size does not fit multiple of format size",
#field_name_lit,
);
members.insert( members.insert(
#name.to_string(), #name.to_string(),
::#crate_ident::pipeline::graphics::vertex_input::VertexMemberInfo { ::#crate_ident::pipeline::graphics::vertex_input::VertexMemberInfo {
offset, offset: offset.try_into().unwrap(),
format, format,
num_elements, num_elements: num_elements.try_into().unwrap(),
}, },
); );
offset += field_size;
} }
offset += field_size as usize;
}; };
} }
} }