Initial support for separate GPU address spaces (#2394)
* Make GPU memory manager a member of GPU channel * Move physical memory instance to the memory manager, and the caches to the physical memory * PR feedback
This commit is contained in:
parent
8cc872fb60
commit
fbb4019ed5
44 changed files with 780 additions and 481 deletions
|
@ -40,10 +40,10 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
_buffer = new int[count];
|
||||
}
|
||||
|
||||
ulong dstBaseAddress = _context.MemoryManager.Translate(_params.DstAddress.Pack());
|
||||
ulong dstBaseAddress = state.Channel.MemoryManager.Translate(_params.DstAddress.Pack());
|
||||
|
||||
// Trigger read tracking, to flush any managed resources in the destination region.
|
||||
_context.PhysicalMemory.GetSpan(dstBaseAddress, _size, true);
|
||||
state.Channel.MemoryManager.Physical.GetSpan(dstBaseAddress, _size, true);
|
||||
|
||||
_finished = false;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
|
||||
if (_offset * 4 >= _size)
|
||||
{
|
||||
FinishTransfer();
|
||||
FinishTransfer(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,15 +69,16 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
/// <summary>
|
||||
/// Performs actual copy of the inline data after the transfer is finished.
|
||||
/// </summary>
|
||||
private void FinishTransfer()
|
||||
/// <param name="state">Current GPU state</param>
|
||||
private void FinishTransfer(GpuState state)
|
||||
{
|
||||
Span<byte> data = MemoryMarshal.Cast<int, byte>(_buffer).Slice(0, _size);
|
||||
|
||||
if (_isLinear && _params.LineCount == 1)
|
||||
{
|
||||
ulong address = _context.MemoryManager.Translate(_params.DstAddress.Pack());
|
||||
ulong address = state.Channel.MemoryManager.Translate(_params.DstAddress.Pack());
|
||||
|
||||
_context.PhysicalMemory.Write(address, data);
|
||||
state.Channel.MemoryManager.Physical.Write(address, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -91,7 +92,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
|
||||
int srcOffset = 0;
|
||||
|
||||
ulong dstBaseAddress = _context.MemoryManager.Translate(_params.DstAddress.Pack());
|
||||
ulong dstBaseAddress = state.Channel.MemoryManager.Translate(_params.DstAddress.Pack());
|
||||
|
||||
for (int y = _params.DstY; y < _params.DstY + _params.LineCount; y++)
|
||||
{
|
||||
|
@ -109,7 +110,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
|
||||
Span<byte> pixel = data.Slice(srcOffset, 16);
|
||||
|
||||
_context.PhysicalMemory.Write(dstAddress, pixel);
|
||||
state.Channel.MemoryManager.Physical.Write(dstAddress, pixel);
|
||||
}
|
||||
|
||||
for (; x < x2; x++, srcOffset++)
|
||||
|
@ -120,7 +121,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
|||
|
||||
Span<byte> pixel = data.Slice(srcOffset, 1);
|
||||
|
||||
_context.PhysicalMemory.Write(dstAddress, pixel);
|
||||
state.Channel.MemoryManager.Physical.Write(dstAddress, pixel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue