From 3009d0bd7d30b341a8697d85d9d42a9ee4910d19 Mon Sep 17 00:00:00 2001 From: Liam Date: Thu, 17 Mar 2022 14:45:38 -0400 Subject: Address review comments --- .../backend/spirv/emit_spirv_context_get_set.cpp | 15 +++++---------- .../backend/spirv/spirv_emit_context.cpp | 11 ++--------- 2 files changed, 7 insertions(+), 19 deletions(-) (limited to 'src/shader_recompiler/backend') diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 9f6d5e3a5..80b4bbd27 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -125,7 +125,6 @@ std::optional OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) { Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, u32 element_size, const IR::Value& binding, const IR::Value& offset, const Id indirect_func) { Id buffer_offset; - const Id uniform_type{ctx.uniform_types.*member_ptr}; if (offset.IsImmediate()) { // Hardware been proved to read the aligned offset (e.g. LDC.U32 at 6 will read offset 4) @@ -138,16 +137,12 @@ Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, } else { buffer_offset = ctx.Def(offset); } - - if (binding.IsImmediate()) { - const Id cbuf{ctx.cbufs[binding.U32()].*member_ptr}; - const Id access_chain{ - ctx.OpAccessChain(uniform_type, cbuf, ctx.u32_zero_value, buffer_offset)}; - return ctx.OpLoad(result_type, access_chain); - } else { - const std::array arguments{ctx.Def(binding), buffer_offset}; - return ctx.OpFunctionCall(result_type, indirect_func, arguments); + if (!binding.IsImmediate()) { + return ctx.OpFunctionCall(result_type, indirect_func, ctx.Def(binding), buffer_offset); } + const Id cbuf{ctx.cbufs[binding.U32()].*member_ptr}; + const Id access_chain{ctx.OpAccessChain(uniform_type, cbuf, ctx.u32_zero_value, buffer_offset)}; + return ctx.OpLoad(result_type, access_chain); } Id GetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index f85541a2e..aa5b6c9b7 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -994,7 +994,7 @@ void EmitContext::DefineConstantBuffers(const Info& info, u32& binding) { } return; } - IR::Type types{info.used_constant_buffer_types}; + IR::Type types{info.used_constant_buffer_types | info.used_indirect_cbuf_types}; if (True(types & IR::Type::U8)) { if (profile.support_int8) { DefineConstBuffers(*this, info, &UniformDefinitions::U8, binding, U8, 'u', sizeof(u8)); @@ -1032,7 +1032,6 @@ void EmitContext::DefineConstantBufferIndirectFunctions(const Info& info) { if (!info.uses_cbuf_indirect) { return; } - const auto make_accessor{[&](Id buffer_type, Id UniformDefinitions::*member_ptr) { const Id func_type{TypeFunction(buffer_type, U32[1], U32[1])}; const Id func{OpFunction(buffer_type, spv::FunctionControlMask::MaskNone, func_type)}; @@ -1050,10 +1049,8 @@ void EmitContext::DefineConstantBufferIndirectFunctions(const Info& info) { buf_labels[i] = OpLabel(); buf_literals[i] = Sirit::Literal{i}; } - OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone); OpSwitch(binding, buf_labels[0], buf_literals, buf_labels); - for (u32 i = 0; i < Info::MAX_CBUFS; i++) { AddLabel(buf_labels[i]); const Id cbuf{cbufs[i].*member_ptr}; @@ -1061,16 +1058,12 @@ void EmitContext::DefineConstantBufferIndirectFunctions(const Info& info) { const Id result{OpLoad(buffer_type, access_chain)}; OpReturnValue(result); } - AddLabel(merge_label); OpUnreachable(); OpFunctionEnd(); - return func; }}; - - IR::Type types{info.used_constant_buffer_types}; - + IR::Type types{info.used_indirect_cbuf_types}; if (True(types & IR::Type::U8)) { load_const_func_u8 = make_accessor(U8, &UniformDefinitions::U8); } -- cgit v1.2.3