From 7eaf1188a2a21ddab7c3dfc1bcabdb2fcfaec5f1 Mon Sep 17 00:00:00 2001 From: DH Date: Thu, 26 Sep 2024 20:18:28 +0300 Subject: [PATCH] gpu2: add fat exec test --- rpcsx-gpu2/lib/gcn-shader/src/gcn.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/rpcsx-gpu2/lib/gcn-shader/src/gcn.cpp b/rpcsx-gpu2/lib/gcn-shader/src/gcn.cpp index fcd017e28..938a75e72 100644 --- a/rpcsx-gpu2/lib/gcn-shader/src/gcn.cpp +++ b/rpcsx-gpu2/lib/gcn-shader/src/gcn.cpp @@ -1381,10 +1381,13 @@ static ir::Value deserializeGcnRegion( createOperandWrite(loc, builder, injectExecTest, *resultOperand, inst); } + bool hasDestination = resultOperand != nullptr; + for (std::size_t index = 0; auto &op : operands) { auto opIndex = index++; + auto ¶mInfo = params[opIndex]; - if ((op.access & GcnOperand::W) != GcnOperand::W) { + if ((paramInfo.access & Access::Write) != Access::Write) { continue; } @@ -1393,6 +1396,24 @@ static ir::Value deserializeGcnRegion( auto value = builder.createSpvLoad(loc, paramType, arg); createOperandWrite(loc, builder, injectExecTest, op, value); + hasDestination = true; + } + + if (!hasDestination && injectExecTest) { + auto mergeBlock = builder.createSpvLabel(loc); + gcn::Builder::createInsertBefore(converter, mergeBlock) + .createSpvBranch(loc, mergeBlock); + auto instBlock = gcn::Builder::createInsertAfter(converter, instrBegin) + .createSpvLabel(loc); + auto prependInstBuilder = + gcn::Builder::createInsertBefore(converter, instBlock); + auto exec = prependInstBuilder.createValue( + loc, ir::amdgpu::EXEC_TEST, + converter.getType(execTestSem->returnType)); + prependInstBuilder.createSpvSelectionMerge( + loc, mergeBlock, ir::spv::SelectionControl::None); + prependInstBuilder.createSpvBranchConditional(loc, exec, instBlock, + mergeBlock); } }