// Names of struct members must be unique across vertex and primitive output. // Therefore, when writing the primitive output struct, we might need to rename some fields. letmut name = self.names[&NameKey::StructMember(struct_ty, index as u32)].clone(); if existing_names.contains(&name) {
name = self.namer.call(&name);
} else { // Let the namer know this is illegal to use again let _ = self.namer.call(&name);
}
writeln!(self.out, "{level2}) {{")?;
writeln!(self.out, "{level3}{result_name} = {NAMESPACE}::uint3(0u);")?;
writeln!(self.out, "{level2}}}")?;
}
writeln!( self.out, "{level2}{grid_name}.set_threadgroups_per_grid({result_name});"
)?;
}
writeln!(self.out, "{indent}}}")?;
writeln!(self.out, "{indent}return;")?;
} elseiflet Some(ref info) = ep.mesh_info { let mesh_out = out_mesh_info.as_ref().unwrap(); let out_ty = module.global_variables[info.output_variable].ty; let mesh_out_name = mesh_out_name.unwrap(); let mesh_variable_name = mesh_variable_name.unwrap(); // The output type is guaranteed to be a struct with exactly 4 members letcrate::TypeInner::Struct { ref members, .. } = module.types[out_ty].inner else {
unreachable!();
}; let get_out_value = |bi| { let member_idx = members
.iter()
.position(|a| a.binding == Some(crate::Binding::BuiltIn(bi)))
.unwrap() as u32;
format!( "{}.{}",
mesh_variable_name, self.names[&NameKey::StructMember(out_ty, member_idx)]
)
}; let vert_count = format!( "{NAMESPACE}::min({}, {}u)",
get_out_value(crate::BuiltIn::VertexCount),
info.max_vertices
); let prim_count = format!( "{NAMESPACE}::min({}, {}u)",
get_out_value(crate::BuiltIn::PrimitiveCount),
info.max_primitives
); let workgroup_size: u32 = ep.workgroup_size.iter().product();
{ let vert_index = self.namer.call("vertexIndex"); let in_array = get_out_value(crate::BuiltIn::Vertices);
writeln!( self.out, "{indent}for(uint {vert_index} = {local_invocation_index}; {vert_index} < {vert_count}; {vert_index} += {workgroup_size}) {{"
)?; let out_vert = self.namer.call("vertex");
writeln!( self.out, "{indent}{indent}{} {out_vert};",
mesh_out.out_vertex_ty_name,
)?; for (member_idx, new_name) in mesh_out.out_vertex_member_names.iter().enumerate() { let in_value = format!( "{in_array}.{WRAPPED_ARRAY_FIELD}[{vert_index}].{}", self.names
[&NameKey::StructMember(info.vertex_output_type, member_idx as u32)]
); let out_value = format!("{out_vert}.{}", new_name.as_ref().unwrap());
writeln!(self.out, "{indent}{indent}{out_value} = {in_value};")?;
}
writeln!( self.out, "{indent}{indent}{}.set_vertex({vert_index}, {out_vert});",
mesh_out_name
)?;
writeln!(self.out, "{indent}}}")?;
}
{ let prim_index = self.namer.call("primitiveIndex"); let in_array = get_out_value(crate::BuiltIn::Primitives);
writeln!( self.out, "{indent}for(uint {prim_index} = {local_invocation_index}; {prim_index} < {prim_count}; {prim_index} += {workgroup_size}) {{"
)?; let out_prim = self.namer.call("primitive");
writeln!( self.out, "{indent}{indent}{} {out_prim};",
mesh_out.out_primitive_ty_name
)?; for (member_idx, new_name) in mesh_out.out_primitive_member_names.iter().enumerate()
{ let in_value = format!( "{in_array}.{WRAPPED_ARRAY_FIELD}[{prim_index}].{}", self.names
[&NameKey::StructMember(info.primitive_output_type, member_idx as u32)]
); iflet Some(new_name) = new_name.as_ref() { let out_value = format!("{out_prim}.{new_name}");
writeln!( self.out, "{indent}{}{out_value} = {in_value};",
back::INDENT
)?;
} else { let num_indices = match info.topology { crate::MeshOutputTopology::Points => 1, crate::MeshOutputTopology::Lines => 2, crate::MeshOutputTopology::Triangles => 3,
}; for i in0..num_indices { let component = if num_indices == 1 { "".to_string()
} else {
format!(".{}", back::COMPONENTS[i])
};
writeln!( self.out, "{indent}{}{}.set_index({prim_index} * {num_indices} + {i}, {in_value}{component});",
back::INDENT,
mesh_out_name,
)?;
}
}
}
writeln!( self.out, "{indent}{}{}.set_primitive({prim_index}, {out_prim});",
back::INDENT,
mesh_out_name
)?;
writeln!(self.out, "{indent}}}")?;
}
writeln!(self.out, "{indent}if ({local_invocation_index} == 0u) {{")?;
writeln!( self.out, "{indent}{indent}{}.set_primitive_count({prim_count});",
mesh_out_name,
)?;
writeln!(self.out, "{indent}}}")?;
} else { // Must either have task output grid (task shader) or mesh output info (mesh shader)
unreachable!()
}
writeln!(self.out, "}}")?;
Ok(())
}
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.11Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-06)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.