diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2019-12-29 14:41:50 -0300 |
|---|---|---|
| committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
| commit | 654e617fe78b0f5cc86d0bcf0625301abff168f5 (patch) | |
| tree | 01f2eba89039698bec583a3e29c4c50d0e20b8d1 /Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs | |
| parent | af8498d6790ba83f1cf87eccf5f272f2ccbeb169 (diff) | |
Some code cleanup
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs')
| -rw-r--r-- | Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs new file mode 100644 index 00000000..78dcde49 --- /dev/null +++ b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs @@ -0,0 +1,105 @@ +using System; + +namespace Ryujinx.Graphics.Shader.Translation +{ + struct ShaderConfig + { + public ShaderStage Stage { get; } + + public OutputTopology OutputTopology { get; } + + public int MaxOutputVertices { get; } + + public OutputMapTarget[] OmapTargets { get; } + public bool OmapSampleMask { get; } + public bool OmapDepth { get; } + + public TranslationFlags Flags { get; } + + private QueryInfoCallback _queryInfoCallback; + + public ShaderConfig(TranslationFlags flags, QueryInfoCallback queryInfoCallback) + { + Stage = ShaderStage.Compute; + OutputTopology = OutputTopology.PointList; + MaxOutputVertices = 0; + OmapTargets = null; + OmapSampleMask = false; + OmapDepth = false; + Flags = flags; + _queryInfoCallback = queryInfoCallback; + } + + public ShaderConfig(ShaderHeader header, TranslationFlags flags, QueryInfoCallback queryInfoCallback) + { + Stage = header.Stage; + OutputTopology = header.OutputTopology; + MaxOutputVertices = header.MaxOutputVertexCount; + OmapTargets = header.OmapTargets; + OmapSampleMask = header.OmapSampleMask; + OmapDepth = header.OmapDepth; + Flags = flags; + _queryInfoCallback = queryInfoCallback; + } + + public int GetDepthRegister() + { + int count = 0; + + for (int index = 0; index < OmapTargets.Length; index++) + { + for (int component = 0; component < 4; component++) + { + if (OmapTargets[index].ComponentEnabled(component)) + { + count++; + } + } + } + + // The depth register is always two registers after the last color output. + return count + 1; + } + + public bool QueryInfoBool(QueryInfoName info, int index = 0) + { + return Convert.ToBoolean(QueryInfo(info, index)); + } + + public int QueryInfo(QueryInfoName info, int index = 0) + { + if (_queryInfoCallback != null) + { + return _queryInfoCallback(info, index); + } + else + { + switch (info) + { + case QueryInfoName.ComputeLocalSizeX: + case QueryInfoName.ComputeLocalSizeY: + case QueryInfoName.ComputeLocalSizeZ: + return 1; + case QueryInfoName.ComputeSharedMemorySize: + return 0xc000; + case QueryInfoName.IsTextureBuffer: + return Convert.ToInt32(false); + case QueryInfoName.IsTextureRectangle: + return Convert.ToInt32(false); + case QueryInfoName.MaximumViewportDimensions: + return 0x8000; + case QueryInfoName.PrimitiveTopology: + return (int)InputTopology.Points; + case QueryInfoName.StorageBufferOffsetAlignment: + return 16; + case QueryInfoName.SupportsNonConstantTextureOffset: + return Convert.ToInt32(true); + case QueryInfoName.ViewportTransformEnable: + return Convert.ToInt32(true); + } + } + + return 0; + } + } +}
\ No newline at end of file |
