diff options
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs index fd93cd8b..e6557780 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Dma/DmaClass.cs @@ -30,13 +30,13 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma SrcLinear = 1 << 7, DstLinear = 1 << 8, MultiLineEnable = 1 << 9, - RemapEnable = 1 << 10 + RemapEnable = 1 << 10, } /// <summary> /// Texture parameters for copy. /// </summary> - private struct TextureParams + private readonly struct TextureParams { /// <summary> /// Copy region X coordinate. @@ -109,7 +109,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma _3dEngine = threedEngine; _state = new DeviceState<DmaClassState>(new Dictionary<string, RwCallback> { - { nameof(DmaClassState.LaunchDma), new RwCallback(LaunchDma, null) } + { nameof(DmaClassState.LaunchDma), new RwCallback(LaunchDma, null) }, }); } @@ -345,8 +345,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma // all be rewritten to use pooled arrays, but that gets complicated with packed data and strides Span<byte> dstSpan = memoryManager.GetSpan(dstGpuVa + (ulong)dstBaseOffset, dstSize).ToArray(); - TextureParams srcParams = new TextureParams(srcRegionX, srcRegionY, srcBaseOffset, srcBpp, srcLinear, srcCalculator); - TextureParams dstParams = new TextureParams(dstRegionX, dstRegionY, dstBaseOffset, dstBpp, dstLinear, dstCalculator); + TextureParams srcParams = new(srcRegionX, srcRegionY, srcBaseOffset, srcBpp, srcLinear, srcCalculator); + TextureParams dstParams = new(dstRegionX, dstRegionY, dstBaseOffset, dstBpp, dstLinear, dstCalculator); // If remapping is enabled, we always copy the components directly, in order. // If it's enabled, but the mapping is just XYZW, we also copy them in order. @@ -363,13 +363,26 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma switch (srcBpp) { - case 1: Copy<byte>(dstSpan, srcSpan, dstParams, srcParams); break; - case 2: Copy<ushort>(dstSpan, srcSpan, dstParams, srcParams); break; - case 4: Copy<uint>(dstSpan, srcSpan, dstParams, srcParams); break; - case 8: Copy<ulong>(dstSpan, srcSpan, dstParams, srcParams); break; - case 12: Copy<Bpp12Pixel>(dstSpan, srcSpan, dstParams, srcParams); break; - case 16: Copy<Vector128<byte>>(dstSpan, srcSpan, dstParams, srcParams); break; - default: throw new NotSupportedException($"Unable to copy ${srcBpp} bpp pixel format."); + case 1: + Copy<byte>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 2: + Copy<ushort>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 4: + Copy<uint>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 8: + Copy<ulong>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 12: + Copy<Bpp12Pixel>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 16: + Copy<Vector128<byte>>(dstSpan, srcSpan, dstParams, srcParams); + break; + default: + throw new NotSupportedException($"Unable to copy ${srcBpp} bpp pixel format."); } } else @@ -378,11 +391,20 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma switch (componentSize) { - case 1: CopyShuffle<byte>(dstSpan, srcSpan, dstParams, srcParams); break; - case 2: CopyShuffle<ushort>(dstSpan, srcSpan, dstParams, srcParams); break; - case 3: CopyShuffle<UInt24>(dstSpan, srcSpan, dstParams, srcParams); break; - case 4: CopyShuffle<uint>(dstSpan, srcSpan, dstParams, srcParams); break; - default: throw new NotSupportedException($"Unable to copy ${componentSize} component size."); + case 1: + CopyShuffle<byte>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 2: + CopyShuffle<ushort>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 3: + CopyShuffle<UInt24>(dstSpan, srcSpan, dstParams, srcParams); + break; + case 4: + CopyShuffle<uint>(dstSpan, srcSpan, dstParams, srcParams); + break; + default: + throw new NotSupportedException($"Unable to copy ${componentSize} component size."); } } @@ -526,28 +548,28 @@ namespace Ryujinx.Graphics.Gpu.Engine.Dma 0 => _state.State.SetRemapComponentsDstX, 1 => _state.State.SetRemapComponentsDstY, 2 => _state.State.SetRemapComponentsDstZ, - _ => _state.State.SetRemapComponentsDstW + _ => _state.State.SetRemapComponentsDstW, }; switch (componentsDst) { case SetRemapComponentsDst.SrcX: - Copy<T>(dstSpan.Slice(Unsafe.SizeOf<T>() * i), srcSpan, dst, src); + Copy<T>(dstSpan[(Unsafe.SizeOf<T>() * i)..], srcSpan, dst, src); break; case SetRemapComponentsDst.SrcY: - Copy<T>(dstSpan.Slice(Unsafe.SizeOf<T>() * i), srcSpan.Slice(Unsafe.SizeOf<T>()), dst, src); + Copy<T>(dstSpan[(Unsafe.SizeOf<T>() * i)..], srcSpan[Unsafe.SizeOf<T>()..], dst, src); break; case SetRemapComponentsDst.SrcZ: - Copy<T>(dstSpan.Slice(Unsafe.SizeOf<T>() * i), srcSpan.Slice(Unsafe.SizeOf<T>() * 2), dst, src); + Copy<T>(dstSpan[(Unsafe.SizeOf<T>() * i)..], srcSpan[(Unsafe.SizeOf<T>() * 2)..], dst, src); break; case SetRemapComponentsDst.SrcW: - Copy<T>(dstSpan.Slice(Unsafe.SizeOf<T>() * i), srcSpan.Slice(Unsafe.SizeOf<T>() * 3), dst, src); + Copy<T>(dstSpan[(Unsafe.SizeOf<T>() * i)..], srcSpan[(Unsafe.SizeOf<T>() * 3)..], dst, src); break; case SetRemapComponentsDst.ConstA: - Fill<T>(dstSpan.Slice(Unsafe.SizeOf<T>() * i), dst, Unsafe.As<uint, T>(ref _state.State.SetRemapConstA)); + Fill<T>(dstSpan[(Unsafe.SizeOf<T>() * i)..], dst, Unsafe.As<uint, T>(ref _state.State.SetRemapConstA)); break; case SetRemapComponentsDst.ConstB: - Fill<T>(dstSpan.Slice(Unsafe.SizeOf<T>() * i), dst, Unsafe.As<uint, T>(ref _state.State.SetRemapConstB)); + Fill<T>(dstSpan[(Unsafe.SizeOf<T>() * i)..], dst, Unsafe.As<uint, T>(ref _state.State.SetRemapConstB)); break; } } |