shader: generalize D16 buffer format component handling

This commit is contained in:
nmzik committed 2026-10-22 05:26:54 +02:00
1 parent d7c1896647
commit 753f285198
3 files changed
+47 -27

No files matched your search

@@ -455,12 +455,17 @@ void Translator::BUFFER_LOAD(const Decoder::Instruction& inst) {
AddMemoryInfo(memory, inst.pc));
if (bits != 32u) {
WriteOperand(inst.dst, WidenSubdword(loaded, bits, sign));
} else if (memory.data_dwords == 1u) {
WriteOperand(inst.dst, loaded);
} else {
for (uint32_t component = 0; component < memory.data_dwords; component++) {
WriteOperand(OffsetOperand(inst.dst, component),
ir.CompositeExtract(loaded, component));
return;
}
for (uint32_t component = 0; component < memory.data_dwords; component++) {
const auto dst = OffsetOperand(inst.dst, component);
const auto value =
memory.data_dwords == 1u ? IR::U32(loaded) : ir.CompositeExtract(loaded, component);
// D16 formats with an odd component count keep the high half of their final VGPR.
if (memory.data_bits == 16u && component * 2u + 1u == memory.component_count) {
Write16Bits(dst, value);
} else {
WriteOperand(dst, value);
}
}
}