@@ -571,6 +571,25 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag,
571
571
pass_args.c_str ());
572
572
return false ;
573
573
}
574
+ } else if (pass_name == " struct-packing" ) {
575
+ if (pass_args.size () == 0 ) {
576
+ Error (consumer (), nullptr , {},
577
+ " --struct-packing requires a name:rule argument." );
578
+ return false ;
579
+ }
580
+
581
+ auto separator_pos = pass_args.find (' :' );
582
+ if (separator_pos == std::string::npos || separator_pos == 0 ||
583
+ separator_pos + 1 == pass_args.size ()) {
584
+ Errorf (consumer (), nullptr , {},
585
+ " Invalid argument for --struct-packing: %s" , pass_args.c_str ());
586
+ return false ;
587
+ }
588
+
589
+ const std::string struct_name = pass_args.substr (0 , separator_pos);
590
+ const std::string rule_name = pass_args.substr (separator_pos + 1 );
591
+
592
+ RegisterPass (CreateStructPackingPass (struct_name.c_str (), rule_name.c_str ()));
574
593
} else if (pass_name == " switch-descriptorset" ) {
575
594
if (pass_args.size () == 0 ) {
576
595
Error (consumer (), nullptr , {},
@@ -1152,6 +1171,14 @@ Optimizer::PassToken CreateTrimCapabilitiesPass() {
1152
1171
MakeUnique<opt::TrimCapabilitiesPass>());
1153
1172
}
1154
1173
1174
+ Optimizer::PassToken CreateStructPackingPass (const char * structToPack,
1175
+ const char * packingRule) {
1176
+ return MakeUnique<Optimizer::PassToken::Impl>(
1177
+ MakeUnique<opt::StructPackingPass>(
1178
+ structToPack,
1179
+ opt::StructPackingPass::ParsePackingRuleFromString (packingRule)));
1180
+ }
1181
+
1155
1182
Optimizer::PassToken CreateSwitchDescriptorSetPass (uint32_t from, uint32_t to) {
1156
1183
return MakeUnique<Optimizer::PassToken::Impl>(
1157
1184
MakeUnique<opt::SwitchDescriptorSetPass>(from, to));
0 commit comments