2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

Address review comments

This commit is contained in:
Liam 2022-03-17 09:30:41 -04:00
parent 1415542f73
commit 3ac522ba41

View file

@ -124,31 +124,28 @@ std::optional<OutAttr> OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) {
Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, u32 element_size, Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, u32 element_size,
const IR::Value& binding, const IR::Value& offset) { const IR::Value& binding, const IR::Value& offset) {
std::array<Id, 2> indexes; Id buffer_offset;
const Id uniform_type{ctx.uniform_types.*member_ptr}; const Id uniform_type{ctx.uniform_types.*member_ptr};
if (offset.IsImmediate()) { if (offset.IsImmediate()) {
// Hardware been proved to read the aligned offset (e.g. LDC.U32 at 6 will read offset 4) // Hardware been proved to read the aligned offset (e.g. LDC.U32 at 6 will read offset 4)
const Id imm_offset{ctx.Const(offset.U32() / element_size)}; const Id imm_offset{ctx.Const(offset.U32() / element_size)};
indexes = {ctx.u32_zero_value, imm_offset}; buffer_offset = imm_offset;
} else if (element_size > 1) {
const u32 log2_element_size{static_cast<u32>(std::countr_zero(element_size))};
const Id shift{ctx.Const(log2_element_size)};
buffer_offset = ctx.OpShiftRightArithmetic(ctx.U32[1], ctx.Def(offset), shift);
} else { } else {
Id index{ctx.Def(offset)}; buffer_offset = ctx.Def(offset);
if (element_size > 1) {
const u32 log2_element_size{static_cast<u32>(std::countr_zero(element_size))};
const Id shift{ctx.Const(log2_element_size)};
index = ctx.OpShiftRightArithmetic(ctx.U32[1], ctx.Def(offset), shift);
}
indexes = {ctx.u32_zero_value, index};
} }
if (binding.IsImmediate()) { if (binding.IsImmediate()) {
const Id cbuf{ctx.cbufs[binding.U32()].*member_ptr}; const Id cbuf{ctx.cbufs[binding.U32()].*member_ptr};
const Id access_chain{ctx.OpAccessChain(uniform_type, cbuf, indexes)}; const Id access_chain{
ctx.OpAccessChain(uniform_type, cbuf, ctx.u32_zero_value, buffer_offset)};
return ctx.OpLoad(result_type, access_chain); return ctx.OpLoad(result_type, access_chain);
} else { } else {
const Id index{ctx.Def(binding)}; const Id index{ctx.Def(binding)};
const Id ptr{ctx.TypePointer(spv::StorageClass::Function, result_type)};
const Id value{ctx.AddLocalVariable(ptr, spv::StorageClass::Function)};
const Id merge_label = ctx.OpLabel(); const Id merge_label = ctx.OpLabel();
std::array<Id, Info::MAX_CBUFS> buf_labels; std::array<Id, Info::MAX_CBUFS> buf_labels;
@ -161,18 +158,20 @@ Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr,
ctx.OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone); ctx.OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone);
ctx.OpSwitch(index, buf_labels[0], buf_literals, buf_labels); ctx.OpSwitch(index, buf_labels[0], buf_literals, buf_labels);
std::array<Id, Info::MAX_CBUFS * 2> phi_targets;
for (u32 i = 0; i < Info::MAX_CBUFS; i++) { for (u32 i = 0; i < Info::MAX_CBUFS; i++) {
ctx.AddLabel(buf_labels[i]); ctx.AddLabel(buf_labels[i]);
const Id cbuf{ctx.cbufs[i].*member_ptr}; const Id cbuf{ctx.cbufs[i].*member_ptr};
const Id access_chain{ctx.OpAccessChain(uniform_type, cbuf, indexes)}; const Id access_chain{
const Id result = ctx.OpLoad(result_type, access_chain); ctx.OpAccessChain(uniform_type, cbuf, ctx.u32_zero_value, buffer_offset)};
ctx.OpStore(value, result); phi_targets[2 * i + 0] = ctx.OpLoad(result_type, access_chain);
phi_targets[2 * i + 1] = buf_labels[i];
ctx.OpBranch(merge_label); ctx.OpBranch(merge_label);
} }
ctx.AddLabel(merge_label); ctx.AddLabel(merge_label);
return ctx.OpLoad(result_type, value); return ctx.OpPhi(result_type, phi_targets);
} }
} }