Use a new approach for shader BRX targets (#2532)
* Use a new approach for shader BRX targets * Make shader cache actually work * Improve the shader pattern matching a bit * Extend LDC search to predecessor blocks, catches more cases * Nit * Only save the amount of constant buffer data actually used. Avoids crashes on partially mapped buffers * Ignore Rd on predicate instructions, as they do not have a Rd register (catches more cases)
This commit is contained in:
parent
70f79e689b
commit
d9d18439f6
12 changed files with 472 additions and 149 deletions
|
@ -11,6 +11,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
{
|
||||
private readonly GpuContext _context;
|
||||
private readonly ReadOnlyMemory<byte> _data;
|
||||
private readonly ReadOnlyMemory<byte> _cb1Data;
|
||||
private readonly GuestGpuAccessorHeader _header;
|
||||
private readonly Dictionary<int, GuestTextureDescriptor> _textureDescriptors;
|
||||
|
||||
|
@ -19,12 +20,19 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
/// </summary>
|
||||
/// <param name="context">GPU context</param>
|
||||
/// <param name="data">The data of the shader</param>
|
||||
/// <param name="cb1Data">The constant buffer 1 data of the shader</param>
|
||||
/// <param name="header">The cache of the GPU accessor</param>
|
||||
/// <param name="guestTextureDescriptors">The cache of the texture descriptors</param>
|
||||
public CachedGpuAccessor(GpuContext context, ReadOnlyMemory<byte> data, GuestGpuAccessorHeader header, Dictionary<int, GuestTextureDescriptor> guestTextureDescriptors)
|
||||
public CachedGpuAccessor(
|
||||
GpuContext context,
|
||||
ReadOnlyMemory<byte> data,
|
||||
ReadOnlyMemory<byte> cb1Data,
|
||||
GuestGpuAccessorHeader header,
|
||||
Dictionary<int, GuestTextureDescriptor> guestTextureDescriptors)
|
||||
{
|
||||
_context = context;
|
||||
_data = data;
|
||||
_cb1Data = cb1Data;
|
||||
_header = header;
|
||||
_textureDescriptors = new Dictionary<int, GuestTextureDescriptor>();
|
||||
|
||||
|
@ -34,6 +42,16 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads data from the constant buffer 1.
|
||||
/// </summary>
|
||||
/// <param name="offset">Offset in bytes to read from</param>
|
||||
/// <returns>Value at the given offset</returns>
|
||||
public uint ConstantBuffer1Read(int offset)
|
||||
{
|
||||
return MemoryMarshal.Cast<byte, uint>(_cb1Data.Span.Slice(offset))[0];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prints a log message.
|
||||
/// </summary>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue