forked from Mirror/Ryujinx
Implement Force Early Z Register (#1755)
This commit is contained in:
parent
e383c41b6e
commit
461c24092a
8 changed files with 60 additions and 2 deletions
|
@ -332,6 +332,23 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
|
|||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builds gpu state flags using information from the given gpu accessor.
|
||||
/// </summary>
|
||||
/// <param name="gpuAccessor">The gpu accessor</param>
|
||||
/// <returns>The gpu state flags</returns>
|
||||
private static GuestGpuStateFlags GetGpuStateFlags(IGpuAccessor gpuAccessor)
|
||||
{
|
||||
GuestGpuStateFlags flags = 0;
|
||||
|
||||
if (gpuAccessor.QueryEarlyZForce())
|
||||
{
|
||||
flags |= GuestGpuStateFlags.EarlyZForce;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new instance of <see cref="GuestGpuAccessorHeader"/> from an gpu accessor.
|
||||
/// </summary>
|
||||
|
@ -347,6 +364,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
|
|||
ComputeLocalMemorySize = gpuAccessor.QueryComputeLocalMemorySize(),
|
||||
ComputeSharedMemorySize = gpuAccessor.QueryComputeSharedMemorySize(),
|
||||
PrimitiveTopology = gpuAccessor.QueryPrimitiveTopology(),
|
||||
StateFlags = GetGpuStateFlags(gpuAccessor)
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -55,8 +55,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
|
|||
public ushort Reserved2;
|
||||
|
||||
/// <summary>
|
||||
/// Unused/reserved.
|
||||
/// GPU boolean state that can influence shader compilation.
|
||||
/// </summary>
|
||||
public byte Reserved3;
|
||||
public GuestGpuStateFlags StateFlags;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
using System;
|
||||
|
||||
namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
|
||||
{
|
||||
[Flags]
|
||||
enum GuestGpuStateFlags : byte
|
||||
{
|
||||
EarlyZForce = 1 << 0
|
||||
}
|
||||
}
|
|
@ -150,5 +150,14 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
|
||||
return textureDescriptor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries if host state forces early depth testing.
|
||||
/// </summary>
|
||||
/// <returns>True if early depth testing is forced</returns>
|
||||
public bool QueryEarlyZForce()
|
||||
{
|
||||
return (_header.StateFlags & GuestGpuStateFlags.EarlyZForce) != 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -196,5 +196,14 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
return _context.Methods.TextureManager.GetGraphicsTextureDescriptor(_state, _stageIndex, handle);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queries if host state forces early depth testing.
|
||||
/// </summary>
|
||||
/// <returns>True if early depth testing is forced</returns>
|
||||
public bool QueryEarlyZForce()
|
||||
{
|
||||
return _state.Get<bool>(MethodOffset.EarlyZForce);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
LaunchDma = 0x6c,
|
||||
LoadInlineData = 0x6d,
|
||||
CopyDstTexture = 0x80,
|
||||
EarlyZForce = 0x84,
|
||||
CopySrcTexture = 0x8c,
|
||||
DispatchParamsAddress = 0xad,
|
||||
Dispatch = 0xaf,
|
||||
|
|
|
@ -141,6 +141,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
{
|
||||
if (context.Config.Stage == ShaderStage.Fragment)
|
||||
{
|
||||
if (context.Config.GpuAccessor.QueryEarlyZForce())
|
||||
{
|
||||
context.AppendLine("layout(early_fragment_tests) in;");
|
||||
context.AppendLine();
|
||||
}
|
||||
|
||||
context.AppendLine($"uniform bool {DefaultNames.IsBgraName}[8];");
|
||||
context.AppendLine();
|
||||
}
|
||||
|
|
|
@ -78,5 +78,10 @@
|
|||
{
|
||||
return TextureFormat.R8G8B8A8Unorm;
|
||||
}
|
||||
|
||||
bool QueryEarlyZForce()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue