diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2022-12-29 12:09:34 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-29 16:09:34 +0100 |
| commit | 9dfe81770a8337a7a469eb3bac0ae9599cc0f61c (patch) | |
| tree | e0c470a0ae67984394037f72fb7e16250674ba7e /Ryujinx.Graphics.Shader/IntermediateRepresentation | |
| parent | 52c115a1f8f98dcd0a1f9da3d176f4a100f825b4 (diff) | |
Use vector outputs for texture operations (#3939)
* Change AggregateType to include vector type counts
* Replace VariableType uses with AggregateType and delete VariableType
* Support new local vector types on SPIR-V and GLSL
* Start using vector outputs for texture operations
* Use vectors on more texture operations
* Use vector output for ImageLoad operations
* Replace all uses of single destination texture constructors with multi destination ones
* Update textureGatherOffsets replacement to split vector operations
* Shader cache version bump
Co-authored-by: Ac_K <Acoustik666@gmail.com>
Diffstat (limited to 'Ryujinx.Graphics.Shader/IntermediateRepresentation')
3 files changed, 19 insertions, 11 deletions
diff --git a/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs b/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs index 9a2c844d..aa9776bc 100644 --- a/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs +++ b/Ryujinx.Graphics.Shader/IntermediateRepresentation/Instruction.cs @@ -134,6 +134,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation Truncate, UnpackDouble2x32, UnpackHalf2x16, + VectorExtract, VoteAll, VoteAllEqual, VoteAny, diff --git a/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs b/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs index 96132633..18e203a7 100644 --- a/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs +++ b/Ryujinx.Graphics.Shader/IntermediateRepresentation/Operation.cs @@ -62,18 +62,25 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation Inst = inst; Index = index; - // The array may be modified externally, so we store a copy. - _dests = (Operand[])dests.Clone(); - - for (int dstIndex = 0; dstIndex < dests.Length; dstIndex++) + if (dests != null) { - Operand dest = dests[dstIndex]; + // The array may be modified externally, so we store a copy. + _dests = (Operand[])dests.Clone(); - if (dest != null && dest.Type == OperandType.LocalVariable) + for (int dstIndex = 0; dstIndex < dests.Length; dstIndex++) { - dest.AsgOp = this; + Operand dest = dests[dstIndex]; + + if (dest != null && dest.Type == OperandType.LocalVariable) + { + dest.AsgOp = this; + } } } + else + { + _dests = Array.Empty<Operand>(); + } } public Operation(Instruction inst, Operand dest, params Operand[] sources) : this(sources) diff --git a/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs b/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs index 8cfcb0e9..6ab868cd 100644 --- a/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs +++ b/Ryujinx.Graphics.Shader/IntermediateRepresentation/TextureOperation.cs @@ -19,8 +19,8 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation int cbufSlot, int handle, int compIndex, - Operand dest, - Operand[] sources) : base(inst, compIndex, dest, sources) + Operand[] dests, + Operand[] sources) : base(inst, compIndex, dests, sources) { Type = type; Format = format; @@ -36,8 +36,8 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation TextureFlags flags, int handle, int compIndex, - Operand dest, - Operand[] sources) : this(inst, type, format, flags, DefaultCbufSlot, handle, compIndex, dest, sources) + Operand[] dests, + Operand[] sources) : this(inst, type, format, flags, DefaultCbufSlot, handle, compIndex, dests, sources) { } |
