// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include "common/common_types.h" #include "shader_recompiler/frontend/ir/flow_test.h" #include "shader_recompiler/frontend/ir/pred.h" namespace Shader::IR { class Condition { public: Condition() noexcept = default; explicit Condition(FlowTest flow_test_, Pred pred_, bool pred_negated_ = false) noexcept : flow_test{static_cast(flow_test_)}, pred{static_cast(pred_)}, pred_negated{pred_negated_ ? u8{1} : u8{0}} {} explicit Condition(Pred pred_, bool pred_negated_ = false) noexcept : Condition(FlowTest::T, pred_, pred_negated_) {} explicit Condition(bool value) : Condition(Pred::PT, !value) {} auto operator<=>(const Condition&) const noexcept = default; [[nodiscard]] IR::FlowTest GetFlowTest() const noexcept { return static_cast(flow_test); } [[nodiscard]] std::pair GetPred() const noexcept { return {static_cast(pred), pred_negated != 0}; } private: u16 flow_test; u8 pred; u8 pred_negated; }; std::string NameOf(Condition condition); } // namespace Shader::IR template <> struct fmt::formatter { constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } template auto format(const Shader::IR::Condition& cond, FormatContext& ctx) { return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(cond)); } };