summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp15
-rw-r--r--src/shader_recompiler/backend/spirv/spirv_emit_context.cpp11
2 files changed, 7 insertions, 19 deletions
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<OutAttr> OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) {
125Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, u32 element_size, 125Id GetCbuf(EmitContext& ctx, Id result_type, Id UniformDefinitions::*member_ptr, u32 element_size,
126 const IR::Value& binding, const IR::Value& offset, const Id indirect_func) { 126 const IR::Value& binding, const IR::Value& offset, const Id indirect_func) {
127 Id buffer_offset; 127 Id buffer_offset;
128
129 const Id uniform_type{ctx.uniform_types.*member_ptr}; 128 const Id uniform_type{ctx.uniform_types.*member_ptr};
130 if (offset.IsImmediate()) { 129 if (offset.IsImmediate()) {
131 // Hardware been proved to read the aligned offset (e.g. LDC.U32 at 6 will read offset 4) 130 // 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,
138 } else { 137 } else {
139 buffer_offset = ctx.Def(offset); 138 buffer_offset = ctx.Def(offset);
140 } 139 }
141 140 if (!binding.IsImmediate()) {
142 if (binding.IsImmediate()) { 141 return ctx.OpFunctionCall(result_type, indirect_func, ctx.Def(binding), buffer_offset);
143 const Id cbuf{ctx.cbufs[binding.U32()].*member_ptr};
144 const Id access_chain{
145 ctx.OpAccessChain(uniform_type, cbuf, ctx.u32_zero_value, buffer_offset)};
146 return ctx.OpLoad(result_type, access_chain);
147 } else {
148 const std::array<Id, 2> arguments{ctx.Def(binding), buffer_offset};
149 return ctx.OpFunctionCall(result_type, indirect_func, arguments);
150 } 142 }
143 const Id cbuf{ctx.cbufs[binding.U32()].*member_ptr};
144 const Id access_chain{ctx.OpAccessChain(uniform_type, cbuf, ctx.u32_zero_value, buffer_offset)};
145 return ctx.OpLoad(result_type, access_chain);
151} 146}
152 147
153Id GetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset) { 148Id 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) {
994 } 994 }
995 return; 995 return;
996 } 996 }
997 IR::Type types{info.used_constant_buffer_types}; 997 IR::Type types{info.used_constant_buffer_types | info.used_indirect_cbuf_types};
998 if (True(types & IR::Type::U8)) { 998 if (True(types & IR::Type::U8)) {
999 if (profile.support_int8) { 999 if (profile.support_int8) {
1000 DefineConstBuffers(*this, info, &UniformDefinitions::U8, binding, U8, 'u', sizeof(u8)); 1000 DefineConstBuffers(*this, info, &UniformDefinitions::U8, binding, U8, 'u', sizeof(u8));
@@ -1032,7 +1032,6 @@ void EmitContext::DefineConstantBufferIndirectFunctions(const Info& info) {
1032 if (!info.uses_cbuf_indirect) { 1032 if (!info.uses_cbuf_indirect) {
1033 return; 1033 return;
1034 } 1034 }
1035
1036 const auto make_accessor{[&](Id buffer_type, Id UniformDefinitions::*member_ptr) { 1035 const auto make_accessor{[&](Id buffer_type, Id UniformDefinitions::*member_ptr) {
1037 const Id func_type{TypeFunction(buffer_type, U32[1], U32[1])}; 1036 const Id func_type{TypeFunction(buffer_type, U32[1], U32[1])};
1038 const Id func{OpFunction(buffer_type, spv::FunctionControlMask::MaskNone, func_type)}; 1037 const Id func{OpFunction(buffer_type, spv::FunctionControlMask::MaskNone, func_type)};
@@ -1050,10 +1049,8 @@ void EmitContext::DefineConstantBufferIndirectFunctions(const Info& info) {
1050 buf_labels[i] = OpLabel(); 1049 buf_labels[i] = OpLabel();
1051 buf_literals[i] = Sirit::Literal{i}; 1050 buf_literals[i] = Sirit::Literal{i};
1052 } 1051 }
1053
1054 OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone); 1052 OpSelectionMerge(merge_label, spv::SelectionControlMask::MaskNone);
1055 OpSwitch(binding, buf_labels[0], buf_literals, buf_labels); 1053 OpSwitch(binding, buf_labels[0], buf_literals, buf_labels);
1056
1057 for (u32 i = 0; i < Info::MAX_CBUFS; i++) { 1054 for (u32 i = 0; i < Info::MAX_CBUFS; i++) {
1058 AddLabel(buf_labels[i]); 1055 AddLabel(buf_labels[i]);
1059 const Id cbuf{cbufs[i].*member_ptr}; 1056 const Id cbuf{cbufs[i].*member_ptr};
@@ -1061,16 +1058,12 @@ void EmitContext::DefineConstantBufferIndirectFunctions(const Info& info) {
1061 const Id result{OpLoad(buffer_type, access_chain)}; 1058 const Id result{OpLoad(buffer_type, access_chain)};
1062 OpReturnValue(result); 1059 OpReturnValue(result);
1063 } 1060 }
1064
1065 AddLabel(merge_label); 1061 AddLabel(merge_label);
1066 OpUnreachable(); 1062 OpUnreachable();
1067 OpFunctionEnd(); 1063 OpFunctionEnd();
1068
1069 return func; 1064 return func;
1070 }}; 1065 }};
1071 1066 IR::Type types{info.used_indirect_cbuf_types};
1072 IR::Type types{info.used_constant_buffer_types};
1073
1074 if (True(types & IR::Type::U8)) { 1067 if (True(types & IR::Type::U8)) {
1075 load_const_func_u8 = make_accessor(U8, &UniformDefinitions::U8); 1068 load_const_func_u8 = make_accessor(U8, &UniformDefinitions::U8);
1076 } 1069 }