Initial tessellation shader support (#2534)
* Initial tessellation shader support * Nits * Re-arrange built-in table * This is not needed anymore * PR feedback
This commit is contained in:
parent
7603dbe3c8
commit
d512ce122c
42 changed files with 775 additions and 148 deletions
|
@ -349,6 +349,26 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
|
|||
return flags;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Packs the tessellation parameters from the gpu accessor.
|
||||
/// </summary>
|
||||
/// <param name="gpuAccessor">The gpu accessor</param>
|
||||
/// <returns>The packed tessellation parameters</returns>
|
||||
private static byte GetTessellationModePacked(IGpuAccessor gpuAccessor)
|
||||
{
|
||||
byte value;
|
||||
|
||||
value = (byte)((int)gpuAccessor.QueryTessPatchType() & 3);
|
||||
value |= (byte)(((int)gpuAccessor.QueryTessSpacing() & 3) << 2);
|
||||
|
||||
if (gpuAccessor.QueryTessCw())
|
||||
{
|
||||
value |= 0x10;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new instance of <see cref="GuestGpuAccessorHeader"/> from an gpu accessor.
|
||||
/// </summary>
|
||||
|
@ -364,6 +384,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
|
|||
ComputeLocalMemorySize = gpuAccessor.QueryComputeLocalMemorySize(),
|
||||
ComputeSharedMemorySize = gpuAccessor.QueryComputeSharedMemorySize(),
|
||||
PrimitiveTopology = gpuAccessor.QueryPrimitiveTopology(),
|
||||
TessellationModePacked = GetTessellationModePacked(gpuAccessor),
|
||||
StateFlags = GetGpuStateFlags(gpuAccessor)
|
||||
};
|
||||
}
|
||||
|
|
|
@ -49,10 +49,15 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
|
|||
/// </summary>
|
||||
public InputTopology PrimitiveTopology;
|
||||
|
||||
/// <summary>
|
||||
/// Tessellation parameters (packed to fit on a byte).
|
||||
/// </summary>
|
||||
public byte TessellationModePacked;
|
||||
|
||||
/// <summary>
|
||||
/// Unused/reserved.
|
||||
/// </summary>
|
||||
public ushort Reserved2;
|
||||
public byte Reserved2;
|
||||
|
||||
/// <summary>
|
||||
/// GPU boolean state that can influence shader compilation.
|
||||
|
|
|
@ -134,6 +134,33 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
return _header.PrimitiveTopology;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries the tessellation evaluation shader primitive winding order.
|
||||
/// </summary>
|
||||
/// <returns>True if the primitive winding order is clockwise, false if counter-clockwise</returns>
|
||||
public bool QueryTessCw()
|
||||
{
|
||||
return (_header.TessellationModePacked & 0x10) != 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries the tessellation evaluation shader abstract patch type.
|
||||
/// </summary>
|
||||
/// <returns>Abstract patch type</returns>
|
||||
public TessPatchType QueryTessPatchType()
|
||||
{
|
||||
return (TessPatchType)(_header.TessellationModePacked & 3);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries the tessellation evaluation shader spacing between tessellated vertices of the patch.
|
||||
/// </summary>
|
||||
/// <returns>Spacing between tessellated vertices of the patch</returns>
|
||||
public TessSpacing QueryTessSpacing()
|
||||
{
|
||||
return (TessSpacing)((_header.TessellationModePacked >> 2) & 3);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the texture descriptor for a given texture on the pool.
|
||||
/// </summary>
|
||||
|
|
|
@ -168,10 +168,31 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
PrimitiveTopology.TriangleFan => InputTopology.Triangles,
|
||||
PrimitiveTopology.TrianglesAdjacency or
|
||||
PrimitiveTopology.TriangleStripAdjacency => InputTopology.TrianglesAdjacency,
|
||||
_ => InputTopology.Points,
|
||||
PrimitiveTopology.Patches => _state.TessellationMode.UnpackPatchType() == TessPatchType.Isolines
|
||||
? InputTopology.Lines
|
||||
: InputTopology.Triangles,
|
||||
_ => InputTopology.Points
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries the tessellation evaluation shader primitive winding order.
|
||||
/// </summary>
|
||||
/// <returns>True if the primitive winding order is clockwise, false if counter-clockwise</returns>
|
||||
public bool QueryTessCw() => _state.TessellationMode.UnpackCw();
|
||||
|
||||
/// <summary>
|
||||
/// Queries the tessellation evaluation shader abstract patch type.
|
||||
/// </summary>
|
||||
/// <returns>Abstract patch type</returns>
|
||||
public TessPatchType QueryTessPatchType() => _state.TessellationMode.UnpackPatchType();
|
||||
|
||||
/// <summary>
|
||||
/// Queries the tessellation evaluation shader spacing between tessellated vertices of the patch.
|
||||
/// </summary>
|
||||
/// <returns>Spacing between tessellated vertices of the patch</returns>
|
||||
public TessSpacing QueryTessSpacing() => _state.TessellationMode.UnpackSpacing();
|
||||
|
||||
/// <summary>
|
||||
/// Gets the texture descriptor for a given texture on the pool.
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Ryujinx.Graphics.GAL;
|
||||
using Ryujinx.Graphics.Gpu.Engine.Threed;
|
||||
|
||||
namespace Ryujinx.Graphics.Gpu.Shader
|
||||
{
|
||||
|
@ -32,6 +33,11 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
/// </summary>
|
||||
public PrimitiveTopology Topology { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Tessellation mode.
|
||||
/// </summary>
|
||||
public TessMode TessellationMode { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the GPU accessor state.
|
||||
/// </summary>
|
||||
|
@ -40,18 +46,21 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
/// <param name="textureBufferIndex">Constant buffer slot where the texture handles are located</param>
|
||||
/// <param name="earlyZForce">Early Z force enable</param>
|
||||
/// <param name="topology">Primitive topology</param>
|
||||
/// <param name="tessellationMode">Tessellation mode</param>
|
||||
public GpuAccessorState(
|
||||
ulong texturePoolGpuVa,
|
||||
int texturePoolMaximumId,
|
||||
int textureBufferIndex,
|
||||
bool earlyZForce,
|
||||
PrimitiveTopology topology)
|
||||
PrimitiveTopology topology,
|
||||
TessMode tessellationMode)
|
||||
{
|
||||
TexturePoolGpuVa = texturePoolGpuVa;
|
||||
TexturePoolMaximumId = texturePoolMaximumId;
|
||||
TextureBufferIndex = textureBufferIndex;
|
||||
EarlyZForce = earlyZForce;
|
||||
Topology = topology;
|
||||
TessellationMode = tessellationMode;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
/// <summary>
|
||||
/// Version of the codegen (to be changed when codegen or guest format change).
|
||||
/// </summary>
|
||||
private const ulong ShaderCodeGenVersion = 2702;
|
||||
private const ulong ShaderCodeGenVersion = 2534;
|
||||
|
||||
// Progress reporting helpers
|
||||
private volatile int _shaderCount;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue