summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/spirv
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-03-14 03:41:05 -0300
committerGravatar ameerj2021-07-22 21:51:23 -0400
commit71f96fa6366dc6dd306a953bca1b958fb32bc55a (patch)
tree12e13f9502e4b9510446c967a831e5d4bacb729e /src/shader_recompiler/backend/spirv
parentspirv: Add SignedZeroInfNanPreserve logic (diff)
downloadyuzu-71f96fa6366dc6dd306a953bca1b958fb32bc55a.tar.gz
yuzu-71f96fa6366dc6dd306a953bca1b958fb32bc55a.tar.xz
yuzu-71f96fa6366dc6dd306a953bca1b958fb32bc55a.zip
shader: Implement CAL inlining function calls
Diffstat (limited to 'src/shader_recompiler/backend/spirv')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_context.cpp6
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.cpp17
2 files changed, 8 insertions, 15 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_context.cpp b/src/shader_recompiler/backend/spirv/emit_context.cpp
index 278b26b50..f848c6175 100644
--- a/src/shader_recompiler/backend/spirv/emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_context.cpp
@@ -262,10 +262,8 @@ void EmitContext::DefineTextures(const Info& info, u32& binding) {
262} 262}
263 263
264void EmitContext::DefineLabels(IR::Program& program) { 264void EmitContext::DefineLabels(IR::Program& program) {
265 for (const IR::Function& function : program.functions) { 265 for (IR::Block* const block : program.blocks) {
266 for (IR::Block* const block : function.blocks) { 266 block->SetDefinition(OpLabel());
267 block->SetDefinition(OpLabel());
268 }
269 } 267 }
270} 268}
271 269
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index c7cba6279..7e7db9161 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -10,7 +10,6 @@
10 10
11#include "shader_recompiler/backend/spirv/emit_spirv.h" 11#include "shader_recompiler/backend/spirv/emit_spirv.h"
12#include "shader_recompiler/frontend/ir/basic_block.h" 12#include "shader_recompiler/frontend/ir/basic_block.h"
13#include "shader_recompiler/frontend/ir/function.h"
14#include "shader_recompiler/frontend/ir/microinstruction.h" 13#include "shader_recompiler/frontend/ir/microinstruction.h"
15#include "shader_recompiler/frontend/ir/program.h" 14#include "shader_recompiler/frontend/ir/program.h"
16 15
@@ -199,18 +198,14 @@ Id PhiArgDef(EmitContext& ctx, IR::Inst* inst, size_t index) {
199std::vector<u32> EmitSPIRV(const Profile& profile, Environment& env, IR::Program& program) { 198std::vector<u32> EmitSPIRV(const Profile& profile, Environment& env, IR::Program& program) {
200 EmitContext ctx{profile, program}; 199 EmitContext ctx{profile, program};
201 const Id void_function{ctx.TypeFunction(ctx.void_id)}; 200 const Id void_function{ctx.TypeFunction(ctx.void_id)};
202 // FIXME: Forward declare functions (needs sirit support) 201 const Id func{ctx.OpFunction(ctx.void_id, spv::FunctionControlMask::MaskNone, void_function)};
203 Id func{}; 202 for (IR::Block* const block : program.blocks) {
204 for (IR::Function& function : program.functions) { 203 ctx.AddLabel(block->Definition<Id>());
205 func = ctx.OpFunction(ctx.void_id, spv::FunctionControlMask::MaskNone, void_function); 204 for (IR::Inst& inst : block->Instructions()) {
206 for (IR::Block* const block : function.blocks) { 205 EmitInst(ctx, &inst);
207 ctx.AddLabel(block->Definition<Id>());
208 for (IR::Inst& inst : block->Instructions()) {
209 EmitInst(ctx, &inst);
210 }
211 } 206 }
212 ctx.OpFunctionEnd();
213 } 207 }
208 ctx.OpFunctionEnd();
214 boost::container::small_vector<Id, 32> interfaces; 209 boost::container::small_vector<Id, 32> interfaces;
215 const Info& info{program.info}; 210 const Info& info{program.info};
216 if (info.uses_workgroup_id) { 211 if (info.uses_workgroup_id) {