aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Decoders
diff options
context:
space:
mode:
authorgdk <gab.dark.100@gmail.com>2019-10-17 23:41:18 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit1b7d95519569639135a68e7ebda5148f3263217c (patch)
tree52a5e471418bf28ce970a268e1b86b64abc9048f /Ryujinx.Graphics.Shader/Decoders
parent717ace6f6ed65118148dc78976c6e818a095fa4d (diff)
Initial support for image stores, support texture sample on compute
Diffstat (limited to 'Ryujinx.Graphics.Shader/Decoders')
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/ImageComponents.cs11
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/ImageDimensions.cs12
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/OpCodeImage.cs48
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs1
-rw-r--r--Ryujinx.Graphics.Shader/Decoders/TexelLoadTarget.cs16
5 files changed, 80 insertions, 8 deletions
diff --git a/Ryujinx.Graphics.Shader/Decoders/ImageComponents.cs b/Ryujinx.Graphics.Shader/Decoders/ImageComponents.cs
new file mode 100644
index 00000000..b8a4f6d5
--- /dev/null
+++ b/Ryujinx.Graphics.Shader/Decoders/ImageComponents.cs
@@ -0,0 +1,11 @@
+namespace Ryujinx.Graphics.Shader.Decoders
+{
+ enum ImageComponents
+ {
+ Red = 1 << 0,
+ Green = 1 << 1,
+ Blue = 1 << 2,
+ Alpha = 1 << 3
+
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Decoders/ImageDimensions.cs b/Ryujinx.Graphics.Shader/Decoders/ImageDimensions.cs
new file mode 100644
index 00000000..ecf41a82
--- /dev/null
+++ b/Ryujinx.Graphics.Shader/Decoders/ImageDimensions.cs
@@ -0,0 +1,12 @@
+namespace Ryujinx.Graphics.Shader.Decoders
+{
+ enum ImageDimensions
+ {
+ Image1D,
+ ImageBuffer,
+ Image1DArray,
+ Image2D,
+ Image2DArray,
+ Image3D
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeImage.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeImage.cs
new file mode 100644
index 00000000..42fe677b
--- /dev/null
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeImage.cs
@@ -0,0 +1,48 @@
+using Ryujinx.Graphics.Shader.Instructions;
+
+namespace Ryujinx.Graphics.Shader.Decoders
+{
+ class OpCodeImage : OpCode
+ {
+ public Register Ra { get; }
+ public Register Rb { get; }
+ public Register Rc { get; }
+
+ public ImageComponents Components { get; }
+ public IntegerSize Size { get; }
+
+ public bool ByteAddress { get; }
+
+ public ImageDimensions Dimensions { get; }
+
+ public int Immediate { get; }
+
+ public bool UseComponents { get; }
+ public bool IsBindless { get; }
+
+ public OpCodeImage(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
+ {
+ Ra = new Register(opCode.Extract(8, 8), RegisterType.Gpr);
+ Rb = new Register(opCode.Extract(0, 8), RegisterType.Gpr);
+ Rc = new Register(opCode.Extract(39, 8), RegisterType.Gpr);
+
+ UseComponents = !opCode.Extract(52);
+
+ if (UseComponents)
+ {
+ Components = (ImageComponents)opCode.Extract(20, 4);
+ }
+ else
+ {
+ Size = (IntegerSize)opCode.Extract(20, 4);
+ }
+
+ ByteAddress = !opCode.Extract(23);
+
+ Dimensions = (ImageDimensions)opCode.Extract(33, 3);
+
+ Immediate = opCode.Extract(36, 13);
+ IsBindless = !opCode.Extract(51);
+ }
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs b/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs
index 3fd1de86..5128dae3 100644
--- a/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/OpCodeTable.cs
@@ -143,6 +143,7 @@ namespace Ryujinx.Graphics.Shader.Decoders
Set("111000101001xx", InstEmit.Ssy, typeof(OpCodeSsy));
Set("1110111101010x", InstEmit.St, typeof(OpCodeMemory));
Set("1110111011011x", InstEmit.Stg, typeof(OpCodeMemory));
+ Set("11101011001xxx", InstEmit.Sust, typeof(OpCodeImage));
Set("1111000011111x", InstEmit.Sync, typeof(OpCodeSync));
Set("110000xxxx111x", InstEmit.Tex, typeof(OpCodeTex));
Set("1101111010111x", InstEmit.TexB, typeof(OpCodeTexB));
diff --git a/Ryujinx.Graphics.Shader/Decoders/TexelLoadTarget.cs b/Ryujinx.Graphics.Shader/Decoders/TexelLoadTarget.cs
index 478cac44..e5a0c004 100644
--- a/Ryujinx.Graphics.Shader/Decoders/TexelLoadTarget.cs
+++ b/Ryujinx.Graphics.Shader/Decoders/TexelLoadTarget.cs
@@ -2,14 +2,14 @@ namespace Ryujinx.Graphics.Shader.Decoders
{
enum TexelLoadTarget
{
- Texture1DLodZero = 0x0,
- Texture1DLodLevel = 0x1,
- Texture2DLodZero = 0x2,
- Texture2DLodZeroOffset = 0x4,
- Texture2DLodLevel = 0x5,
+ Texture1DLodZero = 0x0,
+ Texture1DLodLevel = 0x1,
+ Texture2DLodZero = 0x2,
+ Texture2DLodZeroOffset = 0x4,
+ Texture2DLodLevel = 0x5,
Texture2DLodZeroMultisample = 0x6,
- Texture3DLodZero = 0x7,
- Texture2DArrayLodZero = 0x8,
- Texture2DLodLevelOffset = 0xc
+ Texture3DLodZero = 0x7,
+ Texture2DArrayLodZero = 0x8,
+ Texture2DLodLevelOffset = 0xc
}
} \ No newline at end of file