mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-25 11:34:55 +00:00
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / linux-sdl-gcc (push) Blocked by required conditions
Build and Release / linux-qt-gcc (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions
By squidbus' suggestion, I've added a warning log for this case.
79 lines
2.1 KiB
C++
79 lines
2.1 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_GETPC_B64:
|
|
return S_GETPC_B64(pc, inst);
|
|
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
|