mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-08-02 11:27:11 +02:00
Separate GPU engines and make state follow official docs (part 1/2) (#2422)
* Use DeviceState for compute and i2m * Migrate 2D class, more comments * Migrate DMA copy engine * Remove now unused code * Replace GpuState by GpuAccessorState on GpuAcessor, since compute no longer has a GpuState * More comments * Add logging (disabled) * Add back i2m on 3D engine
This commit is contained in:
parent
31cbd09a75
commit
8b44eb1c98
30 changed files with 2599 additions and 460 deletions
|
@ -1,16 +0,0 @@
|
|||
namespace Ryujinx.Graphics.Gpu.State
|
||||
{
|
||||
/// <summary>
|
||||
/// Buffer swizzle component.
|
||||
/// </summary>
|
||||
enum BufferSwizzleComponent
|
||||
{
|
||||
SrcX,
|
||||
SrcY,
|
||||
SrcZ,
|
||||
SrcW,
|
||||
ConstA,
|
||||
ConstB,
|
||||
NoWrite
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
namespace Ryujinx.Graphics.Gpu.State
|
||||
{
|
||||
/// <summary>
|
||||
/// Buffer to buffer copy parameters.
|
||||
/// </summary>
|
||||
struct CopyBufferParams
|
||||
{
|
||||
#pragma warning disable CS0649
|
||||
public GpuVa SrcAddress;
|
||||
public GpuVa DstAddress;
|
||||
public int SrcStride;
|
||||
public int DstStride;
|
||||
public int XCount;
|
||||
public int YCount;
|
||||
#pragma warning restore CS0649
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
namespace Ryujinx.Graphics.Gpu.State
|
||||
{
|
||||
/// <summary>
|
||||
/// Buffer to buffer copy vector swizzle parameters.
|
||||
/// </summary>
|
||||
struct CopyBufferSwizzle
|
||||
{
|
||||
#pragma warning disable CS0649
|
||||
public uint Swizzle;
|
||||
#pragma warning restore CS0649
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the source for the buffer destination vector X component.
|
||||
/// </summary>
|
||||
/// <returns>Destination component</returns>
|
||||
public BufferSwizzleComponent UnpackDstX()
|
||||
{
|
||||
return (BufferSwizzleComponent)(Swizzle & 7);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the source for the buffer destination vector Y component.
|
||||
/// </summary>
|
||||
/// <returns>Destination component</returns>
|
||||
public BufferSwizzleComponent UnpackDstY()
|
||||
{
|
||||
return (BufferSwizzleComponent)((Swizzle >> 4) & 7);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the source for the buffer destination vector Z component.
|
||||
/// </summary>
|
||||
/// <returns>Destination component</returns>
|
||||
public BufferSwizzleComponent UnpackDstZ()
|
||||
{
|
||||
return (BufferSwizzleComponent)((Swizzle >> 8) & 7);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the source for the buffer destination vector W component.
|
||||
/// </summary>
|
||||
/// <returns>Destination component</returns>
|
||||
public BufferSwizzleComponent UnpackDstW()
|
||||
{
|
||||
return (BufferSwizzleComponent)((Swizzle >> 12) & 7);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the size of each vector component of the copy.
|
||||
/// </summary>
|
||||
/// <returns>Vector component size</returns>
|
||||
public int UnpackComponentSize()
|
||||
{
|
||||
return (int)((Swizzle >> 16) & 3) + 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the number of components of the source vector of the copy.
|
||||
/// </summary>
|
||||
/// <returns>Number of vector components</returns>
|
||||
public int UnpackSrcComponentsCount()
|
||||
{
|
||||
return (int)((Swizzle >> 20) & 7) + 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unpacks the number of components of the destination vector of the copy.
|
||||
/// </summary>
|
||||
/// <returns>Number of vector components</returns>
|
||||
public int UnpackDstComponentsCount()
|
||||
{
|
||||
return (int)((Swizzle >> 24) & 7) + 1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
namespace Ryujinx.Graphics.Gpu.State
|
||||
{
|
||||
/// <summary>
|
||||
/// Texture to texture copy control.
|
||||
/// </summary>
|
||||
struct CopyTextureControl
|
||||
{
|
||||
#pragma warning disable CS0649
|
||||
public uint Packed;
|
||||
#pragma warning restore CS0649
|
||||
|
||||
public bool UnpackOriginCorner()
|
||||
{
|
||||
return (Packed & 1u) != 0;
|
||||
}
|
||||
|
||||
public bool UnpackLinearFilter()
|
||||
{
|
||||
return (Packed & (1u << 4)) != 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
using Ryujinx.Graphics.Gpu.Image;
|
||||
using Ryujinx.Graphics.Device;
|
||||
using Ryujinx.Graphics.Gpu.Image;
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
@ -33,6 +34,8 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
|
||||
private readonly Register[] _registers;
|
||||
|
||||
private readonly IDeviceState _deviceState;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the shadow ram control used for this sub-channel.
|
||||
/// </summary>
|
||||
|
@ -47,9 +50,11 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
/// Creates a new instance of the GPU state.
|
||||
/// </summary>
|
||||
/// <param name="channel">Channel that the sub-channel state belongs to</param>
|
||||
public GpuState(GpuChannel channel)
|
||||
/// <param name="deviceState">Optional device state that will replace the internal backing storage</param>
|
||||
public GpuState(GpuChannel channel, IDeviceState deviceState = null)
|
||||
{
|
||||
Channel = channel;
|
||||
_deviceState = deviceState;
|
||||
|
||||
_memory = new int[RegistersCount];
|
||||
_shadow = new int[RegistersCount];
|
||||
|
@ -107,16 +112,23 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
}
|
||||
}
|
||||
|
||||
Register register = _registers[meth.Method];
|
||||
|
||||
if (_memory[meth.Method] != value)
|
||||
if (_deviceState != null)
|
||||
{
|
||||
_registers[(int)register.BaseOffset].Modified = true;
|
||||
_deviceState.Write(meth.Method * 4, meth.Argument);
|
||||
}
|
||||
else
|
||||
{
|
||||
Register register = _registers[meth.Method];
|
||||
|
||||
_memory[meth.Method] = value;
|
||||
if (_memory[meth.Method] != value)
|
||||
{
|
||||
_registers[(int)register.BaseOffset].Modified = true;
|
||||
}
|
||||
|
||||
register.Callback?.Invoke(this, value);
|
||||
_memory[meth.Method] = value;
|
||||
|
||||
register.Callback?.Invoke(this, value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -126,6 +138,11 @@ namespace Ryujinx.Graphics.Gpu.State
|
|||
/// <returns>Data at the register</returns>
|
||||
public int Read(int offset)
|
||||
{
|
||||
if (_deviceState != null)
|
||||
{
|
||||
return _deviceState.Read(offset * 4);
|
||||
}
|
||||
|
||||
return _memory[offset];
|
||||
}
|
||||
|
||||
|
|
20
Ryujinx.Graphics.Gpu/State/SbDescriptor.cs
Normal file
20
Ryujinx.Graphics.Gpu/State/SbDescriptor.cs
Normal file
|
@ -0,0 +1,20 @@
|
|||
namespace Ryujinx.Graphics.Gpu.State
|
||||
{
|
||||
/// <summary>
|
||||
/// Storage buffer address and size information.
|
||||
/// </summary>
|
||||
struct SbDescriptor
|
||||
{
|
||||
#pragma warning disable CS0649
|
||||
public uint AddressLow;
|
||||
public uint AddressHigh;
|
||||
public int Size;
|
||||
public int Padding;
|
||||
#pragma warning restore CS0649
|
||||
|
||||
public ulong PackAddress()
|
||||
{
|
||||
return AddressLow | ((ulong)AddressHigh << 32);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue