summaryrefslogtreecommitdiff
path: root/src/video_core/engines
diff options
context:
space:
mode:
authorGravatar bunnei2018-09-18 22:10:48 -0400
committerGravatar GitHub2018-09-18 22:10:48 -0400
commit0284cbe7ecfcff39bb6c7ac0a7c5e01480dafd24 (patch)
treefd79df648e4f2bfdbd2cf87e7b904047bbf8630d /src/video_core/engines
parentMerge pull request #1299 from FernandoS27/texture-sanatize (diff)
parentImplemented Internal Flags (diff)
downloadyuzu-0284cbe7ecfcff39bb6c7ac0a7c5e01480dafd24.tar.gz
yuzu-0284cbe7ecfcff39bb6c7ac0a7c5e01480dafd24.tar.xz
yuzu-0284cbe7ecfcff39bb6c7ac0a7c5e01480dafd24.zip
Merge pull request #1279 from FernandoS27/csetp
shader_decompiler: Implemented (Partialy) Control Codes and CSETP
Diffstat (limited to 'src/video_core/engines')
-rw-r--r--src/video_core/engines/shader_bytecode.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h
index 88b4d0bac..7e1de0fa1 100644
--- a/src/video_core/engines/shader_bytecode.h
+++ b/src/video_core/engines/shader_bytecode.h
@@ -240,6 +240,41 @@ enum class FlowCondition : u64 {
240 Fcsm_Tr = 0x1C, // TODO(bunnei): What is this used for? 240 Fcsm_Tr = 0x1C, // TODO(bunnei): What is this used for?
241}; 241};
242 242
243enum class ControlCode : u64 {
244 F = 0,
245 LT = 1,
246 EQ = 2,
247 LE = 3,
248 GT = 4,
249 NE = 5,
250 GE = 6,
251 Num = 7,
252 Nan = 8,
253 LTU = 9,
254 EQU = 10,
255 LEU = 11,
256 GTU = 12,
257 NEU = 13,
258 GEU = 14,
259 //
260 OFF = 16,
261 LO = 17,
262 SFF = 18,
263 LS = 19,
264 HI = 20,
265 SFT = 21,
266 HS = 22,
267 OFT = 23,
268 CSM_TA = 24,
269 CSM_TR = 25,
270 CSM_MX = 26,
271 FCSM_TA = 27,
272 FCSM_TR = 28,
273 FCSM_MX = 29,
274 RLE = 30,
275 RGT = 31,
276};
277
243enum class PredicateResultMode : u64 { 278enum class PredicateResultMode : u64 {
244 None = 0x0, 279 None = 0x0,
245 NotZero = 0x3, 280 NotZero = 0x3,
@@ -555,6 +590,15 @@ union Instruction {
555 } pset; 590 } pset;
556 591
557 union { 592 union {
593 BitField<0, 3, u64> pred0;
594 BitField<3, 3, u64> pred3;
595 BitField<8, 5, ControlCode> cc; // flag in cc
596 BitField<39, 3, u64> pred39;
597 BitField<42, 1, u64> neg_pred39;
598 BitField<45, 4, PredOperation> op; // op with pred39
599 } csetp;
600
601 union {
558 BitField<39, 3, u64> pred39; 602 BitField<39, 3, u64> pred39;
559 BitField<42, 1, u64> neg_pred; 603 BitField<42, 1, u64> neg_pred;
560 BitField<43, 1, u64> neg_a; 604 BitField<43, 1, u64> neg_a;
@@ -881,6 +925,7 @@ union Instruction {
881 BitField<36, 5, u64> index; 925 BitField<36, 5, u64> index;
882 } cbuf36; 926 } cbuf36;
883 927
928 BitField<47, 1, u64> generates_cc;
884 BitField<61, 1, u64> is_b_imm; 929 BitField<61, 1, u64> is_b_imm;
885 BitField<60, 1, u64> is_b_gpr; 930 BitField<60, 1, u64> is_b_gpr;
886 BitField<59, 1, u64> is_c_gpr; 931 BitField<59, 1, u64> is_c_gpr;
@@ -1005,6 +1050,7 @@ public:
1005 ISET_IMM, 1050 ISET_IMM,
1006 PSETP, 1051 PSETP,
1007 PSET, 1052 PSET,
1053 CSETP,
1008 XMAD_IMM, 1054 XMAD_IMM,
1009 XMAD_CR, 1055 XMAD_CR,
1010 XMAD_RC, 1056 XMAD_RC,
@@ -1241,6 +1287,7 @@ private:
1241 INST("0011011-0101----", Id::ISET_IMM, Type::IntegerSet, "ISET_IMM"), 1287 INST("0011011-0101----", Id::ISET_IMM, Type::IntegerSet, "ISET_IMM"),
1242 INST("0101000010001---", Id::PSET, Type::PredicateSetRegister, "PSET"), 1288 INST("0101000010001---", Id::PSET, Type::PredicateSetRegister, "PSET"),
1243 INST("0101000010010---", Id::PSETP, Type::PredicateSetPredicate, "PSETP"), 1289 INST("0101000010010---", Id::PSETP, Type::PredicateSetPredicate, "PSETP"),
1290 INST("010100001010----", Id::CSETP, Type::PredicateSetPredicate, "CSETP"),
1244 INST("0011011-00------", Id::XMAD_IMM, Type::Xmad, "XMAD_IMM"), 1291 INST("0011011-00------", Id::XMAD_IMM, Type::Xmad, "XMAD_IMM"),
1245 INST("0100111---------", Id::XMAD_CR, Type::Xmad, "XMAD_CR"), 1292 INST("0100111---------", Id::XMAD_CR, Type::Xmad, "XMAD_CR"),
1246 INST("010100010-------", Id::XMAD_RC, Type::Xmad, "XMAD_RC"), 1293 INST("010100010-------", Id::XMAD_RC, Type::Xmad, "XMAD_RC"),