diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-03-03 11:02:08 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-03 15:02:08 +0100 |
| commit | dc97457bf0121b9383054ca14d3c525b56b92634 (patch) | |
| tree | ecd78f76805b16bb01ec8d81f99f1cb3a2a43895 /Ryujinx.Graphics.Shader/StructuredIr | |
| parent | 3045c1a18644e50fd843dfce07d809e46d923ada (diff) | |
Initial support for double precision shader instructions. (#963)
* Implement DADD, DFMA and DMUL shader instructions
* Rename FP to FP32
* Correct double immediate
* Classic mistake
Diffstat (limited to 'Ryujinx.Graphics.Shader/StructuredIr')
3 files changed, 23 insertions, 9 deletions
diff --git a/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs b/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs index 0482c35e..3fcc5f11 100644 --- a/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs +++ b/Ryujinx.Graphics.Shader/StructuredIr/InstructionInfo.cs @@ -49,7 +49,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Add(Instruction.BitwiseOr, VariableType.Int, VariableType.Int, VariableType.Int); Add(Instruction.BranchIfTrue, VariableType.None, VariableType.Bool); Add(Instruction.BranchIfFalse, VariableType.None, VariableType.Bool); - Add(Instruction.Ceiling, VariableType.F32, VariableType.F32, VariableType.F32); + Add(Instruction.Ceiling, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar); Add(Instruction.Clamp, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar); Add(Instruction.ClampU32, VariableType.U32, VariableType.U32, VariableType.U32, VariableType.U32); Add(Instruction.CompareEqual, VariableType.Bool, VariableType.Scalar, VariableType.Scalar); @@ -63,6 +63,8 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Add(Instruction.CompareLessU32, VariableType.Bool, VariableType.U32, VariableType.U32); Add(Instruction.CompareNotEqual, VariableType.Bool, VariableType.Scalar, VariableType.Scalar); Add(Instruction.ConditionalSelect, VariableType.Scalar, VariableType.Bool, VariableType.Scalar, VariableType.Scalar); + Add(Instruction.ConvertFP32ToFP64, VariableType.F64, VariableType.F32); + Add(Instruction.ConvertFP64ToFP32, VariableType.F32, VariableType.F64); Add(Instruction.ConvertFPToS32, VariableType.S32, VariableType.F32); Add(Instruction.ConvertFPToU32, VariableType.U32, VariableType.F32); Add(Instruction.ConvertS32ToFP, VariableType.F32, VariableType.S32); @@ -74,8 +76,8 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Add(Instruction.ExponentB2, VariableType.Scalar, VariableType.Scalar); Add(Instruction.FindFirstSetS32, VariableType.S32, VariableType.S32); Add(Instruction.FindFirstSetU32, VariableType.S32, VariableType.U32); - Add(Instruction.Floor, VariableType.F32, VariableType.F32); - Add(Instruction.FusedMultiplyAdd, VariableType.F32, VariableType.F32, VariableType.F32, VariableType.F32); + Add(Instruction.Floor, VariableType.Scalar, VariableType.Scalar); + Add(Instruction.FusedMultiplyAdd, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar, VariableType.Scalar); Add(Instruction.ImageLoad, VariableType.F32); Add(Instruction.ImageStore, VariableType.None); Add(Instruction.IsNan, VariableType.Bool, VariableType.F32); @@ -106,9 +108,10 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Add(Instruction.MultiplyHighS32, VariableType.S32, VariableType.S32, VariableType.S32); Add(Instruction.MultiplyHighU32, VariableType.U32, VariableType.U32, VariableType.U32); Add(Instruction.Negate, VariableType.Scalar, VariableType.Scalar); + Add(Instruction.PackDouble2x32, VariableType.F64, VariableType.U32, VariableType.U32); Add(Instruction.PackHalf2x16, VariableType.U32, VariableType.F32, VariableType.F32); Add(Instruction.ReciprocalSquareRoot, VariableType.Scalar, VariableType.Scalar); - Add(Instruction.Round, VariableType.F32, VariableType.F32); + Add(Instruction.Round, VariableType.Scalar, VariableType.Scalar); Add(Instruction.Sine, VariableType.Scalar, VariableType.Scalar); Add(Instruction.SquareRoot, VariableType.Scalar, VariableType.Scalar); Add(Instruction.StoreGlobal, VariableType.None, VariableType.S32, VariableType.S32, VariableType.U32); @@ -119,7 +122,8 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Add(Instruction.SwizzleAdd, VariableType.F32, VariableType.F32, VariableType.F32, VariableType.S32); Add(Instruction.TextureSample, VariableType.F32); Add(Instruction.TextureSize, VariableType.S32, VariableType.S32, VariableType.S32); - Add(Instruction.Truncate, VariableType.F32, VariableType.F32); + Add(Instruction.Truncate, VariableType.Scalar, VariableType.Scalar); + Add(Instruction.UnpackDouble2x32, VariableType.U32, VariableType.F64); Add(Instruction.UnpackHalf2x16, VariableType.F32, VariableType.U32); Add(Instruction.VoteAll, VariableType.Bool, VariableType.Bool); Add(Instruction.VoteAllEqual, VariableType.Bool, VariableType.Bool); @@ -155,9 +159,18 @@ namespace Ryujinx.Graphics.Shader.StructuredIr { if (type == VariableType.Scalar) { - return (inst & Instruction.FP) != 0 - ? VariableType.F32 - : VariableType.S32; + if ((inst & Instruction.FP32) != 0) + { + return VariableType.F32; + } + else if ((inst & Instruction.FP64) != 0) + { + return VariableType.F64; + } + else + { + return VariableType.S32; + } } else if (type == VariableType.Int) { diff --git a/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs b/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs index 504dc386..4758b08f 100644 --- a/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs +++ b/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs @@ -104,7 +104,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr if (isCondSel && type == VariableType.F32) { - inst |= Instruction.FP; + inst |= Instruction.FP32; } dest.VarType = type; diff --git a/Ryujinx.Graphics.Shader/StructuredIr/VariableType.cs b/Ryujinx.Graphics.Shader/StructuredIr/VariableType.cs index 4c7f3849..0afafb2b 100644 --- a/Ryujinx.Graphics.Shader/StructuredIr/VariableType.cs +++ b/Ryujinx.Graphics.Shader/StructuredIr/VariableType.cs @@ -7,6 +7,7 @@ namespace Ryujinx.Graphics.Shader.StructuredIr Scalar, Int, F32, + F64, S32, U32 } |
