Giovanni Mascellani (@giomasce) commented about libs/vkd3d-shader/dxil.c:
}
+static void sm6_parser_emit_dx_barrier(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, + const struct sm6_value **operands, struct function_emission_state *state) +{ + struct vkd3d_shader_instruction *ins = state->ins; + unsigned int flags; + + vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_SYNC); + flags = sm6_value_get_constant_uint(operands[0]); + ins->flags = flags & ~(VKD3DSSF_GROUP_SHARED_MEMORY | VKD3DSSF_GLOBAL_UAV); + /* These are swapped in DXIL vs VSIR. */ + if (flags & VKD3DSSF_GROUP_SHARED_MEMORY) + ins->flags |= VKD3DSSF_GLOBAL_UAV; + if (flags & VKD3DSSF_GLOBAL_UAV) + ins->flags |= VKD3DSSF_GROUP_SHARED_MEMORY; Mostly nitpick, but in that case I'd just consider the two flag fields using two different namespaces. So something like:
ins->flags = flags & ~(DXIL_GROUP_SHARED_MEMORY | DXIL_GLOBAL_UAV);
if (flags & DXIL_GLOBAL_UAV)
ins->flags |= VKD3DSSF_GLOBAL_UAV;
if (flags & DXIL_GROUP_SHARED_MEMORY)
ins->flags |= VKD3DSSF_GROUP_SHARED_MEMORY;
Also, does it make sense to `FIXME()` if there are other flags? -- https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/681#note_64221