Signatures are complicated by the ids not always matching in the DXBC signature and the DXIL metadata version of it. This is because elements with the same semantic but different registers are collapsed in DXIL into a single declaration with a row count to show how many registers it occupies. This can be accommodated by adding a register_count field to struct vkd3d_shader_signature_element, but element ids in DXIL load/store instructions would need to be messily translated to the IR ones. I think it makes sense instead to use separate input/output declaration functions for SM 6. This bypasses the id problem and also means no unnecessary private variables.