Support compute uniform buffers emulated with global memory (#924)
This commit is contained in:
parent
2e6080ccbb
commit
7e4d986a73
5 changed files with 133 additions and 16 deletions
|
@ -8,11 +8,18 @@ namespace Ryujinx.Graphics.Gpu
|
|||
/// <summary>
|
||||
/// Maximum number of compute uniform buffers.
|
||||
/// </summary>
|
||||
public const int TotalCpUniformBuffers = 8;
|
||||
/// <remarks>
|
||||
/// This does not reflect the hardware count, the API will emulate some constant buffers using
|
||||
/// global memory to make up for the low amount of compute constant buffers supported by hardware (only 8).
|
||||
/// </remarks>
|
||||
public const int TotalCpUniformBuffers = 17; // 8 hardware constant buffers + 9 emulated (14 available to the user).
|
||||
|
||||
/// <summary>
|
||||
/// Maximum number of compute storage buffers (this is an API limitation).
|
||||
/// Maximum number of compute storage buffers.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The maximum number of storage buffers is API limited, the hardware supports a unlimited amount.
|
||||
/// </remarks>
|
||||
public const int TotalCpStorageBuffers = 16;
|
||||
|
||||
/// <summary>
|
||||
|
@ -21,8 +28,11 @@ namespace Ryujinx.Graphics.Gpu
|
|||
public const int TotalGpUniformBuffers = 18;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum number of graphics storage buffers (this is an API limitation).
|
||||
/// Maximum number of graphics storage buffers.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The maximum number of storage buffers is API limited, the hardware supports a unlimited amount.
|
||||
/// </remarks>
|
||||
public const int TotalGpStorageBuffers = 16;
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -69,6 +69,34 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
BufferManager.SetComputeUniformBuffer(index, gpuVa, size);
|
||||
}
|
||||
|
||||
for (int index = 0; index < info.CBuffers.Count; index++)
|
||||
{
|
||||
BufferDescriptor cb = info.CBuffers[index];
|
||||
|
||||
// NVN uses the "hardware" constant buffer for anything that is less than 8,
|
||||
// and those are already bound above.
|
||||
// Anything greater than or equal to 8 uses the emulated constant buffers.
|
||||
// They are emulated using global memory loads.
|
||||
if (cb.Slot < 8)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ubEnableMask |= 1u << cb.Slot;
|
||||
|
||||
ulong cbDescAddress = BufferManager.GetComputeUniformBufferAddress(0);
|
||||
|
||||
int cbDescOffset = 0x260 + cb.Slot * 0x10;
|
||||
|
||||
cbDescAddress += (ulong)cbDescOffset;
|
||||
|
||||
ReadOnlySpan<byte> cbDescriptorData = _context.PhysicalMemory.GetSpan(cbDescAddress, 0x10);
|
||||
|
||||
SbDescriptor cbDescriptor = MemoryMarshal.Cast<byte, SbDescriptor>(cbDescriptorData)[0];
|
||||
|
||||
BufferManager.SetComputeUniformBuffer(cb.Slot, cbDescriptor.PackAddress(), (uint)cbDescriptor.Size);
|
||||
}
|
||||
|
||||
for (int index = 0; index < info.SBuffers.Count; index++)
|
||||
{
|
||||
BufferDescriptor sb = info.SBuffers[index];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue