I haven't done a full review yet, but in general this looks about exactly like what I was expecting, so very nice. Two major questions:
* Patch 6/7 ("vkd3d-shader/hlsl: Always load from a synthetic copy in add_load_component().") is the slightly iffy one to me. It makes me nervous that we're generating LOAD instructions during parsing. On the other hand it's not hard to see that it never gets called in a way that can put those loads on the LHS, so I don't hate it. The alternative of course would be to create something like hlsl_new_index_component() and then rely on lowering, but that would require extra code. Although actually it seems that this is the only caller of hlsl_new_load_component() so maybe that's worthwhile anyway? I dunno...
* Instead of worrying about matrix majority for indices, can we just say that HLSL_IR_INDEX ignores majority and always returns columns (or is it rows?), and rely on lower_index_loads() to split those indexes into multiple loads if necessary? add_expr() in that case would just use dimy (or is it dimx?) instead of hlsl_type_major_size().