mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-23 02:24:38 +00:00
83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "shader_recompiler/frontend/opcodes.h"
|
|
#include "shader_recompiler/frontend/translate/translate.h"
|
|
|
|
namespace Shader::Gcn {
|
|
|
|
void Translator::EmitFlowControl(u32 pc, const GcnInst& inst) {
|
|
switch (inst.opcode) {
|
|
case Opcode::S_BARRIER:
|
|
return S_BARRIER();
|
|
case Opcode::S_TTRACEDATA:
|
|
LOG_WARNING(Render_Vulkan, "S_TTRACEDATA instruction!");
|
|
return;
|
|
case Opcode::S_SETPRIO:
|
|
LOG_WARNING(Render_Vulkan, "S_SETPRIO instruction!");
|
|
return;
|
|
case Opcode::S_TRAP:
|
|
LOG_WARNING(Render_Vulkan, "S_TRAP instruction!");
|
|
return;
|
|
case Opcode::S_GETPC_B64:
|
|
return S_GETPC_B64(pc, inst);
|
|
case Opcode::S_SETPC_B64:
|
|
case Opcode::S_WAITCNT:
|
|
case Opcode::S_NOP:
|
|
case Opcode::S_ENDPGM:
|
|
case Opcode::S_CBRANCH_EXECZ:
|
|
case Opcode::S_CBRANCH_SCC0:
|
|
case Opcode::S_CBRANCH_SCC1:
|
|
case Opcode::S_CBRANCH_VCCNZ:
|
|
case Opcode::S_CBRANCH_VCCZ:
|
|
case Opcode::S_CBRANCH_EXECNZ:
|
|
case Opcode::S_BRANCH:
|
|
return;
|
|
case Opcode::S_SENDMSG:
|
|
S_SENDMSG(inst);
|
|
return;
|
|
default:
|
|
UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
void Translator::S_BARRIER() {
|
|
ir.Barrier();
|
|
}
|
|
|
|
void Translator::S_GETPC_B64(u32 pc, const GcnInst& inst) {
|
|
// This only really exists to let resource tracking pass know
|
|
// there is an inline cbuf.
|
|
const IR::ScalarReg dst{inst.dst[0].code};
|
|
ir.SetScalarReg(dst, ir.Imm32(pc));
|
|
ir.SetScalarReg(dst + 1, ir.Imm32(0));
|
|
}
|
|
|
|
void Translator::S_SENDMSG(const GcnInst& inst) {
|
|
const auto& simm = reinterpret_cast<const SendMsgSimm&>(inst.control.sopp.simm);
|
|
switch (simm.msg) {
|
|
case SendMsgSimm::Message::Gs: {
|
|
switch (simm.op) {
|
|
case SendMsgSimm::GsOp::Nop:
|
|
break;
|
|
case SendMsgSimm::GsOp::Cut:
|
|
ir.EmitPrimitive();
|
|
break;
|
|
case SendMsgSimm::GsOp::Emit:
|
|
ir.EmitVertex();
|
|
break;
|
|
default:
|
|
UNREACHABLE();
|
|
}
|
|
break;
|
|
}
|
|
case SendMsgSimm::Message::GsDone: {
|
|
break;
|
|
}
|
|
default:
|
|
UNREACHABLE();
|
|
}
|
|
}
|
|
|
|
} // namespace Shader::Gcn
|