From b9200dd734d4201ec9d8e07e203152d32392a69e Mon Sep 17 00:00:00 2001 From: gdkchan Date: Fri, 8 Jan 2021 22:55:55 -0300 Subject: Support conditional on BRK and SYNC shader instructions (#1878) * Support conditional on BRK and SYNC shader instructions * Add TODO comment and bump cache version --- Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs | 6 +----- Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs | 2 +- Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs | 16 ++++++++++++++++ Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs | 5 +---- 4 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs (limited to 'Ryujinx.Graphics.Shader/Decoders') diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs index 71cb9bca..9ca437b3 100644 --- a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs +++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs @@ -2,10 +2,8 @@ using Ryujinx.Graphics.Shader.Instructions; namespace Ryujinx.Graphics.Shader.Decoders { - class OpCodeBranch : OpCode + class OpCodeBranch : OpCodeConditional { - public Condition Condition { get; } - public int Offset { get; } public bool PushTarget { get; protected set; } @@ -14,8 +12,6 @@ namespace Ryujinx.Graphics.Shader.Decoders public OpCodeBranch(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode) { - Condition = (Condition)(opCode & 0x1f); - Offset = ((int)(opCode >> 20) << 8) >> 8; PushTarget = false; diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs index f6c3e4f4..31804870 100644 --- a/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs +++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace Ryujinx.Graphics.Shader.Decoders { - class OpCodeBranchPop : OpCode + class OpCodeBranchPop : OpCodeConditional { public Dictionary Targets { get; } diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs new file mode 100644 index 00000000..f9110707 --- /dev/null +++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs @@ -0,0 +1,16 @@ +using Ryujinx.Graphics.Shader.Instructions; + +namespace Ryujinx.Graphics.Shader.Decoders +{ + class OpCodeConditional : OpCode + { + public Condition Condition { get; } + + public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeExit(emitter, address, opCode); + + public OpCodeConditional(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode) + { + Condition = (Condition)opCode.Extract(0, 5); + } + } +} \ No newline at end of file diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs index caad26a3..f63d5d11 100644 --- a/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs +++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs @@ -2,15 +2,12 @@ using Ryujinx.Graphics.Shader.Instructions; namespace Ryujinx.Graphics.Shader.Decoders { - class OpCodeExit : OpCode + class OpCodeExit : OpCodeConditional { - public Condition Condition { get; } - public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeExit(emitter, address, opCode); public OpCodeExit(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode) { - Condition = (Condition)opCode.Extract(0, 5); } } } \ No newline at end of file -- cgit v1.2.3