Mostly out of curiosity, is there anything in particular that strikes you as unidiomatic?
As you probably were anticipating, that it initializes the descriptor in two halves. I don't hate it of course, I just don't find it maximally idiomatic.
Something that's perhaps also worth pointing out: Now that we have ir.c, most of the vkd3d_shader_scan() code would perhaps be more appropriate there than in vkd3d_shader_main.c. I'm not sure if moving it is worth it, but if we are going to move it, it's probably easier to do that before adding much to it.
I was actually thinking that at least some of the code was probably going to belong in the individual frontends. I don't think any of the frontends declare descriptors in the same way, at least, so it hardly makes sense to me to have that in common code. The control flow scanning probably makes sense in ir.c, though.