From 9d7a142a48a5f804127fcae2265bb6ec5495d178 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 16 Dec 2019 01:59:46 -0300 Subject: Support texture rectangle targets (non-normalized coords) --- Ryujinx.Graphics.Shader/ShaderConfig.cs | 103 +++++++++++++++++++++++++++----- 1 file changed, 89 insertions(+), 14 deletions(-) (limited to 'Ryujinx.Graphics.Shader/ShaderConfig.cs') diff --git a/Ryujinx.Graphics.Shader/ShaderConfig.cs b/Ryujinx.Graphics.Shader/ShaderConfig.cs index 3088cfbb..6b3640df 100644 --- a/Ryujinx.Graphics.Shader/ShaderConfig.cs +++ b/Ryujinx.Graphics.Shader/ShaderConfig.cs @@ -1,4 +1,5 @@ using Ryujinx.Graphics.Shader.Translation; +using System; namespace Ryujinx.Graphics.Shader { @@ -6,26 +7,100 @@ namespace Ryujinx.Graphics.Shader { public ShaderStage Stage { get; } - public ShaderCapabilities Capabilities { 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; } - public int MaxOutputVertices { get; } + private QueryInfoCallback _queryInfoCallback; - public OutputTopology OutputTopology { get; } + 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 ShaderConfig( - ShaderStage stage, - ShaderCapabilities capabilities, - TranslationFlags flags, - int maxOutputVertices, - OutputTopology outputTopology) + public bool QueryInfoBool(QueryInfoName info, int index = 0) { - Stage = stage; - Capabilities = capabilities; - Flags = flags; - MaxOutputVertices = maxOutputVertices; - OutputTopology = outputTopology; + 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 -- cgit v1.2.3