expr.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. // Copyright 2019 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <memory>
  6. #include <variant>
  7. #include "video_core/engines/shader_bytecode.h"
  8. namespace VideoCommon::Shader {
  9. using Tegra::Shader::ConditionCode;
  10. using Tegra::Shader::Pred;
  11. class ExprAnd;
  12. class ExprBoolean;
  13. class ExprCondCode;
  14. class ExprGprEqual;
  15. class ExprNot;
  16. class ExprOr;
  17. class ExprPredicate;
  18. class ExprVar;
  19. using ExprData = std::variant<ExprVar, ExprCondCode, ExprPredicate, ExprNot, ExprOr, ExprAnd,
  20. ExprBoolean, ExprGprEqual>;
  21. using Expr = std::shared_ptr<ExprData>;
  22. class ExprAnd final {
  23. public:
  24. explicit ExprAnd(Expr a, Expr b) : operand1{std::move(a)}, operand2{std::move(b)} {}
  25. bool operator==(const ExprAnd& b) const;
  26. bool operator!=(const ExprAnd& b) const;
  27. Expr operand1;
  28. Expr operand2;
  29. };
  30. class ExprOr final {
  31. public:
  32. explicit ExprOr(Expr a, Expr b) : operand1{std::move(a)}, operand2{std::move(b)} {}
  33. bool operator==(const ExprOr& b) const;
  34. bool operator!=(const ExprOr& b) const;
  35. Expr operand1;
  36. Expr operand2;
  37. };
  38. class ExprNot final {
  39. public:
  40. explicit ExprNot(Expr a) : operand1{std::move(a)} {}
  41. bool operator==(const ExprNot& b) const;
  42. bool operator!=(const ExprNot& b) const;
  43. Expr operand1;
  44. };
  45. class ExprVar final {
  46. public:
  47. explicit ExprVar(u32 index) : var_index{index} {}
  48. bool operator==(const ExprVar& b) const {
  49. return var_index == b.var_index;
  50. }
  51. bool operator!=(const ExprVar& b) const {
  52. return !operator==(b);
  53. }
  54. u32 var_index;
  55. };
  56. class ExprPredicate final {
  57. public:
  58. explicit ExprPredicate(u32 predicate_) : predicate{predicate_} {}
  59. bool operator==(const ExprPredicate& b) const {
  60. return predicate == b.predicate;
  61. }
  62. bool operator!=(const ExprPredicate& b) const {
  63. return !operator==(b);
  64. }
  65. u32 predicate;
  66. };
  67. class ExprCondCode final {
  68. public:
  69. explicit ExprCondCode(ConditionCode condition_code) : cc{condition_code} {}
  70. bool operator==(const ExprCondCode& b) const {
  71. return cc == b.cc;
  72. }
  73. bool operator!=(const ExprCondCode& b) const {
  74. return !operator==(b);
  75. }
  76. ConditionCode cc;
  77. };
  78. class ExprBoolean final {
  79. public:
  80. explicit ExprBoolean(bool val) : value{val} {}
  81. bool operator==(const ExprBoolean& b) const {
  82. return value == b.value;
  83. }
  84. bool operator!=(const ExprBoolean& b) const {
  85. return !operator==(b);
  86. }
  87. bool value;
  88. };
  89. class ExprGprEqual final {
  90. public:
  91. explicit ExprGprEqual(u32 gpr_, u32 value_) : gpr{gpr_}, value{value_} {}
  92. bool operator==(const ExprGprEqual& b) const {
  93. return gpr == b.gpr && value == b.value;
  94. }
  95. bool operator!=(const ExprGprEqual& b) const {
  96. return !operator==(b);
  97. }
  98. u32 gpr;
  99. u32 value;
  100. };
  101. template <typename T, typename... Args>
  102. Expr MakeExpr(Args&&... args) {
  103. static_assert(std::is_convertible_v<T, ExprData>);
  104. return std::make_shared<ExprData>(T(std::forward<Args>(args)...));
  105. }
  106. bool ExprAreEqual(const Expr& first, const Expr& second);
  107. bool ExprAreOpposite(const Expr& first, const Expr& second);
  108. Expr MakeExprNot(Expr first);
  109. Expr MakeExprAnd(Expr first, Expr second);
  110. Expr MakeExprOr(Expr first, Expr second);
  111. bool ExprIsTrue(const Expr& first);
  112. } // namespace VideoCommon::Shader