diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-08-10 04:50:21 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-08-21 19:50:38 +0200 |
commit | 4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7 (patch) | |
tree | 230bc98a8bdd67a95c5abde32294655469845b3b /src/video_core/shader/decode/warp.cpp | |
parent | Merge pull request #2748 from FernandoS27/align-memory (diff) | |
download | yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.tar yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.tar.gz yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.tar.bz2 yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.tar.lz yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.tar.xz yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.tar.zst yuzu-4e35177e23069ad7a4cb0fdfa2ad5b34300c44f7.zip |
Diffstat (limited to 'src/video_core/shader/decode/warp.cpp')
-rw-r--r-- | src/video_core/shader/decode/warp.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/video_core/shader/decode/warp.cpp b/src/video_core/shader/decode/warp.cpp new file mode 100644 index 000000000..04ca74f46 --- /dev/null +++ b/src/video_core/shader/decode/warp.cpp @@ -0,0 +1,55 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/assert.h" +#include "common/common_types.h" +#include "video_core/engines/shader_bytecode.h" +#include "video_core/shader/node_helper.h" +#include "video_core/shader/shader_ir.h" + +namespace VideoCommon::Shader { + +using Tegra::Shader::Instruction; +using Tegra::Shader::OpCode; +using Tegra::Shader::Pred; +using Tegra::Shader::VoteOperation; + +namespace { +OperationCode GetOperationCode(VoteOperation vote_op) { + switch (vote_op) { + case VoteOperation::All: + return OperationCode::VoteAll; + case VoteOperation::Any: + return OperationCode::VoteAny; + case VoteOperation::Eq: + return OperationCode::VoteEqual; + default: + UNREACHABLE_MSG("Invalid vote operation={}", static_cast<u64>(vote_op)); + return OperationCode::VoteAll; + } +} +} // Anonymous namespace + +u32 ShaderIR::DecodeWarp(NodeBlock& bb, u32 pc) { + const Instruction instr = {program_code[pc]}; + const auto opcode = OpCode::Decode(instr); + + switch (opcode->get().GetId()) { + case OpCode::Id::VOTE: { + const Node value = GetPredicate(instr.vote.value, instr.vote.negate_value != 0); + const Node active = Operation(OperationCode::BallotThread, value); + const Node vote = Operation(GetOperationCode(instr.vote.operation), value); + SetRegister(bb, instr.gpr0, active); + SetPredicate(bb, instr.vote.dest_pred, vote); + break; + } + default: + UNIMPLEMENTED_MSG("Unhandled warp instruction: {}", opcode->get().GetName()); + break; + } + + return pc; +} + +} // namespace VideoCommon::Shader |