mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-01 05:42:02 +00:00
Remove GPU MemoryAccessor (#1423)
* Remove GPU MemoryAccessor * Update outdated XML doc * Update more outdated stuff
This commit is contained in:
parent
80d4199fb3
commit
111534a74e
11 changed files with 34 additions and 114 deletions
|
@ -18,7 +18,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
{
|
{
|
||||||
uint qmdAddress = (uint)state.Get<int>(MethodOffset.DispatchParamsAddress);
|
uint qmdAddress = (uint)state.Get<int>(MethodOffset.DispatchParamsAddress);
|
||||||
|
|
||||||
var qmd = _context.MemoryAccessor.Read<ComputeQmd>((ulong)qmdAddress << 8);
|
var qmd = _context.MemoryManager.Read<ComputeQmd>((ulong)qmdAddress << 8);
|
||||||
|
|
||||||
GpuVa shaderBaseAddress = state.Get<GpuVa>(MethodOffset.ShaderBaseAddress);
|
GpuVa shaderBaseAddress = state.Get<GpuVa>(MethodOffset.ShaderBaseAddress);
|
||||||
|
|
||||||
|
|
|
@ -80,13 +80,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.GPFifo
|
||||||
// TODO: Acquire operations (Wait), interrupts for invalid combinations.
|
// TODO: Acquire operations (Wait), interrupts for invalid combinations.
|
||||||
if (operation == SemaphoredOperation.Release)
|
if (operation == SemaphoredOperation.Release)
|
||||||
{
|
{
|
||||||
_context.MemoryAccessor.Write(address, value);
|
_context.MemoryManager.Write(address, value);
|
||||||
}
|
}
|
||||||
else if (operation == SemaphoredOperation.Reduction)
|
else if (operation == SemaphoredOperation.Reduction)
|
||||||
{
|
{
|
||||||
bool signed = _state.State.SemaphoredFormat == SemaphoredFormat.Signed;
|
bool signed = _state.State.SemaphoredFormat == SemaphoredFormat.Signed;
|
||||||
|
|
||||||
int mem = _context.MemoryAccessor.Read<int>(address);
|
int mem = _context.MemoryManager.Read<int>(address);
|
||||||
|
|
||||||
switch (_state.State.SemaphoredReduction)
|
switch (_state.State.SemaphoredReduction)
|
||||||
{
|
{
|
||||||
|
@ -116,7 +116,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.GPFifo
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_context.MemoryAccessor.Write(address, value);
|
_context.MemoryManager.Write(address, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.GPFifo
|
||||||
{
|
{
|
||||||
if (Words == null)
|
if (Words == null)
|
||||||
{
|
{
|
||||||
Words = MemoryMarshal.Cast<byte, int>(context.MemoryAccessor.GetSpan(EntryAddress, (int)EntryCount * 4)).ToArray();
|
Words = MemoryMarshal.Cast<byte, int>(context.MemoryManager.GetSpan(EntryAddress, (int)EntryCount * 4)).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
evt.Flush();
|
evt.Flush();
|
||||||
return (_context.MemoryAccessor.Read<ulong>(gpuVa) != 0) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False;
|
return (_context.MemoryManager.Read<ulong>(gpuVa) != 0) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,11 +87,11 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
|
|
||||||
if (evt != null && evt2 == null)
|
if (evt != null && evt2 == null)
|
||||||
{
|
{
|
||||||
useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt, _context.MemoryAccessor.Read<ulong>(gpuVa + 16), isEqual);
|
useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt, _context.MemoryManager.Read<ulong>(gpuVa + 16), isEqual);
|
||||||
}
|
}
|
||||||
else if (evt == null && evt2 != null)
|
else if (evt == null && evt2 != null)
|
||||||
{
|
{
|
||||||
useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt2, _context.MemoryAccessor.Read<ulong>(gpuVa), isEqual);
|
useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt2, _context.MemoryManager.Read<ulong>(gpuVa), isEqual);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -107,8 +107,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
evt?.Flush();
|
evt?.Flush();
|
||||||
evt2?.Flush();
|
evt2?.Flush();
|
||||||
|
|
||||||
ulong x = _context.MemoryAccessor.Read<ulong>(gpuVa);
|
ulong x = _context.MemoryManager.Read<ulong>(gpuVa);
|
||||||
ulong y = _context.MemoryAccessor.Read<ulong>(gpuVa + 16);
|
ulong y = _context.MemoryManager.Read<ulong>(gpuVa + 16);
|
||||||
|
|
||||||
return (isEqual ? x == y : x != y) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False;
|
return (isEqual ? x == y : x != y) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
{
|
{
|
||||||
var rs = state.Get<SemaphoreState>(MethodOffset.ReportState);
|
var rs = state.Get<SemaphoreState>(MethodOffset.ReportState);
|
||||||
|
|
||||||
_context.MemoryAccessor.Write(rs.Address.Pack(), rs.Payload);
|
_context.MemoryManager.Write(rs.Address.Pack(), rs.Payload);
|
||||||
|
|
||||||
_context.AdvanceSequence();
|
_context.AdvanceSequence();
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
|
|
||||||
if (counter?.Invalid != true)
|
if (counter?.Invalid != true)
|
||||||
{
|
{
|
||||||
_context.MemoryAccessor.Write(gpuVa, counterData);
|
_context.MemoryManager.Write(gpuVa, counterData);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
{
|
{
|
||||||
var uniformBuffer = state.Get<UniformBufferState>(MethodOffset.UniformBufferState);
|
var uniformBuffer = state.Get<UniformBufferState>(MethodOffset.UniformBufferState);
|
||||||
|
|
||||||
_context.MemoryAccessor.Write(uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset, argument);
|
_context.MemoryManager.Write(uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset, argument);
|
||||||
|
|
||||||
state.SetUniformBufferOffset(uniformBuffer.Offset + 4);
|
state.SetUniformBufferOffset(uniformBuffer.Offset + 4);
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ namespace Ryujinx.Graphics.Gpu.Engine
|
||||||
{
|
{
|
||||||
var uniformBuffer = state.Get<UniformBufferState>(MethodOffset.UniformBufferState);
|
var uniformBuffer = state.Get<UniformBufferState>(MethodOffset.UniformBufferState);
|
||||||
|
|
||||||
_context.MemoryAccessor.Write(uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset, MemoryMarshal.Cast<int, byte>(data));
|
_context.MemoryManager.Write(uniformBuffer.Address.Pack() + (uint)uniformBuffer.Offset, MemoryMarshal.Cast<int, byte>(data));
|
||||||
|
|
||||||
state.SetUniformBufferOffset(uniformBuffer.Offset + data.Length * 4);
|
state.SetUniformBufferOffset(uniformBuffer.Offset + data.Length * 4);
|
||||||
|
|
||||||
|
|
|
@ -27,11 +27,6 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MemoryManager MemoryManager { get; }
|
public MemoryManager MemoryManager { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// GPU memory accessor.
|
|
||||||
/// </summary>
|
|
||||||
public MemoryAccessor MemoryAccessor { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// GPU engine methods processing.
|
/// GPU engine methods processing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -75,8 +70,6 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
|
|
||||||
MemoryManager = new MemoryManager(this);
|
MemoryManager = new MemoryManager(this);
|
||||||
|
|
||||||
MemoryAccessor = new MemoryAccessor(this);
|
|
||||||
|
|
||||||
Methods = new Methods(this);
|
Methods = new Methods(this);
|
||||||
|
|
||||||
GPFifo = new GPFifoDevice(this);
|
GPFifo = new GPFifoDevice(this);
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.Gpu.Memory
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// GPU mapped memory accessor.
|
|
||||||
/// </summary>
|
|
||||||
public class MemoryAccessor
|
|
||||||
{
|
|
||||||
private GpuContext _context;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Creates a new instance of the GPU memory accessor.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context">GPU context that the memory accessor belongs to</param>
|
|
||||||
public MemoryAccessor(GpuContext context)
|
|
||||||
{
|
|
||||||
_context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reads a byte array from GPU mapped memory.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="gpuVa">GPU virtual address where the data is located</param>
|
|
||||||
/// <param name="size">Size of the data in bytes</param>
|
|
||||||
/// <returns>Byte array with the data</returns>
|
|
||||||
public byte[] ReadBytes(ulong gpuVa, int size)
|
|
||||||
{
|
|
||||||
return GetSpan(gpuVa, size).ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a read-only span of data from GPU mapped memory.
|
|
||||||
/// This reads as much data as possible, up to the specified maximum size.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="gpuVa">GPU virtual address where the data is located</param>
|
|
||||||
/// <param name="size">Size of the data</param>
|
|
||||||
/// <returns>The span of the data at the specified memory location</returns>
|
|
||||||
public ReadOnlySpan<byte> GetSpan(ulong gpuVa, int size)
|
|
||||||
{
|
|
||||||
ulong processVa = _context.MemoryManager.Translate(gpuVa);
|
|
||||||
|
|
||||||
return _context.PhysicalMemory.GetSpan(processVa, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reads data from GPU mapped memory.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">Type of the data</typeparam>
|
|
||||||
/// <param name="gpuVa">GPU virtual address where the data is located</param>
|
|
||||||
/// <returns>The data at the specified memory location</returns>
|
|
||||||
public T Read<T>(ulong gpuVa) where T : unmanaged
|
|
||||||
{
|
|
||||||
ulong processVa = _context.MemoryManager.Translate(gpuVa);
|
|
||||||
|
|
||||||
return MemoryMarshal.Cast<byte, T>(_context.PhysicalMemory.GetSpan(processVa, Unsafe.SizeOf<T>()))[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Writes a 32-bits signed integer to GPU mapped memory.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="gpuVa">GPU virtual address to write the value into</param>
|
|
||||||
/// <param name="value">The value to be written</param>
|
|
||||||
public void Write<T>(ulong gpuVa, T value) where T : unmanaged
|
|
||||||
{
|
|
||||||
ulong processVa = _context.MemoryManager.Translate(gpuVa);
|
|
||||||
|
|
||||||
_context.PhysicalMemory.Write(processVa, MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Writes data to GPU mapped memory.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="gpuVa">GPU virtual address to write the data into</param>
|
|
||||||
/// <param name="data">The data to be written</param>
|
|
||||||
public void Write(ulong gpuVa, ReadOnlySpan<byte> data)
|
|
||||||
{
|
|
||||||
ulong processVa = _context.MemoryManager.Translate(gpuVa);
|
|
||||||
|
|
||||||
_context.PhysicalMemory.Write(processVa, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -62,7 +62,6 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a read-only span of data from GPU mapped memory.
|
/// Gets a read-only span of data from GPU mapped memory.
|
||||||
/// This reads as much data as possible, up to the specified maximum size.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="gpuVa">GPU virtual address where the data is located</param>
|
/// <param name="gpuVa">GPU virtual address where the data is located</param>
|
||||||
/// <param name="size">Size of the data</param>
|
/// <param name="size">Size of the data</param>
|
||||||
|
@ -87,6 +86,19 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
||||||
return _context.PhysicalMemory.GetWritableRegion(processVa, size);
|
return _context.PhysicalMemory.GetWritableRegion(processVa, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Writes data to GPU mapped memory.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Type of the data</typeparam>
|
||||||
|
/// <param name="gpuVa">GPU virtual address to write the value into</param>
|
||||||
|
/// <param name="value">The value to be written</param>
|
||||||
|
public void Write<T>(ulong gpuVa, T value) where T : unmanaged
|
||||||
|
{
|
||||||
|
ulong processVa = Translate(gpuVa);
|
||||||
|
|
||||||
|
_context.PhysicalMemory.Write(processVa, MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref value, 1)));
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Writes data to GPU mapped memory.
|
/// Writes data to GPU mapped memory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -81,7 +81,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||||
/// <returns>Data at the memory location</returns>
|
/// <returns>Data at the memory location</returns>
|
||||||
public T MemoryRead<T>(ulong address) where T : unmanaged
|
public T MemoryRead<T>(ulong address) where T : unmanaged
|
||||||
{
|
{
|
||||||
return _context.MemoryAccessor.Read<T>(address);
|
return _context.MemoryManager.Read<T>(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -262,13 +262,13 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadOnlySpan<byte> memoryCode = _context.MemoryAccessor.GetSpan(gpuVa, shader.Code.Length);
|
ReadOnlySpan<byte> memoryCode = _context.MemoryManager.GetSpan(gpuVa, shader.Code.Length);
|
||||||
|
|
||||||
bool equals = memoryCode.SequenceEqual(shader.Code);
|
bool equals = memoryCode.SequenceEqual(shader.Code);
|
||||||
|
|
||||||
if (equals && shader.Code2 != null)
|
if (equals && shader.Code2 != null)
|
||||||
{
|
{
|
||||||
memoryCode = _context.MemoryAccessor.GetSpan(gpuVaA, shader.Code2.Length);
|
memoryCode = _context.MemoryManager.GetSpan(gpuVaA, shader.Code2.Length);
|
||||||
|
|
||||||
equals = memoryCode.SequenceEqual(shader.Code2);
|
equals = memoryCode.SequenceEqual(shader.Code2);
|
||||||
}
|
}
|
||||||
|
@ -307,7 +307,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||||
|
|
||||||
program = Translator.Translate(gpuVa, gpuAccessor, DefaultFlags | TranslationFlags.Compute);
|
program = Translator.Translate(gpuVa, gpuAccessor, DefaultFlags | TranslationFlags.Compute);
|
||||||
|
|
||||||
byte[] code = _context.MemoryAccessor.ReadBytes(gpuVa, program.Size);
|
byte[] code = _context.MemoryManager.GetSpan(gpuVa, program.Size).ToArray();
|
||||||
|
|
||||||
_dumper.Dump(code, compute: true, out string fullPath, out string codePath);
|
_dumper.Dump(code, compute: true, out string fullPath, out string codePath);
|
||||||
|
|
||||||
|
@ -344,8 +344,8 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||||
{
|
{
|
||||||
ShaderProgram program = Translator.Translate(gpuVaA, gpuVa, gpuAccessor, DefaultFlags);
|
ShaderProgram program = Translator.Translate(gpuVaA, gpuVa, gpuAccessor, DefaultFlags);
|
||||||
|
|
||||||
byte[] codeA = _context.MemoryAccessor.ReadBytes(gpuVaA, program.SizeA);
|
byte[] codeA = _context.MemoryManager.GetSpan(gpuVaA, program.SizeA).ToArray();
|
||||||
byte[] codeB = _context.MemoryAccessor.ReadBytes(gpuVa, program.Size);
|
byte[] codeB = _context.MemoryManager.GetSpan(gpuVa, program.Size).ToArray();
|
||||||
|
|
||||||
_dumper.Dump(codeA, compute: false, out string fullPathA, out string codePathA);
|
_dumper.Dump(codeA, compute: false, out string fullPathA, out string codePathA);
|
||||||
_dumper.Dump(codeB, compute: false, out string fullPathB, out string codePathB);
|
_dumper.Dump(codeB, compute: false, out string fullPathB, out string codePathB);
|
||||||
|
@ -364,7 +364,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
||||||
{
|
{
|
||||||
ShaderProgram program = Translator.Translate(gpuVa, gpuAccessor, DefaultFlags);
|
ShaderProgram program = Translator.Translate(gpuVa, gpuAccessor, DefaultFlags);
|
||||||
|
|
||||||
byte[] code = _context.MemoryAccessor.ReadBytes(gpuVa, program.Size);
|
byte[] code = _context.MemoryManager.GetSpan(gpuVa, program.Size).ToArray();
|
||||||
|
|
||||||
_dumper.Dump(code, compute: false, out string fullPath, out string codePath);
|
_dumper.Dump(code, compute: false, out string fullPath, out string codePath);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue