Implement Force Early Z Register (#1755)

This commit is contained in:
riperiperi 2020-12-01 23:13:27 +00:00 committed by GitHub
parent e383c41b6e
commit 461c24092a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 60 additions and 2 deletions

View file

@ -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)
};
}

View file

@ -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;
}
}

View file

@ -0,0 +1,10 @@
using System;
namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
{
[Flags]
enum GuestGpuStateFlags : byte
{
EarlyZForce = 1 << 0
}
}

View file

@ -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;
}
}
}

View file

@ -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);
}
}
}