summaryrefslogtreecommitdiff
path: root/src/video_core/shader/expr.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2019-09-23 22:55:25 -0400
committerGravatar FernandoS272019-10-25 09:01:30 -0400
commit8909f52166bf9c27d52b5a722efbd46d1a11e876 (patch)
tree2e21bbc3c3f5422325d8003d72cdb4bb120a26e5 /src/video_core/shader/expr.h
parentShader_Cache: setup connection of ConstBufferLocker (diff)
downloadyuzu-8909f52166bf9c27d52b5a722efbd46d1a11e876.tar.gz
yuzu-8909f52166bf9c27d52b5a722efbd46d1a11e876.tar.xz
yuzu-8909f52166bf9c27d52b5a722efbd46d1a11e876.zip
Shader_IR: Implement Fast BRX and allow multi-branches in the CFG.
Diffstat (limited to 'src/video_core/shader/expr.h')
-rw-r--r--src/video_core/shader/expr.h17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/video_core/shader/expr.h b/src/video_core/shader/expr.h
index d3dcd00ec..e41d23e93 100644
--- a/src/video_core/shader/expr.h
+++ b/src/video_core/shader/expr.h
@@ -17,13 +17,14 @@ using Tegra::Shader::Pred;
17class ExprAnd; 17class ExprAnd;
18class ExprBoolean; 18class ExprBoolean;
19class ExprCondCode; 19class ExprCondCode;
20class ExprGprEqual;
20class ExprNot; 21class ExprNot;
21class ExprOr; 22class ExprOr;
22class ExprPredicate; 23class ExprPredicate;
23class ExprVar; 24class ExprVar;
24 25
25using ExprData = 26using ExprData = std::variant<ExprVar, ExprCondCode, ExprPredicate, ExprNot, ExprOr, ExprAnd,
26 std::variant<ExprVar, ExprCondCode, ExprPredicate, ExprNot, ExprOr, ExprAnd, ExprBoolean>; 27 ExprBoolean, ExprGprEqual>;
27using Expr = std::shared_ptr<ExprData>; 28using Expr = std::shared_ptr<ExprData>;
28 29
29class ExprAnd final { 30class ExprAnd final {
@@ -118,6 +119,18 @@ public:
118 bool value; 119 bool value;
119}; 120};
120 121
122class ExprGprEqual final {
123public:
124 ExprGprEqual(u32 gpr, u32 value) : gpr{gpr}, value{value} {}
125
126 bool operator==(const ExprGprEqual& b) const {
127 return gpr == b.gpr && value == b.value;
128 }
129
130 u32 gpr;
131 u32 value;
132};
133
121template <typename T, typename... Args> 134template <typename T, typename... Args>
122Expr MakeExpr(Args&&... args) { 135Expr MakeExpr(Args&&... args) {
123 static_assert(std::is_convertible_v<T, ExprData>); 136 static_assert(std::is_convertible_v<T, ExprData>);