Compare commits

...

7 Commits

Author SHA1 Message Date
Milihraim
3f59bade94 Update Russian Translation (#695) 2025-02-20 14:32:35 -06:00
Evan Husted
c2ed0fd5fd UI: --install-firmware startup flag.
Has the normal UI flow, this is just for systems where the file picker doesn't show up.
2025-02-19 23:07:50 -06:00
Evan Husted
de16d8fa3e UI: Remove the ability to select Swedish & Norwegian for System language
Switch doesn't natively support these languages, they should only be UI language.
2025-02-19 18:24:24 -06:00
Evan Husted
9b1fb3a27b misc: chore: missed a collection expression usage in avalonia project 2025-02-18 21:35:30 -06:00
Evan Husted
b9150a0092 misc: chore: use target-typed new in collection initializers where type is evident 2025-02-18 21:35:11 -06:00
Evan Husted
c1002d4826 misc: chore: collection expressions & target typed new in ARMeilleure & Ryujinx.Cpu 2025-02-18 21:34:09 -06:00
Evan Husted
b1de7696ee misc: chore: VP9 project cleanup
Target-typed new, remove var usage, use collection expressions, rename many fields & properties to match C# standard
2025-02-18 21:33:07 -06:00
44 changed files with 2406 additions and 2535 deletions

View File

@@ -42,7 +42,7 @@
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" /> <PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" />
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" /> <PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" /> <PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
<PackageVersion Include="Gommon" Version="2.7.1" /> <PackageVersion Include="Gommon" Version="2.7.1.1" />
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" /> <PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
<PackageVersion Include="Sep" Version="0.6.0" /> <PackageVersion Include="Sep" Version="0.6.0" />
<PackageVersion Include="shaderc.net" Version="0.1.0" /> <PackageVersion Include="shaderc.net" Version="0.1.0" />

View File

@@ -31,7 +31,7 @@ namespace ARMeilleure.Translation.Cache
private static readonly Lock _lock = new(); private static readonly Lock _lock = new();
private static bool _initialized; private static bool _initialized;
private static readonly List<ReservedRegion> _jitRegions = new(); private static readonly List<ReservedRegion> _jitRegions = [];
private static int _activeRegionIndex = 0; private static int _activeRegionIndex = 0;
[SupportedOSPlatform("windows")] [SupportedOSPlatform("windows")]
@@ -180,7 +180,7 @@ namespace ARMeilleure.Translation.Cache
} }
int exhaustedRegion = _activeRegionIndex; int exhaustedRegion = _activeRegionIndex;
var newRegion = new ReservedRegion(_jitRegions[0].Allocator, CacheSize); ReservedRegion newRegion = new(_jitRegions[0].Allocator, CacheSize);
_jitRegions.Add(newRegion); _jitRegions.Add(newRegion);
_activeRegionIndex = _jitRegions.Count - 1; _activeRegionIndex = _jitRegions.Count - 1;

View File

@@ -27,7 +27,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache
private static readonly Lock _lock = new(); private static readonly Lock _lock = new();
private static bool _initialized; private static bool _initialized;
private static readonly List<ReservedRegion> _jitRegions = new(); private static readonly List<ReservedRegion> _jitRegions = [];
private static int _activeRegionIndex = 0; private static int _activeRegionIndex = 0;
[SupportedOSPlatform("windows")] [SupportedOSPlatform("windows")]

View File

@@ -913,7 +913,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
Span<Rectangle<int>> scissors = Span<Rectangle<int>> scissors =
[ [
new Rectangle<int>(scissorX, scissorY, scissorW, scissorH) new(scissorX, scissorY, scissorW, scissorH)
]; ];
_context.Renderer.Pipeline.SetScissors(scissors); _context.Renderer.Pipeline.SetScissors(scissors);

View File

@@ -729,7 +729,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
ShaderProgram program = translatorContext.Translate(); ShaderProgram program = translatorContext.Translate();
CachedShaderStage[] shaders = [new CachedShaderStage(program.Info, shader.Code, shader.Cb1Data)]; CachedShaderStage[] shaders = [new(program.Info, shader.Code, shader.Cb1Data)];
_compilationQueue.Enqueue(new ProgramCompilation([program], shaders, newSpecState, programIndex, isCompute: true)); _compilationQueue.Enqueue(new ProgramCompilation([program], shaders, newSpecState, programIndex, isCompute: true));
} }

View File

@@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Common
} }
} }
ArrayPtr<T> allocation = new ArrayPtr<T>(ptr, length); ArrayPtr<T> allocation = new(ptr, length);
allocation.AsSpan().Fill(default); allocation.AsSpan().Fill(default);

View File

@@ -14,8 +14,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return (v & 1) != 0 ? m - ((v + 1) >> 1) : m + (v >> 1); return (v & 1) != 0 ? m - ((v + 1) >> 1) : m + (v >> 1);
} }
private static readonly byte[] InvMapTable = private static readonly byte[] _invMapTable =
{ [
7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, 189, 202, 215, 228, 241, 254, 1, 2, 3, 4, 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, 189, 202, 215, 228, 241, 254, 1, 2, 3, 4,
5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34,
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62,
@@ -28,13 +28,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
206, 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 206, 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250,
251, 252, 253, 253 251, 252, 253, 253
}; ];
public static int InvRemapProb(int v, int m) public static int InvRemapProb(int v, int m)
{ {
Debug.Assert(v < InvMapTable.Length / sizeof(byte)); Debug.Assert(v < _invMapTable.Length / sizeof(byte));
v = InvMapTable[v]; v = _invMapTable[v];
m--; m--;
if (m << 1 <= Prob.MaxProb) if (m << 1 <= Prob.MaxProb)
{ {

View File

@@ -111,23 +111,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst); Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst);
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.HighbdIwht4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIwht4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4x4: case TxSize.Tx4X4:
Idct.HighbdIdct4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx8x8: case TxSize.Tx8X8:
Idct.HighbdIdct8x8Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct8X8Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx16x16: case TxSize.Tx16X16:
Idct.HighbdIdct16x16Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct16X16Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx32x32: case TxSize.Tx32X32:
Idct.HighbdIdct32x32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct32X32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -139,23 +139,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.Iwht4x4Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Iwht4X4Add(dqcoeff.AsSpan(), dst, stride, eob);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4x4: case TxSize.Tx4X4:
Idct.Idct4x4Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct4X4Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx8x8: case TxSize.Tx8X8:
Idct.Idct8x8Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct8X8Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx16x16: case TxSize.Tx16X16:
Idct.Idct16x16Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct16X16Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx32x32: case TxSize.Tx32X32:
Idct.Idct32x32Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct32X32Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -170,11 +170,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
else else
{ {
if (txSize <= TxSize.Tx16x16 && eob <= 10) if (txSize <= TxSize.Tx16X16 && eob <= 10)
{ {
dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear(); dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear();
} }
else if (txSize == TxSize.Tx32x32 && eob <= 34) else if (txSize == TxSize.Tx32X32 && eob <= 34)
{ {
dqcoeff.AsSpan().Slice(0, 256).Clear(); dqcoeff.AsSpan().Slice(0, 256).Clear();
} }
@@ -202,23 +202,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst); Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst);
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.HighbdIwht4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIwht4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4x4: case TxSize.Tx4X4:
Idct.HighbdIht4x4Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIht4X4Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx8x8: case TxSize.Tx8X8:
Idct.HighbdIht8x8Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIht8X8Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx16x16: case TxSize.Tx16X16:
Idct.HighbdIht16x16Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIht16X16Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx32x32: case TxSize.Tx32X32:
Idct.HighbdIdct32x32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct32X32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -230,23 +230,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.Iwht4x4Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Iwht4X4Add(dqcoeff.AsSpan(), dst, stride, eob);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4x4: case TxSize.Tx4X4:
Idct.Iht4x4Add(txType, dqcoeff.AsSpan(), dst, stride, eob); Idct.Iht4X4Add(txType, dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx8x8: case TxSize.Tx8X8:
Idct.Iht8x8Add(txType, dqcoeff.AsSpan(), dst, stride, eob); Idct.Iht8X8Add(txType, dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx16x16: case TxSize.Tx16X16:
Idct.Iht16x16Add(txType, dqcoeff.AsSpan(), dst, stride, eob); Idct.Iht16X16Add(txType, dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx32x32: case TxSize.Tx32X32:
Idct.Idct32x32Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct32X32Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -261,11 +261,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
else else
{ {
if (txType == TxType.DctDct && txSize <= TxSize.Tx16x16 && eob <= 10) if (txType == TxType.DctDct && txSize <= TxSize.Tx16X16 && eob <= 10)
{ {
dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear(); dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear();
} }
else if (txSize == TxSize.Tx32x32 && eob <= 34) else if (txSize == TxSize.Tx32X32 && eob <= 34)
{ {
dqcoeff.AsSpan().Slice(0, 256).Clear(); dqcoeff.AsSpan().Slice(0, 256).Clear();
} }
@@ -291,7 +291,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
byte* dst = &pd.Dst.Buf.ToPointer()[dstOffset]; byte* dst = &pd.Dst.Buf.ToPointer()[dstOffset];
Span<byte> dstSpan = pd.Dst.Buf.AsSpan().Slice(dstOffset); Span<byte> dstSpan = pd.Dst.Buf.AsSpan().Slice(dstOffset);
if (mi.SbType < BlockSize.Block8x8) if (mi.SbType < BlockSize.Block8X8)
{ {
if (plane == 0) if (plane == 0)
{ {
@@ -769,21 +769,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
isScaled ? new Ptr<ScaleFactors>(ref sf) : Ptr<ScaleFactors>.Null); isScaled ? new Ptr<ScaleFactors>(ref sf) : Ptr<ScaleFactors>.Null);
xd.BlockRefs[refr] = new Ptr<RefBuffer>(ref refBuf); xd.BlockRefs[refr] = new Ptr<RefBuffer>(ref refBuf);
if (sbType < BlockSize.Block8x8) if (sbType < BlockSize.Block8X8)
{ {
for (plane = 0; plane < Constants.MaxMbPlane; ++plane) for (plane = 0; plane < Constants.MaxMbPlane; ++plane)
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
ref Buf2D dstBuf = ref pd.Dst; ref Buf2D dstBuf = ref pd.Dst;
int num4x4W = pd.N4W; int num4X4W = pd.N4W;
int num4x4H = pd.N4H; int num4X4H = pd.N4H;
int n4Wx4 = 4 * num4x4W; int n4Wx4 = 4 * num4X4W;
int n4Hx4 = 4 * num4x4H; int n4Hx4 = 4 * num4X4H;
ref Buf2D preBuf = ref pd.Pre[refr]; ref Buf2D preBuf = ref pd.Pre[refr];
int i = 0; int i = 0;
for (int y = 0; y < num4x4H; ++y) for (int y = 0; y < num4X4H; ++y)
{ {
for (int x = 0; x < num4x4W; ++x) for (int x = 0; x < num4X4W; ++x)
{ {
Mv mv = ReconInter.AverageSplitMvs(ref pd, ref mi, refr, i++); Mv mv = ReconInter.AverageSplitMvs(ref pd, ref mi, refr, i++);
DecBuildInterPredictors( DecBuildInterPredictors(
@@ -816,10 +816,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
ref Buf2D dstBuf = ref pd.Dst; ref Buf2D dstBuf = ref pd.Dst;
int num4x4W = pd.N4W; int num4X4W = pd.N4W;
int num4x4H = pd.N4H; int num4X4H = pd.N4H;
int n4Wx4 = 4 * num4x4W; int n4Wx4 = 4 * num4X4W;
int n4Hx4 = 4 * num4x4H; int n4Hx4 = 4 * num4X4H;
ref Buf2D preBuf = ref pd.Pre[refr]; ref Buf2D preBuf = ref pd.Pre[refr];
DecBuildInterPredictors( DecBuildInterPredictors(
ref xd, ref xd,
@@ -905,7 +905,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int bwl, int bwl,
int bhl) int bhl)
{ {
bool less8x8 = bsize < BlockSize.Block8x8; bool less8X8 = bsize < BlockSize.Block8X8;
int bw = 1 << (bwl - 1); int bw = 1 << (bwl - 1);
int bh = 1 << (bhl - 1); int bh = 1 << (bhl - 1);
int xMis = Math.Min(bw, cm.MiCols - miCol); int xMis = Math.Min(bw, cm.MiCols - miCol);
@@ -915,7 +915,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref ModeInfo mi = ref SetOffsets(ref cm, ref xd, bsize, miRow, miCol, bw, bh, xMis, yMis, bwl, bhl); ref ModeInfo mi = ref SetOffsets(ref cm, ref xd, bsize, miRow, miCol, bw, bh, xMis, yMis, bwl, bhl);
if (bsize >= BlockSize.Block8x8 && (cm.SubsamplingX != 0 || cm.SubsamplingY != 0)) if (bsize >= BlockSize.Block8X8 && (cm.SubsamplingX != 0 || cm.SubsamplingY != 0))
{ {
BlockSize uvSubsize = Luts.SsSizeLookup[(int)bsize][cm.SubsamplingX][cm.SubsamplingY]; BlockSize uvSubsize = Luts.SsSizeLookup[(int)bsize][cm.SubsamplingX][cm.SubsamplingY];
if (uvSubsize == BlockSize.BlockInvalid) if (uvSubsize == BlockSize.BlockInvalid)
@@ -938,14 +938,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize; TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize;
int num4x4W = pd.N4W; int num4X4W = pd.N4W;
int num4x4H = pd.N4H; int num4X4H = pd.N4H;
int step = 1 << (int)txSize; int step = 1 << (int)txSize;
int row, col; int row, col;
int maxBlocksWide = int maxBlocksWide =
num4x4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); num4X4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX));
int maxBlocksHigh = int maxBlocksHigh =
num4x4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); num4X4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY));
xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide); xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide);
xd.MaxBlocksHigh = (uint)(xd.MbToBottomEdge >= 0 ? 0 : maxBlocksHigh); xd.MaxBlocksHigh = (uint)(xd.MbToBottomEdge >= 0 ? 0 : maxBlocksHigh);
@@ -974,13 +974,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize; TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize;
int num4x4W = pd.N4W; int num4X4W = pd.N4W;
int num4x4H = pd.N4H; int num4X4H = pd.N4H;
int step = 1 << (int)txSize; int step = 1 << (int)txSize;
int row, col; int row, col;
int maxBlocksWide = int maxBlocksWide =
num4x4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); num4X4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX));
int maxBlocksHigh = num4x4H + int maxBlocksHigh = num4X4H +
(xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY));
xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide); xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide);
@@ -995,7 +995,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
if (!less8x8 && eobtotal == 0) if (!less8X8 && eobtotal == 0)
{ {
mi.Skip = 1; // Skip loopfilter mi.Skip = 1; // Skip loopfilter
} }
@@ -1072,11 +1072,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int miRow, int miRow,
int miCol, int miCol,
BlockSize bsize, BlockSize bsize,
int n4x4L2) int n4X4L2)
{ {
int n8x8L2 = n4x4L2 - 1; int n8X8L2 = n4X4L2 - 1;
int num8x8Wh = 1 << n8x8L2; int num8X8Wh = 1 << n8X8L2;
int hbs = num8x8Wh >> 1; int hbs = num8X8Wh >> 1;
PartitionType partition; PartitionType partition;
BlockSize subsize; BlockSize subsize;
bool hasRows = miRow + hbs < cm.MiRows; bool hasRows = miRow + hbs < cm.MiRows;
@@ -1088,7 +1088,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return; return;
} }
partition = ReadPartition(ref twd, miRow, miCol, hasRows ? 1 : 0, hasCols ? 1 : 0, n8x8L2); partition = ReadPartition(ref twd, miRow, miCol, hasRows ? 1 : 0, hasCols ? 1 : 0, n8X8L2);
subsize = Luts.SubsizeLookup[(int)partition][(int)bsize]; subsize = Luts.SubsizeLookup[(int)partition][(int)bsize];
if (hbs == 0) if (hbs == 0)
{ {
@@ -1102,29 +1102,29 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (partition) switch (partition)
{ {
case PartitionType.PartitionNone: case PartitionType.PartitionNone:
DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4x4L2, n4x4L2); DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4X4L2, n4X4L2);
break; break;
case PartitionType.PartitionHorz: case PartitionType.PartitionHorz:
DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4x4L2, n8x8L2); DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4X4L2, n8X8L2);
if (hasRows) if (hasRows)
{ {
DecodeBlock(ref twd, ref cm, miRow + hbs, miCol, subsize, n4x4L2, n8x8L2); DecodeBlock(ref twd, ref cm, miRow + hbs, miCol, subsize, n4X4L2, n8X8L2);
} }
break; break;
case PartitionType.PartitionVert: case PartitionType.PartitionVert:
DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n8x8L2, n4x4L2); DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n8X8L2, n4X4L2);
if (hasCols) if (hasCols)
{ {
DecodeBlock(ref twd, ref cm, miRow, miCol + hbs, subsize, n8x8L2, n4x4L2); DecodeBlock(ref twd, ref cm, miRow, miCol + hbs, subsize, n8X8L2, n4X4L2);
} }
break; break;
case PartitionType.PartitionSplit: case PartitionType.PartitionSplit:
DecodePartition(ref twd, ref cm, miRow, miCol, subsize, n8x8L2); DecodePartition(ref twd, ref cm, miRow, miCol, subsize, n8X8L2);
DecodePartition(ref twd, ref cm, miRow, miCol + hbs, subsize, n8x8L2); DecodePartition(ref twd, ref cm, miRow, miCol + hbs, subsize, n8X8L2);
DecodePartition(ref twd, ref cm, miRow + hbs, miCol, subsize, n8x8L2); DecodePartition(ref twd, ref cm, miRow + hbs, miCol, subsize, n8X8L2);
DecodePartition(ref twd, ref cm, miRow + hbs, miCol + hbs, subsize, n8x8L2); DecodePartition(ref twd, ref cm, miRow + hbs, miCol + hbs, subsize, n8X8L2);
break; break;
default: default:
Debug.Assert(false, "Invalid partition type"); Debug.Assert(false, "Invalid partition type");
@@ -1133,10 +1133,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Update partition context // Update partition context
if (bsize >= BlockSize.Block8x8 && if (bsize >= BlockSize.Block8X8 &&
(bsize == BlockSize.Block8x8 || partition != PartitionType.PartitionSplit)) (bsize == BlockSize.Block8X8 || partition != PartitionType.PartitionSplit))
{ {
DecUpdatePartitionContext(ref twd, miRow, miCol, subsize, num8x8Wh); DecUpdatePartitionContext(ref twd, miRow, miCol, subsize, num8X8Wh);
} }
} }
@@ -1186,7 +1186,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
private static void ReadCoefProbs(ref Vp9EntropyProbs fc, TxMode txMode, ref Reader r) private static void ReadCoefProbs(ref Vp9EntropyProbs fc, TxMode txMode, ref Reader r)
{ {
int maxTxSize = (int)Luts.TxModeToBiggestTxSize[(int)txMode]; int maxTxSize = (int)Luts.TxModeToBiggestTxSize[(int)txMode];
for (int txSize = (int)TxSize.Tx4x4; txSize <= maxTxSize; ++txSize) for (int txSize = (int)TxSize.Tx4X4; txSize <= maxTxSize; ++txSize)
{ {
ReadCoefProbsCommon(ref fc.CoefProbs[txSize], ref r, txSize); ReadCoefProbsCommon(ref fc.CoefProbs[txSize], ref r, txSize);
} }
@@ -1238,16 +1238,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
xd.Bd = (int)cm.BitDepth; xd.Bd = (int)cm.BitDepth;
} }
private static readonly byte[] LiteralToFilter = private static readonly byte[] _literalToFilter =
{ [
Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear
}; ];
private static byte ReadInterpFilter(ref ReadBitBuffer rb) private static byte ReadInterpFilter(ref ReadBitBuffer rb)
{ {
return rb.ReadBit() != 0 return rb.ReadBit() != 0
? (byte)Constants.Switchable ? (byte)Constants.Switchable
: LiteralToFilter[rb.ReadLiteral(2)]; : _literalToFilter[rb.ReadLiteral(2)];
} }
private static void SetupRenderSize(ref Vp9Common cm, ref ReadBitBuffer rb) private static void SetupRenderSize(ref Vp9Common cm, ref ReadBitBuffer rb)
@@ -1519,7 +1519,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tileData.Xd.LeftSegContext = new Array8<sbyte>(); tileData.Xd.LeftSegContext = new Array8<sbyte>();
for (miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize) for (miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize)
{ {
DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64x64, 4); DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64X64, 4);
} }
cm.Mb.Corrupted |= tileData.Xd.Corrupted; cm.Mb.Corrupted |= tileData.Xd.Corrupted;
@@ -1563,7 +1563,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tileData.Xd.LeftSegContext = new Array8<sbyte>(); tileData.Xd.LeftSegContext = new Array8<sbyte>();
for (int miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize) for (int miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize)
{ {
DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64x64, 4); DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64X64, 4);
} }
} }
@@ -1990,7 +1990,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
cm.Error.InternalError(CodecErr.MemError, "Failed to allocate bool decoder 0"); cm.Error.InternalError(CodecErr.MemError, "Failed to allocate bool decoder 0");
} }
cm.TxMode = xd.Lossless ? TxMode.Only4x4 : r.ReadTxMode(); cm.TxMode = xd.Lossless ? TxMode.Only4X4 : r.ReadTxMode();
if (cm.TxMode == TxMode.TxModeSelect) if (cm.TxMode == TxMode.TxModeSelect)
{ {
ReadTxModeProbs(ref fc, ref r); ReadTxModeProbs(ref fc, ref r);

View File

@@ -59,9 +59,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
switch (maxTxSize) switch (maxTxSize)
{ {
case TxSize.Tx8x8: return fc.Tx8x8Prob[ctx].AsSpan(); case TxSize.Tx8X8: return fc.Tx8x8Prob[ctx].AsSpan();
case TxSize.Tx16x16: return fc.Tx16x16Prob[ctx].AsSpan(); case TxSize.Tx16X16: return fc.Tx16x16Prob[ctx].AsSpan();
case TxSize.Tx32x32: return fc.Tx32x32Prob[ctx].AsSpan(); case TxSize.Tx32X32: return fc.Tx32x32Prob[ctx].AsSpan();
default: default:
Debug.Assert(false, "Invalid maxTxSize."); Debug.Assert(false, "Invalid maxTxSize.");
return ReadOnlySpan<byte>.Empty; return ReadOnlySpan<byte>.Empty;
@@ -72,9 +72,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
switch (maxTxSize) switch (maxTxSize)
{ {
case TxSize.Tx8x8: return counts.Tx8x8[ctx].AsSpan(); case TxSize.Tx8X8: return counts.Tx8x8[ctx].AsSpan();
case TxSize.Tx16x16: return counts.Tx16x16[ctx].AsSpan(); case TxSize.Tx16X16: return counts.Tx16x16[ctx].AsSpan();
case TxSize.Tx32x32: return counts.Tx32x32[ctx].AsSpan(); case TxSize.Tx32X32: return counts.Tx32x32[ctx].AsSpan();
default: default:
Debug.Assert(false, "Invalid maxTxSize."); Debug.Assert(false, "Invalid maxTxSize.");
return Span<uint>.Empty; return Span<uint>.Empty;
@@ -86,10 +86,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int ctx = xd.GetTxSizeContext(); int ctx = xd.GetTxSizeContext();
ReadOnlySpan<byte> txProbs = GetTxProbs(ref cm.Fc.Value, maxTxSize, ctx); ReadOnlySpan<byte> txProbs = GetTxProbs(ref cm.Fc.Value, maxTxSize, ctx);
TxSize txSize = (TxSize)r.Read(txProbs[0]); TxSize txSize = (TxSize)r.Read(txProbs[0]);
if (txSize != TxSize.Tx4x4 && maxTxSize >= TxSize.Tx16x16) if (txSize != TxSize.Tx4X4 && maxTxSize >= TxSize.Tx16X16)
{ {
txSize += r.Read(txProbs[1]); txSize += r.Read(txProbs[1]);
if (txSize != TxSize.Tx8x8 && maxTxSize >= TxSize.Tx32x32) if (txSize != TxSize.Tx8X8 && maxTxSize >= TxSize.Tx32X32)
{ {
txSize += r.Read(txProbs[2]); txSize += r.Read(txProbs[2]);
} }
@@ -108,7 +108,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
TxMode txMode = cm.TxMode; TxMode txMode = cm.TxMode;
BlockSize bsize = xd.Mi[0].Value.SbType; BlockSize bsize = xd.Mi[0].Value.SbType;
TxSize maxTxSize = Luts.MaxTxSizeLookup[(int)bsize]; TxSize maxTxSize = Luts.MaxTxSizeLookup[(int)bsize];
if (allowSelect && txMode == TxMode.TxModeSelect && bsize >= BlockSize.Block8x8) if (allowSelect && txMode == TxMode.TxModeSelect && bsize >= BlockSize.Block8X8)
{ {
return ReadSelectedTxSize(ref cm, ref xd, maxTxSize, ref r); return ReadSelectedTxSize(ref cm, ref xd, maxTxSize, ref r);
} }
@@ -276,7 +276,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Fractional part // Fractional part
fr = r.ReadTree(Luts.MvFPTree, class0 ? fc.Class0Fp[mvcomp][d].AsSpan() : fc.Fp[mvcomp].AsSpan()); fr = r.ReadTree(Luts.MvFpTree, class0 ? fc.Class0Fp[mvcomp][d].AsSpan() : fc.Fp[mvcomp].AsSpan());
// High precision part (if hp is not used, the default value of the hp is 1) // High precision part (if hp is not used, the default value of the hp is 1)
hp = usehp ? r.Read(class0 ? fc.Class0Hp[mvcomp] : fc.Hp[mvcomp]) : 1; hp = usehp ? r.Read(class0 ? fc.Class0Hp[mvcomp] : fc.Hp[mvcomp]) : 1;
@@ -415,7 +415,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (bsize) switch (bsize)
{ {
case BlockSize.Block4x4: case BlockSize.Block4X4:
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
mi.Bmi[i].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[i].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
@@ -423,11 +423,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
mi.Mode = mi.Bmi[3].Mode; mi.Mode = mi.Bmi[3].Mode;
break; break;
case BlockSize.Block4x8: case BlockSize.Block4X8:
mi.Bmi[0].Mode = mi.Bmi[2].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[0].Mode = mi.Bmi[2].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
mi.Bmi[1].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[1].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
break; break;
case BlockSize.Block8x4: case BlockSize.Block8X4:
mi.Bmi[0].Mode = mi.Bmi[1].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[0].Mode = mi.Bmi[1].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
mi.Bmi[2].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[2].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
break; break;
@@ -595,7 +595,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int miRow, int miRow,
int miCol, int miCol,
int block, int block,
int isSub8x8) int isSub8X8)
{ {
ref Array4<sbyte> refSignBias = ref cm.RefFrameSignBias; ref Array4<sbyte> refSignBias = ref cm.RefFrameSignBias;
int i, refmvCount = 0; int i, refmvCount = 0;
@@ -612,7 +612,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
mvRefList.Slice(0, Constants.MaxMvRefCandidates).Fill(new Mv()); mvRefList.Slice(0, Constants.MaxMvRefCandidates).Fill(new Mv());
i = 0; i = 0;
if (isSub8x8 != 0) if (isSub8X8 != 0)
{ {
// If the size < 8x8 we get the mv from the bmi substructure for the // If the size < 8x8 we get the mv from the bmi substructure for the
// nearest two blocks. // nearest two blocks.
@@ -770,7 +770,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return refmvCount; return refmvCount;
} }
private static void AppendSub8x8ForIdx( private static void AppendSub8X8ForIdx(
ref Vp9Common cm, ref Vp9Common cm,
ref MacroBlockD xd, ref MacroBlockD xd,
Span<Position> mvRefSearch, Span<Position> mvRefSearch,
@@ -779,7 +779,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int refr, int refr,
int miRow, int miRow,
int miCol, int miCol,
ref Mv bestSub8x8) ref Mv bestSub8X8)
{ {
Span<Mv> mvList = stackalloc Mv[Constants.MaxMvRefCandidates]; Span<Mv> mvList = stackalloc Mv[Constants.MaxMvRefCandidates];
ref ModeInfo mi = ref xd.Mi[0].Value; ref ModeInfo mi = ref xd.Mi[0].Value;
@@ -794,22 +794,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (block) switch (block)
{ {
case 0: case 0:
bestSub8x8 = mvList[refmvCount - 1]; bestSub8X8 = mvList[refmvCount - 1];
break; break;
case 1: case 1:
case 2: case 2:
if (bMode == PredictionMode.NearestMv) if (bMode == PredictionMode.NearestMv)
{ {
bestSub8x8 = bmi[0].Mv[refr]; bestSub8X8 = bmi[0].Mv[refr];
} }
else else
{ {
bestSub8x8 = new Mv(); bestSub8X8 = new Mv();
for (int n = 0; n < refmvCount; ++n) for (int n = 0; n < refmvCount; ++n)
{ {
if (Unsafe.As<Mv, int>(ref bmi[0].Mv[refr]) != Unsafe.As<Mv, int>(ref mvList[n])) if (Unsafe.As<Mv, int>(ref bmi[0].Mv[refr]) != Unsafe.As<Mv, int>(ref mvList[n]))
{ {
bestSub8x8 = mvList[n]; bestSub8X8 = mvList[n];
break; break;
} }
} }
@@ -819,7 +819,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
case 3: case 3:
if (bMode == PredictionMode.NearestMv) if (bMode == PredictionMode.NearestMv)
{ {
bestSub8x8 = bmi[2].Mv[refr]; bestSub8X8 = bmi[2].Mv[refr];
} }
else else
{ {
@@ -828,12 +828,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
candidates[1] = bmi[0].Mv[refr]; candidates[1] = bmi[0].Mv[refr];
candidates[2] = mvList[0]; candidates[2] = mvList[0];
candidates[3] = mvList[1]; candidates[3] = mvList[1];
bestSub8x8 = new Mv(); bestSub8X8 = new Mv();
for (int n = 0; n < 2 + Constants.MaxMvRefCandidates; ++n) for (int n = 0; n < 2 + Constants.MaxMvRefCandidates; ++n)
{ {
if (Unsafe.As<Mv, int>(ref bmi[2].Mv[refr]) != Unsafe.As<Mv, int>(ref candidates[n])) if (Unsafe.As<Mv, int>(ref bmi[2].Mv[refr]) != Unsafe.As<Mv, int>(ref candidates[n]))
{ {
bestSub8x8 = candidates[n]; bestSub8X8 = candidates[n];
break; break;
} }
} }
@@ -889,7 +889,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
if (cm.Seg.IsSegFeatureActive(mi.SegmentId, SegLvlFeatures.Skip) != 0) if (cm.Seg.IsSegFeatureActive(mi.SegmentId, SegLvlFeatures.Skip) != 0)
{ {
mi.Mode = PredictionMode.ZeroMv; mi.Mode = PredictionMode.ZeroMv;
if (bsize < BlockSize.Block8x8) if (bsize < BlockSize.Block8X8)
{ {
xd.ErrorInfo.Value.InternalError(CodecErr.UnsupBitstream, xd.ErrorInfo.Value.InternalError(CodecErr.UnsupBitstream,
"Invalid usage of segement feature on small blocks"); "Invalid usage of segement feature on small blocks");
@@ -898,7 +898,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
else else
{ {
if (bsize >= BlockSize.Block8x8) if (bsize >= BlockSize.Block8X8)
{ {
mi.Mode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx); mi.Mode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx);
} }
@@ -932,20 +932,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
? ReadSwitchableInterpFilter(ref cm, ref xd, ref r) ? ReadSwitchableInterpFilter(ref cm, ref xd, ref r)
: cm.InterpFilter; : cm.InterpFilter;
if (bsize < BlockSize.Block8x8) if (bsize < BlockSize.Block8X8)
{ {
int num4x4W = 1 << xd.BmodeBlocksWl; int num4X4W = 1 << xd.BmodeBlocksWl;
int num4x4H = 1 << xd.BmodeBlocksHl; int num4X4H = 1 << xd.BmodeBlocksHl;
int idx, idy; int idx, idy;
PredictionMode bMode = 0; PredictionMode bMode = 0;
Array2<Mv> bestSub8x8 = new(); Array2<Mv> bestSub8X8 = new();
const uint invalidMv = 0x80008000; const uint InvalidMv = 0x80008000;
// Initialize the 2nd element as even though it won't be used meaningfully // Initialize the 2nd element as even though it won't be used meaningfully
// if isCompound is false. // if isCompound is false.
Unsafe.As<Mv, uint>(ref bestSub8x8[1]) = invalidMv; Unsafe.As<Mv, uint>(ref bestSub8X8[1]) = InvalidMv;
for (idy = 0; idy < 2; idy += num4x4H) for (idy = 0; idy < 2; idy += num4X4H)
{ {
for (idx = 0; idx < 2; idx += num4x4W) for (idx = 0; idx < 2; idx += num4X4W)
{ {
int j = (idy * 2) + idx; int j = (idy * 2) + idx;
bMode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx); bMode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx);
@@ -954,24 +954,24 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
for (refr = 0; refr < 1 + isCompound; ++refr) for (refr = 0; refr < 1 + isCompound; ++refr)
{ {
AppendSub8x8ForIdx(ref cm, ref xd, mvRefSearch, bMode, j, refr, miRow, miCol, AppendSub8X8ForIdx(ref cm, ref xd, mvRefSearch, bMode, j, refr, miRow, miCol,
ref bestSub8x8[refr]); ref bestSub8X8[refr]);
} }
} }
if (!Assign(ref cm, ref xd, bMode, ref mi.Bmi[j].Mv, ref bestRefMvs, ref bestSub8x8, if (!Assign(ref cm, ref xd, bMode, ref mi.Bmi[j].Mv, ref bestRefMvs, ref bestSub8X8,
isCompound, allowHp, ref r)) isCompound, allowHp, ref r))
{ {
xd.Corrupted |= true; xd.Corrupted |= true;
break; break;
} }
if (num4x4H == 2) if (num4X4H == 2)
{ {
mi.Bmi[j + 2] = mi.Bmi[j]; mi.Bmi[j + 2] = mi.Bmi[j];
} }
if (num4x4W == 2) if (num4X4W == 2)
{ {
mi.Bmi[j + 1] = mi.Bmi[j]; mi.Bmi[j + 1] = mi.Bmi[j];
} }
@@ -1084,7 +1084,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (bsize) switch (bsize)
{ {
case BlockSize.Block4x4: case BlockSize.Block4X4:
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
mi.Value.Bmi[i].Mode = mi.Value.Bmi[i].Mode =
@@ -1093,13 +1093,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
mi.Value.Mode = mi.Value.Bmi[3].Mode; mi.Value.Mode = mi.Value.Bmi[3].Mode;
break; break;
case BlockSize.Block4x8: case BlockSize.Block4X8:
mi.Value.Bmi[0].Mode = mi.Value.Bmi[2].Mode = mi.Value.Bmi[0].Mode = mi.Value.Bmi[2].Mode =
ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0)); ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0));
mi.Value.Bmi[1].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode = mi.Value.Bmi[1].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode =
ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 1)); ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 1));
break; break;
case BlockSize.Block8x4: case BlockSize.Block8X4:
mi.Value.Bmi[0].Mode = mi.Value.Bmi[1].Mode = mi.Value.Bmi[0].Mode = mi.Value.Bmi[1].Mode =
ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0)); ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0));
mi.Value.Bmi[2].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode = mi.Value.Bmi[2].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode =

View File

@@ -17,10 +17,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return new Surface(width, height); return new Surface(width, height);
} }
private static ReadOnlySpan<byte> LiteralToFilter => new byte[] private static ReadOnlySpan<byte> LiteralToFilter =>
{ [
Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear
}; ];
public unsafe bool Decode( public unsafe bool Decode(
ref Vp9PictureInfo pictureInfo, ref Vp9PictureInfo pictureInfo,

View File

@@ -17,10 +17,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
private static int GetCoefContext(ReadOnlySpan<short> neighbors, ReadOnlySpan<byte> tokenCache, int c) private static int GetCoefContext(ReadOnlySpan<short> neighbors, ReadOnlySpan<byte> tokenCache, int c)
{ {
const int maxNeighbors = 2; const int MaxNeighbors = 2;
return (1 + tokenCache[neighbors[(maxNeighbors * c) + 0]] + return (1 + tokenCache[neighbors[(MaxNeighbors * c) + 0]] +
tokenCache[neighbors[(maxNeighbors * c) + 1]]) >> 1; tokenCache[neighbors[(MaxNeighbors * c) + 1]]) >> 1;
} }
private static int DecodeCoefs( private static int DecodeCoefs(
@@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref Array6<Array6<Array3<byte>>> coefProbs = ref fc.CoefProbs[(int)txSize][(int)type][refr]; ref Array6<Array6<Array3<byte>>> coefProbs = ref fc.CoefProbs[(int)txSize][(int)type][refr];
Span<byte> tokenCache = stackalloc byte[32 * 32]; Span<byte> tokenCache = stackalloc byte[32 * 32];
ReadOnlySpan<byte> bandTranslate = Luts.GetBandTranslate(txSize); ReadOnlySpan<byte> bandTranslate = Luts.GetBandTranslate(txSize);
int dqShift = txSize == TxSize.Tx32x32 ? 1 : 0; int dqShift = txSize == TxSize.Tx32X32 ? 1 : 0;
int v; int v;
short dqv = dq[0]; short dqv = dq[0];
ReadOnlySpan<byte> cat6Prob = xd.Bd == 12 ReadOnlySpan<byte> cat6Prob = xd.Bd == 12
@@ -242,7 +242,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4x4: case TxSize.Tx4X4:
ctx = a[0] != 0 ? 1 : 0; ctx = a[0] != 0 ? 1 : 0;
ctx += l[0] != 0 ? 1 : 0; ctx += l[0] != 0 ? 1 : 0;
eob = DecodeCoefs( eob = DecodeCoefs(
@@ -257,8 +257,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref r); ref r);
a[0] = l[0] = (sbyte)(eob > 0 ? 1 : 0); a[0] = l[0] = (sbyte)(eob > 0 ? 1 : 0);
break; break;
case TxSize.Tx8x8: case TxSize.Tx8X8:
GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx8x8); GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx8X8);
ctx = MemoryMarshal.Cast<sbyte, ushort>(a)[0] != 0 ? 1 : 0; ctx = MemoryMarshal.Cast<sbyte, ushort>(a)[0] != 0 ? 1 : 0;
ctx += MemoryMarshal.Cast<sbyte, ushort>(l)[0] != 0 ? 1 : 0; ctx += MemoryMarshal.Cast<sbyte, ushort>(l)[0] != 0 ? 1 : 0;
eob = DecodeCoefs( eob = DecodeCoefs(
@@ -274,8 +274,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
MemoryMarshal.Cast<sbyte, ushort>(a)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftA); MemoryMarshal.Cast<sbyte, ushort>(a)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftA);
MemoryMarshal.Cast<sbyte, ushort>(l)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftL); MemoryMarshal.Cast<sbyte, ushort>(l)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftL);
break; break;
case TxSize.Tx16x16: case TxSize.Tx16X16:
GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx16x16); GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx16X16);
ctx = MemoryMarshal.Cast<sbyte, uint>(a)[0] != 0 ? 1 : 0; ctx = MemoryMarshal.Cast<sbyte, uint>(a)[0] != 0 ? 1 : 0;
ctx += MemoryMarshal.Cast<sbyte, uint>(l)[0] != 0 ? 1 : 0; ctx += MemoryMarshal.Cast<sbyte, uint>(l)[0] != 0 ? 1 : 0;
eob = DecodeCoefs( eob = DecodeCoefs(
@@ -291,8 +291,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
MemoryMarshal.Cast<sbyte, uint>(a)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftA); MemoryMarshal.Cast<sbyte, uint>(a)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftA);
MemoryMarshal.Cast<sbyte, uint>(l)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftL); MemoryMarshal.Cast<sbyte, uint>(l)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftL);
break; break;
case TxSize.Tx32x32: case TxSize.Tx32X32:
GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx32x32); GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx32X32);
// NOTE: Casting to ulong here is safe because the default memory // NOTE: Casting to ulong here is safe because the default memory
// alignment is at least 8 bytes and the Tx32x32 is aligned on 8 byte // alignment is at least 8 bytes and the Tx32x32 is aligned on 8 byte
// boundaries. // boundaries.

View File

@@ -34,17 +34,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
return (ushort)((a + b + 1) >> 1); return (ushort)((a + b + 1) >> 1);
} }
public static unsafe void D207Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
D207Predictor(dst, stride, 8, above, left); D207Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D207Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
D207Predictor(dst, stride, 16, above, left); D207Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D207Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
D207Predictor(dst, stride, 32, above, left); D207Predictor(dst, stride, 32, above, left);
} }
@@ -85,17 +85,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D63Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
D63Predictor(dst, stride, 8, above, left); D63Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D63Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
D63Predictor(dst, stride, 16, above, left); D63Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D63Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
D63Predictor(dst, stride, 32, above, left); D63Predictor(dst, stride, 32, above, left);
} }
@@ -117,17 +117,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D45Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
D45Predictor(dst, stride, 8, above, left); D45Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D45Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
D45Predictor(dst, stride, 16, above, left); D45Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D45Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
D45Predictor(dst, stride, 32, above, left); D45Predictor(dst, stride, 32, above, left);
} }
@@ -152,17 +152,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D117Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
D117Predictor(dst, stride, 8, above, left); D117Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D117Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
D117Predictor(dst, stride, 16, above, left); D117Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D117Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
D117Predictor(dst, stride, 32, above, left); D117Predictor(dst, stride, 32, above, left);
} }
@@ -205,17 +205,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D135Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
D135Predictor(dst, stride, 8, above, left); D135Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D135Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
D135Predictor(dst, stride, 16, above, left); D135Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D135Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
D135Predictor(dst, stride, 32, above, left); D135Predictor(dst, stride, 32, above, left);
} }
@@ -245,17 +245,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D153Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
D153Predictor(dst, stride, 8, above, left); D153Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D153Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
D153Predictor(dst, stride, 16, above, left); D153Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D153Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
D153Predictor(dst, stride, 32, above, left); D153Predictor(dst, stride, 32, above, left);
} }
@@ -297,22 +297,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void VPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 4, above, left); VPredictor(dst, stride, 4, above, left);
} }
public static unsafe void VPredictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 8, above, left); VPredictor(dst, stride, 8, above, left);
} }
public static unsafe void VPredictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 16, above, left); VPredictor(dst, stride, 16, above, left);
} }
public static unsafe void VPredictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 32, above, left); VPredictor(dst, stride, 32, above, left);
} }
@@ -326,22 +326,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 4, above, left); HPredictor(dst, stride, 4, above, left);
} }
public static unsafe void HPredictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 8, above, left); HPredictor(dst, stride, 8, above, left);
} }
public static unsafe void HPredictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 16, above, left); HPredictor(dst, stride, 16, above, left);
} }
public static unsafe void HPredictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 32, above, left); HPredictor(dst, stride, 32, above, left);
} }
@@ -355,22 +355,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void TmPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 4, above, left); TmPredictor(dst, stride, 4, above, left);
} }
public static unsafe void TmPredictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 8, above, left); TmPredictor(dst, stride, 8, above, left);
} }
public static unsafe void TmPredictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 16, above, left); TmPredictor(dst, stride, 16, above, left);
} }
public static unsafe void TmPredictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 32, above, left); TmPredictor(dst, stride, 32, above, left);
} }
@@ -390,22 +390,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void Dc128Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 4, above, left); Dc128Predictor(dst, stride, 4, above, left);
} }
public static unsafe void Dc128Predictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 8, above, left); Dc128Predictor(dst, stride, 8, above, left);
} }
public static unsafe void Dc128Predictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 16, above, left); Dc128Predictor(dst, stride, 16, above, left);
} }
public static unsafe void Dc128Predictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 32, above, left); Dc128Predictor(dst, stride, 32, above, left);
} }
@@ -419,36 +419,36 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void DcLeftPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 4, above, left); DcLeftPredictor(dst, stride, 4, above, left);
} }
public static unsafe void DcLeftPredictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 8, above, left); DcLeftPredictor(dst, stride, 8, above, left);
} }
public static unsafe void DcLeftPredictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 16, above, left); DcLeftPredictor(dst, stride, 16, above, left);
} }
public static unsafe void DcLeftPredictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 32, above, left); DcLeftPredictor(dst, stride, 32, above, left);
} }
private static unsafe void DcLeftPredictor(byte* dst, int stride, int bs, byte* above, byte* left) private static unsafe void DcLeftPredictor(byte* dst, int stride, int bs, byte* above, byte* left)
{ {
int expectedDc, sum = 0; int sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += left[i]; sum += left[i];
} }
expectedDc = (sum + (bs >> 1)) / bs; int expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -457,36 +457,36 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void DcTopPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 4, above, left); DcTopPredictor(dst, stride, 4, above, left);
} }
public static unsafe void DcTopPredictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 8, above, left); DcTopPredictor(dst, stride, 8, above, left);
} }
public static unsafe void DcTopPredictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 16, above, left); DcTopPredictor(dst, stride, 16, above, left);
} }
public static unsafe void DcTopPredictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 32, above, left); DcTopPredictor(dst, stride, 32, above, left);
} }
private static unsafe void DcTopPredictor(byte* dst, int stride, int bs, byte* above, byte* left) private static unsafe void DcTopPredictor(byte* dst, int stride, int bs, byte* above, byte* left)
{ {
int expectedDc, sum = 0; int sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += above[i]; sum += above[i];
} }
expectedDc = (sum + (bs >> 1)) / bs; int expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -495,29 +495,29 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void DcPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 4, above, left); DcPredictor(dst, stride, 4, above, left);
} }
public static unsafe void DcPredictor8x8(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor8X8(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 8, above, left); DcPredictor(dst, stride, 8, above, left);
} }
public static unsafe void DcPredictor16x16(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor16X16(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 16, above, left); DcPredictor(dst, stride, 16, above, left);
} }
public static unsafe void DcPredictor32x32(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor32X32(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 32, above, left); DcPredictor(dst, stride, 32, above, left);
} }
private static unsafe void DcPredictor(byte* dst, int stride, int bs, byte* above, byte* left) private static unsafe void DcPredictor(byte* dst, int stride, int bs, byte* above, byte* left)
{ {
int expectedDc, sum = 0; int sum = 0;
int count = 2 * bs; int count = 2 * bs;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
@@ -526,7 +526,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
sum += left[i]; sum += left[i];
} }
expectedDc = (sum + (count >> 1)) / count; int expectedDc = (sum + (count >> 1)) / count;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -535,31 +535,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HePredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void HePredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte h = above[-1]; byte h = above[-1];
byte I = left[0]; byte i = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
MemoryUtil.Fill(dst + (stride * 0), Avg3(h, I, j), 4); MemoryUtil.Fill(dst + (stride * 0), Avg3(h, i, j), 4);
MemoryUtil.Fill(dst + (stride * 1), Avg3(I, j, k), 4); MemoryUtil.Fill(dst + (stride * 1), Avg3(i, j, k), 4);
MemoryUtil.Fill(dst + (stride * 2), Avg3(j, k, l), 4); MemoryUtil.Fill(dst + (stride * 2), Avg3(j, k, l), 4);
MemoryUtil.Fill(dst + (stride * 3), Avg3(k, l, l), 4); MemoryUtil.Fill(dst + (stride * 3), Avg3(k, l, l), 4);
} }
public static unsafe void VePredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void VePredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte h = above[-1]; byte h = above[-1];
byte I = above[0]; byte i = above[0];
byte j = above[1]; byte j = above[1];
byte k = above[2]; byte k = above[2];
byte l = above[3]; byte l = above[3];
byte m = above[4]; byte m = above[4];
dst[0] = Avg3(h, I, j); dst[0] = Avg3(h, i, j);
dst[1] = Avg3(I, j, k); dst[1] = Avg3(i, j, k);
dst[2] = Avg3(j, k, l); dst[2] = Avg3(j, k, l);
dst[3] = Avg3(k, l, m); dst[3] = Avg3(k, l, m);
MemoryUtil.Copy(dst + (stride * 1), dst, 4); MemoryUtil.Copy(dst + (stride * 1), dst, 4);
@@ -567,23 +567,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
MemoryUtil.Copy(dst + (stride * 3), dst, 4); MemoryUtil.Copy(dst + (stride * 3), dst, 4);
} }
public static unsafe void D207Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte I = left[0]; byte i = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
Dst(dst, stride, 0, 0) = Avg2(I, j); Dst(dst, stride, 0, 0) = Avg2(i, j);
Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l);
Dst(dst, stride, 1, 0) = Avg3(I, j, k); Dst(dst, stride, 1, 0) = Avg3(i, j, k);
Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) =
Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l;
} }
public static unsafe void D63Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -605,7 +605,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8
} }
public static unsafe void D63EPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63EPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -628,7 +628,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(f, g, h); Dst(dst, stride, 3, 3) = Avg3(f, g, h);
} }
public static unsafe void D45Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -648,7 +648,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = h; // differs from vp8 Dst(dst, stride, 3, 3) = h; // differs from vp8
} }
public static unsafe void D45EPredictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45EPredictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -668,9 +668,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(g, h, h); Dst(dst, stride, 3, 3) = Avg3(g, h, h);
} }
public static unsafe void D117Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte I = left[0]; byte i = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte x = above[-1]; byte x = above[-1];
@@ -683,17 +683,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c);
Dst(dst, stride, 3, 0) = Avg2(c, d); Dst(dst, stride, 3, 0) = Avg2(c, d);
Dst(dst, stride, 0, 3) = Avg3(k, j, I); Dst(dst, stride, 0, 3) = Avg3(k, j, i);
Dst(dst, stride, 0, 2) = Avg3(j, I, x); Dst(dst, stride, 0, 2) = Avg3(j, i, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a); Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(i, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c);
Dst(dst, stride, 3, 1) = Avg3(b, c, d); Dst(dst, stride, 3, 1) = Avg3(b, c, d);
} }
public static unsafe void D135Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte I = left[0]; byte i = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
@@ -703,18 +703,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
byte c = above[2]; byte c = above[2];
byte d = above[3]; byte d = above[3];
Dst(dst, stride, 0, 3) = Avg3(j, k, l); Dst(dst, stride, 0, 3) = Avg3(j, k, l);
Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k); Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(i, j, k);
Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j); Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, i, j);
Dst(dst, stride, 3, 3) = Dst(dst, stride, 3, 3) =
Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I); Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, i);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a);
Dst(dst, stride, 3, 0) = Avg3(d, c, b); Dst(dst, stride, 3, 0) = Avg3(d, c, b);
} }
public static unsafe void D153Predictor4x4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor4X4(byte* dst, int stride, byte* above, byte* left)
{ {
byte I = left[0]; byte i = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
@@ -722,30 +722,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
byte c = above[2]; byte c = above[2];
Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x); Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(i, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I); Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, i);
Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j);
Dst(dst, stride, 0, 3) = Avg2(l, k); Dst(dst, stride, 0, 3) = Avg2(l, k);
Dst(dst, stride, 3, 0) = Avg3(a, b, c); Dst(dst, stride, 3, 0) = Avg3(a, b, c);
Dst(dst, stride, 2, 0) = Avg3(x, a, b); Dst(dst, stride, 2, 0) = Avg3(x, a, b);
Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a); Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(i, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x); Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, i, x);
Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I); Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, i);
Dst(dst, stride, 1, 3) = Avg3(l, k, j); Dst(dst, stride, 1, 3) = Avg3(l, k, j);
} }
public static unsafe void HighbdD207Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD207Predictor(dst, stride, 8, above, left, bd); HighbdD207Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD207Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD207Predictor(dst, stride, 16, above, left, bd); HighbdD207Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD207Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD207Predictor(dst, stride, 32, above, left, bd); HighbdD207Predictor(dst, stride, 32, above, left, bd);
} }
@@ -787,17 +787,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD63Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD63Predictor(dst, stride, 8, above, left, bd); HighbdD63Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD63Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD63Predictor(dst, stride, 16, above, left, bd); HighbdD63Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD63Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD63Predictor(dst, stride, 32, above, left, bd); HighbdD63Predictor(dst, stride, 32, above, left, bd);
} }
@@ -820,17 +820,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD45Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD45Predictor(dst, stride, 8, above, left, bd); HighbdD45Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD45Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD45Predictor(dst, stride, 16, above, left, bd); HighbdD45Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD45Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD45Predictor(dst, stride, 32, above, left, bd); HighbdD45Predictor(dst, stride, 32, above, left, bd);
} }
@@ -856,17 +856,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD117Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD117Predictor(dst, stride, 8, above, left, bd); HighbdD117Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD117Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD117Predictor(dst, stride, 16, above, left, bd); HighbdD117Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD117Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD117Predictor(dst, stride, 32, above, left, bd); HighbdD117Predictor(dst, stride, 32, above, left, bd);
} }
@@ -910,17 +910,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD135Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD135Predictor(dst, stride, 8, above, left, bd); HighbdD135Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD135Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD135Predictor(dst, stride, 16, above, left, bd); HighbdD135Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD135Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD135Predictor(dst, stride, 32, above, left, bd); HighbdD135Predictor(dst, stride, 32, above, left, bd);
} }
@@ -951,17 +951,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD153Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD153Predictor(dst, stride, 8, above, left, bd); HighbdD153Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD153Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD153Predictor(dst, stride, 16, above, left, bd); HighbdD153Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD153Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD153Predictor(dst, stride, 32, above, left, bd); HighbdD153Predictor(dst, stride, 32, above, left, bd);
} }
@@ -1004,22 +1004,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdVPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 4, above, left, bd); HighbdVPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdVPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 8, above, left, bd); HighbdVPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdVPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 16, above, left, bd); HighbdVPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdVPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 32, above, left, bd); HighbdVPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1034,22 +1034,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdHPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 4, above, left, bd); HighbdHPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdHPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 8, above, left, bd); HighbdHPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdHPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 16, above, left, bd); HighbdHPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdHPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 32, above, left, bd); HighbdHPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1064,22 +1064,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdTmPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 4, above, left, bd); HighbdTmPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdTmPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 8, above, left, bd); HighbdTmPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdTmPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 16, above, left, bd); HighbdTmPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdTmPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 32, above, left, bd); HighbdTmPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1100,23 +1100,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDc128Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDc128Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDc128Predictor(dst, stride, 4, above, left, bd); HighbdDc128Predictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDc128Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDc128Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDc128Predictor(dst, stride, 8, above, left, bd); HighbdDc128Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDc128Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDc128Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDc128Predictor(dst, stride, 16, above, left, bd); HighbdDc128Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDc128Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDc128Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDc128Predictor(dst, stride, 32, above, left, bd); HighbdDc128Predictor(dst, stride, 32, above, left, bd);
@@ -1132,23 +1132,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDcLeftPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcLeftPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 4, above, left, bd); HighbdDcLeftPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDcLeftPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcLeftPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 8, above, left, bd); HighbdDcLeftPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDcLeftPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcLeftPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 16, above, left, bd); HighbdDcLeftPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDcLeftPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcLeftPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 32, above, left, bd); HighbdDcLeftPredictor(dst, stride, 32, above, left, bd);
@@ -1157,14 +1157,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left,
int bd) int bd)
{ {
int expectedDc, sum = 0; int sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += left[i]; sum += left[i];
} }
expectedDc = (sum + (bs >> 1)) / bs; int expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -1173,23 +1173,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDcTopPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcTopPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcTopPredictor(dst, stride, 4, above, left, bd); HighbdDcTopPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDcTopPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcTopPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcTopPredictor(dst, stride, 8, above, left, bd); HighbdDcTopPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDcTopPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcTopPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcTopPredictor(dst, stride, 16, above, left, bd); HighbdDcTopPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDcTopPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcTopPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcTopPredictor(dst, stride, 32, above, left, bd); HighbdDcTopPredictor(dst, stride, 32, above, left, bd);
@@ -1198,14 +1198,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left,
int bd) int bd)
{ {
int expectedDc, sum = 0; int sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += above[i]; sum += above[i];
} }
expectedDc = (sum + (bs >> 1)) / bs; int expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -1214,22 +1214,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDcPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 4, above, left, bd); HighbdDcPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDcPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 8, above, left, bd); HighbdDcPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDcPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 16, above, left, bd); HighbdDcPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDcPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 32, above, left, bd); HighbdDcPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1237,7 +1237,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left,
int bd) int bd)
{ {
int expectedDc, sum = 0; int sum = 0;
int count = 2 * bs; int count = 2 * bs;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
@@ -1246,7 +1246,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
sum += left[i]; sum += left[i];
} }
expectedDc = (sum + (count >> 1)) / count; int expectedDc = (sum + (count >> 1)) / count;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -1255,23 +1255,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD207Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort I = left[0]; ushort i = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort l = left[3]; ushort l = left[3];
Dst(dst, stride, 0, 0) = Avg2(I, j); Dst(dst, stride, 0, 0) = Avg2(i, j);
Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l);
Dst(dst, stride, 1, 0) = Avg3(I, j, k); Dst(dst, stride, 1, 0) = Avg3(i, j, k);
Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) =
Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l;
} }
public static unsafe void HighbdD63Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort a = above[0]; ushort a = above[0];
ushort b = above[1]; ushort b = above[1];
@@ -1293,7 +1293,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8
} }
public static unsafe void HighbdD45Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort a = above[0]; ushort a = above[0];
ushort b = above[1]; ushort b = above[1];
@@ -1313,9 +1313,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = h; // Differs from vp8 Dst(dst, stride, 3, 3) = h; // Differs from vp8
} }
public static unsafe void HighbdD117Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort I = left[0]; ushort i = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort x = above[-1]; ushort x = above[-1];
@@ -1328,17 +1328,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c);
Dst(dst, stride, 3, 0) = Avg2(c, d); Dst(dst, stride, 3, 0) = Avg2(c, d);
Dst(dst, stride, 0, 3) = Avg3(k, j, I); Dst(dst, stride, 0, 3) = Avg3(k, j, i);
Dst(dst, stride, 0, 2) = Avg3(j, I, x); Dst(dst, stride, 0, 2) = Avg3(j, i, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a); Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(i, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c);
Dst(dst, stride, 3, 1) = Avg3(b, c, d); Dst(dst, stride, 3, 1) = Avg3(b, c, d);
} }
public static unsafe void HighbdD135Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort I = left[0]; ushort i = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort l = left[3]; ushort l = left[3];
@@ -1348,18 +1348,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
ushort c = above[2]; ushort c = above[2];
ushort d = above[3]; ushort d = above[3];
Dst(dst, stride, 0, 3) = Avg3(j, k, l); Dst(dst, stride, 0, 3) = Avg3(j, k, l);
Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k); Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(i, j, k);
Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j); Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, i, j);
Dst(dst, stride, 3, 3) = Dst(dst, stride, 3, 3) =
Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I); Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, i);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a);
Dst(dst, stride, 3, 0) = Avg3(d, c, b); Dst(dst, stride, 3, 0) = Avg3(d, c, b);
} }
public static unsafe void HighbdD153Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort I = left[0]; ushort i = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort l = left[3]; ushort l = left[3];
@@ -1368,16 +1368,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
ushort b = above[1]; ushort b = above[1];
ushort c = above[2]; ushort c = above[2];
Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x); Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(i, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I); Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, i);
Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j);
Dst(dst, stride, 0, 3) = Avg2(l, k); Dst(dst, stride, 0, 3) = Avg2(l, k);
Dst(dst, stride, 3, 0) = Avg3(a, b, c); Dst(dst, stride, 3, 0) = Avg3(a, b, c);
Dst(dst, stride, 2, 0) = Avg3(x, a, b); Dst(dst, stride, 2, 0) = Avg3(x, a, b);
Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a); Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(i, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x); Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, i, x);
Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I); Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, i);
Dst(dst, stride, 1, 3) = Avg3(l, k, j); Dst(dst, stride, 1, 3) = Avg3(l, k, j);
} }
} }

View File

@@ -87,7 +87,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Iwht4x416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Iwht4X416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
/* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds, /* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds,
0.5 shifts per pixel. */ 0.5 shifts per pixel. */
@@ -143,7 +143,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Iwht4x41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Iwht4X41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1, e1; long a1, e1;
Span<int> tmp = stackalloc int[4]; Span<int> tmp = stackalloc int[4];
@@ -233,7 +233,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct4x416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct4X416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -265,7 +265,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct4x41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct4X41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -419,7 +419,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct8x864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct8X864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -452,7 +452,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct8x812Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct8X812Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -487,7 +487,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct8x81Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct8X81Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -843,7 +843,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct16x16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16X16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -876,7 +876,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct16x1638Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16X1638Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -912,7 +912,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct16x1610Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16X1610Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -947,7 +947,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct16x161Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16X161Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -1336,7 +1336,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct32x321024Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32X321024Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1383,7 +1383,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct32x32135Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32X32135Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1419,7 +1419,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct32x3234Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32X3234Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1454,7 +1454,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct32x321Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32X321Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -1474,7 +1474,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIwht4x416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIwht4X416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
/* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds, /* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds,
0.5 shifts per pixel. */ 0.5 shifts per pixel. */
@@ -1530,7 +1530,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIwht4x41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIwht4X41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1, e1; long a1, e1;
Span<int> tmp = stackalloc int[4]; Span<int> tmp = stackalloc int[4];
@@ -1633,7 +1633,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct4x416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct4X416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1665,7 +1665,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void HighbdIdct4x41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct4X41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1; long a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);
@@ -1824,7 +1824,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct8x864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct8X864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1857,7 +1857,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct8x812Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct8X812Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1892,7 +1892,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void VpxHighbdidct8x81AddC(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void VpxHighbdidct8X81AddC(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1; long a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);
@@ -2261,7 +2261,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct16x16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16X16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2294,7 +2294,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct16x1638Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16X1638Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2331,7 +2331,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct16x1610Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16X1610Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2366,7 +2366,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void HighbdIdct16x161Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16X161Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1; long a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);
@@ -2762,7 +2762,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct32x321024Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32X321024Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2809,7 +2809,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct32x32135Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32X32135Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2846,7 +2846,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct32x3234Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32X3234Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2881,7 +2881,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void HighbdIdct32x321Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32X321Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
int a1; int a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);

View File

@@ -1553,7 +1553,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
private static unsafe void Transpose8x16( private static unsafe void Transpose8X16(
ArrayPtr<byte> in0, ArrayPtr<byte> in0,
ArrayPtr<byte> in1, ArrayPtr<byte> in1,
int inP, int inP,
@@ -1633,15 +1633,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
int inP, int inP,
ReadOnlySpan<ArrayPtr<byte>> dst, ReadOnlySpan<ArrayPtr<byte>> dst,
int outP, int outP,
int num8x8ToTranspose) int num8X8ToTranspose)
{ {
int idx8x8 = 0; int idx8X8 = 0;
Vector128<byte> x0, x1, x2, x3, x4, x5, x6, x7; Vector128<byte> x0, x1, x2, x3, x4, x5, x6, x7;
do do
{ {
ArrayPtr<byte> input = src[idx8x8]; ArrayPtr<byte> input = src[idx8X8];
ArrayPtr<byte> output = dst[idx8x8]; ArrayPtr<byte> output = dst[idx8X8];
x0 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (0 * inP))) x0 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (0 * inP)))
.AsByte(); // 00 01 02 03 04 05 06 07 .AsByte(); // 00 01 02 03 04 05 06 07
@@ -1697,7 +1697,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Sse2.StoreScalar((long*)(output.ToPointer() + (6 * outP)), x7.AsInt64()); // 06 16 26 36 46 56 66 76 Sse2.StoreScalar((long*)(output.ToPointer() + (6 * outP)), x7.AsInt64()); // 06 16 26 36 46 56 66 76
Sse2.StoreHigh((double*)(output.ToPointer() + (7 * outP)), x7.AsDouble()); // 07 17 27 37 47 57 67 77 Sse2.StoreHigh((double*)(output.ToPointer() + (7 * outP)), x7.AsDouble()); // 07 17 27 37 47 57 67 77
} while (++idx8x8 < num8x8ToTranspose); } while (++idx8X8 < num8X8ToTranspose);
} }
public static unsafe void LpfVertical4Dual( public static unsafe void LpfVertical4Dual(
@@ -1716,7 +1716,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2]; Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2];
// Transpose 8x16 // Transpose 8x16
Transpose8x16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16); Transpose8X16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16);
// Loop filtering // Loop filtering
LpfHorizontal4Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1); LpfHorizontal4Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1);
@@ -1770,7 +1770,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2]; Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2];
// Transpose 8x16 // Transpose 8x16
Transpose8x16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16); Transpose8X16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16);
// Loop filtering // Loop filtering
LpfHorizontal8Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1); LpfHorizontal8Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1);
@@ -1823,15 +1823,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
ArrayPtr<byte> tDst = new((byte*)tDstStorage, 256); ArrayPtr<byte> tDst = new((byte*)tDstStorage, 256);
// Transpose 16x16 // Transpose 16x16
Transpose8x16(s.Slice(-8), s.Slice(-8 + (8 * pitch)), pitch, tDst, 16); Transpose8X16(s.Slice(-8), s.Slice(-8 + (8 * pitch)), pitch, tDst, 16);
Transpose8x16(s, s.Slice(8 * pitch), pitch, tDst.Slice(8 * 16), 16); Transpose8X16(s, s.Slice(8 * pitch), pitch, tDst.Slice(8 * 16), 16);
// Loop filtering // Loop filtering
LpfHorizontal16Dual(tDst.Slice(8 * 16), 16, blimit, limit, thresh); LpfHorizontal16Dual(tDst.Slice(8 * 16), 16, blimit, limit, thresh);
// Transpose back // Transpose back
Transpose8x16(tDst, tDst.Slice(8 * 16), 16, s.Slice(-8), pitch); Transpose8X16(tDst, tDst.Slice(8 * 16), 16, s.Slice(-8), pitch);
Transpose8x16(tDst.Slice(8), tDst.Slice(8 + (8 * 16)), 16, s.Slice(-8 + (8 * pitch)), pitch); Transpose8X16(tDst.Slice(8), tDst.Slice(8 + (8 * 16)), 16, s.Slice(-8 + (8 * pitch)), pitch);
} }
} }
} }

View File

@@ -26,10 +26,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
// MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT;
private static readonly uint[] CountToUpdateFactor = private static readonly uint[] _countToUpdateFactor =
{ [
0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128
}; ];
private const int ModeMvCountSat = 20; private const int ModeMvCountSat = 20;
@@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
uint count = Math.Min(den, ModeMvCountSat); uint count = Math.Min(den, ModeMvCountSat);
uint factor = CountToUpdateFactor[(int)count]; uint factor = _countToUpdateFactor[(int)count];
byte prob = GetProb(ct0, den); byte prob = GetProb(ct0, den);
return WeightedProb(preProb, prob, (int)factor); return WeightedProb(preProb, prob, (int)factor);
} }

View File

@@ -7,8 +7,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
{ {
internal struct Reader internal struct Reader
{ {
private static readonly byte[] Norm = private static readonly byte[] _norm =
{ [
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; ];
private const int BdValueSize = sizeof(ulong) * 8; private const int BdValueSize = sizeof(ulong) * 8;
@@ -144,7 +144,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
{ {
int shift = Norm[range]; int shift = _norm[range];
range <<= shift; range <<= shift;
value <<= shift; value <<= shift;
count -= shift; count -= shift;
@@ -203,7 +203,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
range = range - split; range = range - split;
value = value - bigsplit; value = value - bigsplit;
{ {
int shift = Norm[range]; int shift = _norm[range];
range <<= shift; range <<= shift;
value <<= shift; value <<= shift;
count -= shift; count -= shift;
@@ -213,7 +213,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
range = split; range = split;
{ {
int shift = Norm[range]; int shift = _norm[range];
range <<= shift; range <<= shift;
value <<= shift; value <<= shift;
count -= shift; count -= shift;
@@ -235,10 +235,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private int DecodeUniform() private int DecodeUniform()
{ {
const int l = 8; const int L = 8;
const int m = (1 << l) - 191; const int M = (1 << L) - 191;
int v = ReadLiteral(l - 1); int v = ReadLiteral(L - 1);
return v < m ? v : (v << 1) - m + ReadBit(); return v < M ? v : (v << 1) - M + ReadBit();
} }
public int DecodeTermSubexp() public int DecodeTermSubexp()
@@ -264,7 +264,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
public TxMode ReadTxMode() public TxMode ReadTxMode()
{ {
TxMode txMode = (TxMode)ReadLiteral(2); TxMode txMode = (TxMode)ReadLiteral(2);
if (txMode == TxMode.Allow32x32) if (txMode == TxMode.Allow32X32)
{ {
txMode += ReadBit(); txMode += ReadBit();
} }

View File

@@ -64,26 +64,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int Cat5MinVal = 35; public const int Cat5MinVal = 35;
public const int Cat6MinVal = 67; public const int Cat6MinVal = 67;
public static readonly byte[] Cat1Prob = { 159 }; public static readonly byte[] Cat1Prob = [159];
public static readonly byte[] Cat2Prob = { 165, 145 }; public static readonly byte[] Cat2Prob = [165, 145];
public static readonly byte[] Cat3Prob = { 173, 148, 140 }; public static readonly byte[] Cat3Prob = [173, 148, 140];
public static readonly byte[] Cat4Prob = { 176, 155, 140, 135 }; public static readonly byte[] Cat4Prob = [176, 155, 140, 135];
public static readonly byte[] Cat5Prob = { 180, 157, 141, 134, 130 }; public static readonly byte[] Cat5Prob = [180, 157, 141, 134, 130];
public static readonly byte[] Cat6Prob = public static readonly byte[] Cat6Prob =
{ [
254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129
}; ];
public static readonly byte[] Cat6ProbHigh12 = public static readonly byte[] Cat6ProbHigh12 =
{ [
255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129
}; ];
public const int EobModelToken = 3; public const int EobModelToken = 3;
private static readonly byte[] CoefbandTrans8x8Plus = private static readonly byte[] _coefbandTrans8X8Plus =
{ [
0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
// beyond MAXBAND_INDEX+1 all values are filled as 5 // beyond MAXBAND_INDEX+1 all values are filled as 5
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -114,260 +114,260 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
}; ];
private static readonly byte[] CoefbandTrans4x4 = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5 }; private static readonly byte[] _coefbandTrans4X4 = [0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5];
public static readonly byte[][] Pareto8Full = public static readonly byte[][] Pareto8Full =
{ [
new byte[] { 3, 86, 128, 6, 86, 23, 88, 29 }, new byte[] { 6, 86, 128, 11, 87, 42, 91, 52 }, [3, 86, 128, 6, 86, 23, 88, 29], [6, 86, 128, 11, 87, 42, 91, 52],
new byte[] { 9, 86, 129, 17, 88, 61, 94, 76 }, new byte[] { 12, 86, 129, 22, 88, 77, 97, 93 }, [9, 86, 129, 17, 88, 61, 94, 76], [12, 86, 129, 22, 88, 77, 97, 93],
new byte[] { 15, 87, 129, 28, 89, 93, 100, 110 }, new byte[] { 17, 87, 129, 33, 90, 105, 103, 123 }, [15, 87, 129, 28, 89, 93, 100, 110], [17, 87, 129, 33, 90, 105, 103, 123],
new byte[] { 20, 88, 130, 38, 91, 118, 106, 136 }, new byte[] { 23, 88, 130, 43, 91, 128, 108, 146 }, [20, 88, 130, 38, 91, 118, 106, 136], [23, 88, 130, 43, 91, 128, 108, 146],
new byte[] { 26, 89, 131, 48, 92, 139, 111, 156 }, new byte[] { 28, 89, 131, 53, 93, 147, 114, 163 }, [26, 89, 131, 48, 92, 139, 111, 156], [28, 89, 131, 53, 93, 147, 114, 163],
new byte[] { 31, 90, 131, 58, 94, 156, 117, 171 }, new byte[] { 34, 90, 131, 62, 94, 163, 119, 177 }, [31, 90, 131, 58, 94, 156, 117, 171], [34, 90, 131, 62, 94, 163, 119, 177],
new byte[] { 37, 90, 132, 66, 95, 171, 122, 184 }, new byte[] { 39, 90, 132, 70, 96, 177, 124, 189 }, [37, 90, 132, 66, 95, 171, 122, 184], [39, 90, 132, 70, 96, 177, 124, 189],
new byte[] { 42, 91, 132, 75, 97, 183, 127, 194 }, new byte[] { 44, 91, 132, 79, 97, 188, 129, 198 }, [42, 91, 132, 75, 97, 183, 127, 194], [44, 91, 132, 79, 97, 188, 129, 198],
new byte[] { 47, 92, 133, 83, 98, 193, 132, 202 }, new byte[] { 49, 92, 133, 86, 99, 197, 134, 205 }, [47, 92, 133, 83, 98, 193, 132, 202], [49, 92, 133, 86, 99, 197, 134, 205],
new byte[] { 52, 93, 133, 90, 100, 201, 137, 208 }, new byte[] { 54, 93, 133, 94, 100, 204, 139, 211 }, [52, 93, 133, 90, 100, 201, 137, 208], [54, 93, 133, 94, 100, 204, 139, 211],
new byte[] { 57, 94, 134, 98, 101, 208, 142, 214 }, new byte[] { 59, 94, 134, 101, 102, 211, 144, 216 }, [57, 94, 134, 98, 101, 208, 142, 214], [59, 94, 134, 101, 102, 211, 144, 216],
new byte[] { 62, 94, 135, 105, 103, 214, 146, 218 }, [62, 94, 135, 105, 103, 214, 146, 218],
new byte[] { 64, 94, 135, 108, 103, 216, 148, 220 }, [64, 94, 135, 108, 103, 216, 148, 220],
new byte[] { 66, 95, 135, 111, 104, 219, 151, 222 }, [66, 95, 135, 111, 104, 219, 151, 222],
new byte[] { 68, 95, 135, 114, 105, 221, 153, 223 }, [68, 95, 135, 114, 105, 221, 153, 223],
new byte[] { 71, 96, 136, 117, 106, 224, 155, 225 }, [71, 96, 136, 117, 106, 224, 155, 225],
new byte[] { 73, 96, 136, 120, 106, 225, 157, 226 }, [73, 96, 136, 120, 106, 225, 157, 226],
new byte[] { 76, 97, 136, 123, 107, 227, 159, 228 }, [76, 97, 136, 123, 107, 227, 159, 228],
new byte[] { 78, 97, 136, 126, 108, 229, 160, 229 }, [78, 97, 136, 126, 108, 229, 160, 229],
new byte[] { 80, 98, 137, 129, 109, 231, 162, 231 }, [80, 98, 137, 129, 109, 231, 162, 231],
new byte[] { 82, 98, 137, 131, 109, 232, 164, 232 }, [82, 98, 137, 131, 109, 232, 164, 232],
new byte[] { 84, 98, 138, 134, 110, 234, 166, 233 }, [84, 98, 138, 134, 110, 234, 166, 233],
new byte[] { 86, 98, 138, 137, 111, 235, 168, 234 }, [86, 98, 138, 137, 111, 235, 168, 234],
new byte[] { 89, 99, 138, 140, 112, 236, 170, 235 }, [89, 99, 138, 140, 112, 236, 170, 235],
new byte[] { 91, 99, 138, 142, 112, 237, 171, 235 }, [91, 99, 138, 142, 112, 237, 171, 235],
new byte[] { 93, 100, 139, 145, 113, 238, 173, 236 }, [93, 100, 139, 145, 113, 238, 173, 236],
new byte[] { 95, 100, 139, 147, 114, 239, 174, 237 }, [95, 100, 139, 147, 114, 239, 174, 237],
new byte[] { 97, 101, 140, 149, 115, 240, 176, 238 }, [97, 101, 140, 149, 115, 240, 176, 238],
new byte[] { 99, 101, 140, 151, 115, 241, 177, 238 }, [99, 101, 140, 151, 115, 241, 177, 238],
new byte[] { 101, 102, 140, 154, 116, 242, 179, 239 }, [101, 102, 140, 154, 116, 242, 179, 239],
new byte[] { 103, 102, 140, 156, 117, 242, 180, 239 }, [103, 102, 140, 156, 117, 242, 180, 239],
new byte[] { 105, 103, 141, 158, 118, 243, 182, 240 }, [105, 103, 141, 158, 118, 243, 182, 240],
new byte[] { 107, 103, 141, 160, 118, 243, 183, 240 }, [107, 103, 141, 160, 118, 243, 183, 240],
new byte[] { 109, 104, 141, 162, 119, 244, 185, 241 }, [109, 104, 141, 162, 119, 244, 185, 241],
new byte[] { 111, 104, 141, 164, 119, 244, 186, 241 }, [111, 104, 141, 164, 119, 244, 186, 241],
new byte[] { 113, 104, 142, 166, 120, 245, 187, 242 }, [113, 104, 142, 166, 120, 245, 187, 242],
new byte[] { 114, 104, 142, 168, 121, 245, 188, 242 }, [114, 104, 142, 168, 121, 245, 188, 242],
new byte[] { 116, 105, 143, 170, 122, 246, 190, 243 }, [116, 105, 143, 170, 122, 246, 190, 243],
new byte[] { 118, 105, 143, 171, 122, 246, 191, 243 }, [118, 105, 143, 171, 122, 246, 191, 243],
new byte[] { 120, 106, 143, 173, 123, 247, 192, 244 }, [120, 106, 143, 173, 123, 247, 192, 244],
new byte[] { 121, 106, 143, 175, 124, 247, 193, 244 }, [121, 106, 143, 175, 124, 247, 193, 244],
new byte[] { 123, 107, 144, 177, 125, 248, 195, 244 }, [123, 107, 144, 177, 125, 248, 195, 244],
new byte[] { 125, 107, 144, 178, 125, 248, 196, 244 }, [125, 107, 144, 178, 125, 248, 196, 244],
new byte[] { 127, 108, 145, 180, 126, 249, 197, 245 }, [127, 108, 145, 180, 126, 249, 197, 245],
new byte[] { 128, 108, 145, 181, 127, 249, 198, 245 }, [128, 108, 145, 181, 127, 249, 198, 245],
new byte[] { 130, 109, 145, 183, 128, 249, 199, 245 }, [130, 109, 145, 183, 128, 249, 199, 245],
new byte[] { 132, 109, 145, 184, 128, 249, 200, 245 }, [132, 109, 145, 184, 128, 249, 200, 245],
new byte[] { 134, 110, 146, 186, 129, 250, 201, 246 }, [134, 110, 146, 186, 129, 250, 201, 246],
new byte[] { 135, 110, 146, 187, 130, 250, 202, 246 }, [135, 110, 146, 187, 130, 250, 202, 246],
new byte[] { 137, 111, 147, 189, 131, 251, 203, 246 }, [137, 111, 147, 189, 131, 251, 203, 246],
new byte[] { 138, 111, 147, 190, 131, 251, 204, 246 }, [138, 111, 147, 190, 131, 251, 204, 246],
new byte[] { 140, 112, 147, 192, 132, 251, 205, 247 }, [140, 112, 147, 192, 132, 251, 205, 247],
new byte[] { 141, 112, 147, 193, 132, 251, 206, 247 }, [141, 112, 147, 193, 132, 251, 206, 247],
new byte[] { 143, 113, 148, 194, 133, 251, 207, 247 }, [143, 113, 148, 194, 133, 251, 207, 247],
new byte[] { 144, 113, 148, 195, 134, 251, 207, 247 }, [144, 113, 148, 195, 134, 251, 207, 247],
new byte[] { 146, 114, 149, 197, 135, 252, 208, 248 }, [146, 114, 149, 197, 135, 252, 208, 248],
new byte[] { 147, 114, 149, 198, 135, 252, 209, 248 }, [147, 114, 149, 198, 135, 252, 209, 248],
new byte[] { 149, 115, 149, 199, 136, 252, 210, 248 }, [149, 115, 149, 199, 136, 252, 210, 248],
new byte[] { 150, 115, 149, 200, 137, 252, 210, 248 }, [150, 115, 149, 200, 137, 252, 210, 248],
new byte[] { 152, 115, 150, 201, 138, 252, 211, 248 }, [152, 115, 150, 201, 138, 252, 211, 248],
new byte[] { 153, 115, 150, 202, 138, 252, 212, 248 }, [153, 115, 150, 202, 138, 252, 212, 248],
new byte[] { 155, 116, 151, 204, 139, 253, 213, 249 }, [155, 116, 151, 204, 139, 253, 213, 249],
new byte[] { 156, 116, 151, 205, 139, 253, 213, 249 }, [156, 116, 151, 205, 139, 253, 213, 249],
new byte[] { 158, 117, 151, 206, 140, 253, 214, 249 }, [158, 117, 151, 206, 140, 253, 214, 249],
new byte[] { 159, 117, 151, 207, 141, 253, 215, 249 }, [159, 117, 151, 207, 141, 253, 215, 249],
new byte[] { 161, 118, 152, 208, 142, 253, 216, 249 }, [161, 118, 152, 208, 142, 253, 216, 249],
new byte[] { 162, 118, 152, 209, 142, 253, 216, 249 }, [162, 118, 152, 209, 142, 253, 216, 249],
new byte[] { 163, 119, 153, 210, 143, 253, 217, 249 }, [163, 119, 153, 210, 143, 253, 217, 249],
new byte[] { 164, 119, 153, 211, 143, 253, 217, 249 }, [164, 119, 153, 211, 143, 253, 217, 249],
new byte[] { 166, 120, 153, 212, 144, 254, 218, 250 }, [166, 120, 153, 212, 144, 254, 218, 250],
new byte[] { 167, 120, 153, 212, 145, 254, 219, 250 }, [167, 120, 153, 212, 145, 254, 219, 250],
new byte[] { 168, 121, 154, 213, 146, 254, 220, 250 }, [168, 121, 154, 213, 146, 254, 220, 250],
new byte[] { 169, 121, 154, 214, 146, 254, 220, 250 }, [169, 121, 154, 214, 146, 254, 220, 250],
new byte[] { 171, 122, 155, 215, 147, 254, 221, 250 }, [171, 122, 155, 215, 147, 254, 221, 250],
new byte[] { 172, 122, 155, 216, 147, 254, 221, 250 }, [172, 122, 155, 216, 147, 254, 221, 250],
new byte[] { 173, 123, 155, 217, 148, 254, 222, 250 }, [173, 123, 155, 217, 148, 254, 222, 250],
new byte[] { 174, 123, 155, 217, 149, 254, 222, 250 }, [174, 123, 155, 217, 149, 254, 222, 250],
new byte[] { 176, 124, 156, 218, 150, 254, 223, 250 }, [176, 124, 156, 218, 150, 254, 223, 250],
new byte[] { 177, 124, 156, 219, 150, 254, 223, 250 }, [177, 124, 156, 219, 150, 254, 223, 250],
new byte[] { 178, 125, 157, 220, 151, 254, 224, 251 }, [178, 125, 157, 220, 151, 254, 224, 251],
new byte[] { 179, 125, 157, 220, 151, 254, 224, 251 }, [179, 125, 157, 220, 151, 254, 224, 251],
new byte[] { 180, 126, 157, 221, 152, 254, 225, 251 }, [180, 126, 157, 221, 152, 254, 225, 251],
new byte[] { 181, 126, 157, 221, 152, 254, 225, 251 }, [181, 126, 157, 221, 152, 254, 225, 251],
new byte[] { 183, 127, 158, 222, 153, 254, 226, 251 }, [183, 127, 158, 222, 153, 254, 226, 251],
new byte[] { 184, 127, 158, 223, 154, 254, 226, 251 }, [184, 127, 158, 223, 154, 254, 226, 251],
new byte[] { 185, 128, 159, 224, 155, 255, 227, 251 }, [185, 128, 159, 224, 155, 255, 227, 251],
new byte[] { 186, 128, 159, 224, 155, 255, 227, 251 }, [186, 128, 159, 224, 155, 255, 227, 251],
new byte[] { 187, 129, 160, 225, 156, 255, 228, 251 }, [187, 129, 160, 225, 156, 255, 228, 251],
new byte[] { 188, 130, 160, 225, 156, 255, 228, 251 }, [188, 130, 160, 225, 156, 255, 228, 251],
new byte[] { 189, 131, 160, 226, 157, 255, 228, 251 }, [189, 131, 160, 226, 157, 255, 228, 251],
new byte[] { 190, 131, 160, 226, 158, 255, 228, 251 }, [190, 131, 160, 226, 158, 255, 228, 251],
new byte[] { 191, 132, 161, 227, 159, 255, 229, 251 }, [191, 132, 161, 227, 159, 255, 229, 251],
new byte[] { 192, 132, 161, 227, 159, 255, 229, 251 }, [192, 132, 161, 227, 159, 255, 229, 251],
new byte[] { 193, 133, 162, 228, 160, 255, 230, 252 }, [193, 133, 162, 228, 160, 255, 230, 252],
new byte[] { 194, 133, 162, 229, 160, 255, 230, 252 }, [194, 133, 162, 229, 160, 255, 230, 252],
new byte[] { 195, 134, 163, 230, 161, 255, 231, 252 }, [195, 134, 163, 230, 161, 255, 231, 252],
new byte[] { 196, 134, 163, 230, 161, 255, 231, 252 }, [196, 134, 163, 230, 161, 255, 231, 252],
new byte[] { 197, 135, 163, 231, 162, 255, 231, 252 }, [197, 135, 163, 231, 162, 255, 231, 252],
new byte[] { 198, 135, 163, 231, 162, 255, 231, 252 }, [198, 135, 163, 231, 162, 255, 231, 252],
new byte[] { 199, 136, 164, 232, 163, 255, 232, 252 }, [199, 136, 164, 232, 163, 255, 232, 252],
new byte[] { 200, 136, 164, 232, 164, 255, 232, 252 }, [200, 136, 164, 232, 164, 255, 232, 252],
new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 }, [201, 137, 165, 233, 165, 255, 233, 252],
new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 }, [201, 137, 165, 233, 165, 255, 233, 252],
new byte[] { 202, 138, 166, 233, 166, 255, 233, 252 }, [202, 138, 166, 233, 166, 255, 233, 252],
new byte[] { 203, 138, 166, 233, 166, 255, 233, 252 }, [203, 138, 166, 233, 166, 255, 233, 252],
new byte[] { 204, 139, 166, 234, 167, 255, 234, 252 }, [204, 139, 166, 234, 167, 255, 234, 252],
new byte[] { 205, 139, 166, 234, 167, 255, 234, 252 }, [205, 139, 166, 234, 167, 255, 234, 252],
new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 }, [206, 140, 167, 235, 168, 255, 235, 252],
new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 }, [206, 140, 167, 235, 168, 255, 235, 252],
new byte[] { 207, 141, 168, 236, 169, 255, 235, 252 }, [207, 141, 168, 236, 169, 255, 235, 252],
new byte[] { 208, 141, 168, 236, 170, 255, 235, 252 }, [208, 141, 168, 236, 170, 255, 235, 252],
new byte[] { 209, 142, 169, 237, 171, 255, 236, 252 }, [209, 142, 169, 237, 171, 255, 236, 252],
new byte[] { 209, 143, 169, 237, 171, 255, 236, 252 }, [209, 143, 169, 237, 171, 255, 236, 252],
new byte[] { 210, 144, 169, 237, 172, 255, 236, 252 }, [210, 144, 169, 237, 172, 255, 236, 252],
new byte[] { 211, 144, 169, 237, 172, 255, 236, 252 }, [211, 144, 169, 237, 172, 255, 236, 252],
new byte[] { 212, 145, 170, 238, 173, 255, 237, 252 }, [212, 145, 170, 238, 173, 255, 237, 252],
new byte[] { 213, 145, 170, 238, 173, 255, 237, 252 }, [213, 145, 170, 238, 173, 255, 237, 252],
new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 }, [214, 146, 171, 239, 174, 255, 237, 253],
new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 }, [214, 146, 171, 239, 174, 255, 237, 253],
new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 }, [215, 147, 172, 240, 175, 255, 238, 253],
new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 }, [215, 147, 172, 240, 175, 255, 238, 253],
new byte[] { 216, 148, 173, 240, 176, 255, 238, 253 }, [216, 148, 173, 240, 176, 255, 238, 253],
new byte[] { 217, 148, 173, 240, 176, 255, 238, 253 }, [217, 148, 173, 240, 176, 255, 238, 253],
new byte[] { 218, 149, 173, 241, 177, 255, 239, 253 }, [218, 149, 173, 241, 177, 255, 239, 253],
new byte[] { 218, 149, 173, 241, 178, 255, 239, 253 }, [218, 149, 173, 241, 178, 255, 239, 253],
new byte[] { 219, 150, 174, 241, 179, 255, 239, 253 }, [219, 150, 174, 241, 179, 255, 239, 253],
new byte[] { 219, 151, 174, 241, 179, 255, 239, 253 }, [219, 151, 174, 241, 179, 255, 239, 253],
new byte[] { 220, 152, 175, 242, 180, 255, 240, 253 }, [220, 152, 175, 242, 180, 255, 240, 253],
new byte[] { 221, 152, 175, 242, 180, 255, 240, 253 }, [221, 152, 175, 242, 180, 255, 240, 253],
new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 }, [222, 153, 176, 242, 181, 255, 240, 253],
new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 }, [222, 153, 176, 242, 181, 255, 240, 253],
new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 }, [223, 154, 177, 243, 182, 255, 240, 253],
new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 }, [223, 154, 177, 243, 182, 255, 240, 253],
new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 }, [224, 155, 178, 244, 183, 255, 241, 253],
new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 }, [224, 155, 178, 244, 183, 255, 241, 253],
new byte[] { 225, 156, 178, 244, 184, 255, 241, 253 }, [225, 156, 178, 244, 184, 255, 241, 253],
new byte[] { 225, 157, 178, 244, 184, 255, 241, 253 }, [225, 157, 178, 244, 184, 255, 241, 253],
new byte[] { 226, 158, 179, 244, 185, 255, 242, 253 }, [226, 158, 179, 244, 185, 255, 242, 253],
new byte[] { 227, 158, 179, 244, 185, 255, 242, 253 }, [227, 158, 179, 244, 185, 255, 242, 253],
new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 }, [228, 159, 180, 245, 186, 255, 242, 253],
new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 }, [228, 159, 180, 245, 186, 255, 242, 253],
new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 }, [229, 160, 181, 245, 187, 255, 242, 253],
new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 }, [229, 160, 181, 245, 187, 255, 242, 253],
new byte[] { 230, 161, 182, 246, 188, 255, 243, 253 }, [230, 161, 182, 246, 188, 255, 243, 253],
new byte[] { 230, 162, 182, 246, 188, 255, 243, 253 }, [230, 162, 182, 246, 188, 255, 243, 253],
new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 }, [231, 163, 183, 246, 189, 255, 243, 253],
new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 }, [231, 163, 183, 246, 189, 255, 243, 253],
new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 }, [232, 164, 184, 247, 190, 255, 243, 253],
new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 }, [232, 164, 184, 247, 190, 255, 243, 253],
new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 }, [233, 165, 185, 247, 191, 255, 244, 253],
new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 }, [233, 165, 185, 247, 191, 255, 244, 253],
new byte[] { 234, 166, 185, 247, 192, 255, 244, 253 }, [234, 166, 185, 247, 192, 255, 244, 253],
new byte[] { 234, 167, 185, 247, 192, 255, 244, 253 }, [234, 167, 185, 247, 192, 255, 244, 253],
new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 }, [235, 168, 186, 248, 193, 255, 244, 253],
new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 }, [235, 168, 186, 248, 193, 255, 244, 253],
new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 }, [236, 169, 187, 248, 194, 255, 244, 253],
new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 }, [236, 169, 187, 248, 194, 255, 244, 253],
new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 }, [236, 170, 188, 248, 195, 255, 245, 253],
new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 }, [236, 170, 188, 248, 195, 255, 245, 253],
new byte[] { 237, 171, 189, 249, 196, 255, 245, 254 }, [237, 171, 189, 249, 196, 255, 245, 254],
new byte[] { 237, 172, 189, 249, 196, 255, 245, 254 }, [237, 172, 189, 249, 196, 255, 245, 254],
new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 }, [238, 173, 190, 249, 197, 255, 245, 254],
new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 }, [238, 173, 190, 249, 197, 255, 245, 254],
new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 }, [239, 174, 191, 249, 198, 255, 245, 254],
new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 }, [239, 174, 191, 249, 198, 255, 245, 254],
new byte[] { 240, 175, 192, 249, 199, 255, 246, 254 }, [240, 175, 192, 249, 199, 255, 246, 254],
new byte[] { 240, 176, 192, 249, 199, 255, 246, 254 }, [240, 176, 192, 249, 199, 255, 246, 254],
new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 }, [240, 177, 193, 250, 200, 255, 246, 254],
new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 }, [240, 177, 193, 250, 200, 255, 246, 254],
new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 }, [241, 178, 194, 250, 201, 255, 246, 254],
new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 }, [241, 178, 194, 250, 201, 255, 246, 254],
new byte[] { 242, 179, 195, 250, 202, 255, 246, 254 }, [242, 179, 195, 250, 202, 255, 246, 254],
new byte[] { 242, 180, 195, 250, 202, 255, 246, 254 }, [242, 180, 195, 250, 202, 255, 246, 254],
new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 }, [242, 181, 196, 250, 203, 255, 247, 254],
new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 }, [242, 181, 196, 250, 203, 255, 247, 254],
new byte[] { 243, 182, 197, 251, 204, 255, 247, 254 }, [243, 182, 197, 251, 204, 255, 247, 254],
new byte[] { 243, 183, 197, 251, 204, 255, 247, 254 }, [243, 183, 197, 251, 204, 255, 247, 254],
new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 }, [244, 184, 198, 251, 205, 255, 247, 254],
new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 }, [244, 184, 198, 251, 205, 255, 247, 254],
new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 }, [244, 185, 199, 251, 206, 255, 247, 254],
new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 }, [244, 185, 199, 251, 206, 255, 247, 254],
new byte[] { 245, 186, 200, 251, 207, 255, 247, 254 }, [245, 186, 200, 251, 207, 255, 247, 254],
new byte[] { 245, 187, 200, 251, 207, 255, 247, 254 }, [245, 187, 200, 251, 207, 255, 247, 254],
new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 }, [246, 188, 201, 252, 207, 255, 248, 254],
new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 }, [246, 188, 201, 252, 207, 255, 248, 254],
new byte[] { 246, 189, 202, 252, 208, 255, 248, 254 }, [246, 189, 202, 252, 208, 255, 248, 254],
new byte[] { 246, 190, 202, 252, 208, 255, 248, 254 }, [246, 190, 202, 252, 208, 255, 248, 254],
new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 }, [247, 191, 203, 252, 209, 255, 248, 254],
new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 }, [247, 191, 203, 252, 209, 255, 248, 254],
new byte[] { 247, 192, 204, 252, 210, 255, 248, 254 }, [247, 192, 204, 252, 210, 255, 248, 254],
new byte[] { 247, 193, 204, 252, 210, 255, 248, 254 }, [247, 193, 204, 252, 210, 255, 248, 254],
new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 }, [248, 194, 205, 252, 211, 255, 248, 254],
new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 }, [248, 194, 205, 252, 211, 255, 248, 254],
new byte[] { 248, 195, 206, 252, 212, 255, 249, 254 }, [248, 195, 206, 252, 212, 255, 249, 254],
new byte[] { 248, 196, 206, 252, 212, 255, 249, 254 }, [248, 196, 206, 252, 212, 255, 249, 254],
new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 }, [249, 197, 207, 253, 213, 255, 249, 254],
new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 }, [249, 197, 207, 253, 213, 255, 249, 254],
new byte[] { 249, 198, 208, 253, 214, 255, 249, 254 }, [249, 198, 208, 253, 214, 255, 249, 254],
new byte[] { 249, 199, 209, 253, 214, 255, 249, 254 }, [249, 199, 209, 253, 214, 255, 249, 254],
new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 }, [250, 200, 210, 253, 215, 255, 249, 254],
new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 }, [250, 200, 210, 253, 215, 255, 249, 254],
new byte[] { 250, 201, 211, 253, 215, 255, 249, 254 }, [250, 201, 211, 253, 215, 255, 249, 254],
new byte[] { 250, 202, 211, 253, 215, 255, 249, 254 }, [250, 202, 211, 253, 215, 255, 249, 254],
new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 }, [250, 203, 212, 253, 216, 255, 249, 254],
new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 }, [250, 203, 212, 253, 216, 255, 249, 254],
new byte[] { 251, 204, 213, 253, 217, 255, 250, 254 }, [251, 204, 213, 253, 217, 255, 250, 254],
new byte[] { 251, 205, 213, 253, 217, 255, 250, 254 }, [251, 205, 213, 253, 217, 255, 250, 254],
new byte[] { 251, 206, 214, 254, 218, 255, 250, 254 }, [251, 206, 214, 254, 218, 255, 250, 254],
new byte[] { 251, 206, 215, 254, 218, 255, 250, 254 }, [251, 206, 215, 254, 218, 255, 250, 254],
new byte[] { 252, 207, 216, 254, 219, 255, 250, 254 }, [252, 207, 216, 254, 219, 255, 250, 254],
new byte[] { 252, 208, 216, 254, 219, 255, 250, 254 }, [252, 208, 216, 254, 219, 255, 250, 254],
new byte[] { 252, 209, 217, 254, 220, 255, 250, 254 }, [252, 209, 217, 254, 220, 255, 250, 254],
new byte[] { 252, 210, 217, 254, 220, 255, 250, 254 }, [252, 210, 217, 254, 220, 255, 250, 254],
new byte[] { 252, 211, 218, 254, 221, 255, 250, 254 }, [252, 211, 218, 254, 221, 255, 250, 254],
new byte[] { 252, 212, 218, 254, 221, 255, 250, 254 }, [252, 212, 218, 254, 221, 255, 250, 254],
new byte[] { 253, 213, 219, 254, 222, 255, 250, 254 }, [253, 213, 219, 254, 222, 255, 250, 254],
new byte[] { 253, 213, 220, 254, 222, 255, 250, 254 }, [253, 213, 220, 254, 222, 255, 250, 254],
new byte[] { 253, 214, 221, 254, 223, 255, 250, 254 }, [253, 214, 221, 254, 223, 255, 250, 254],
new byte[] { 253, 215, 221, 254, 223, 255, 250, 254 }, [253, 215, 221, 254, 223, 255, 250, 254],
new byte[] { 253, 216, 222, 254, 224, 255, 251, 254 }, [253, 216, 222, 254, 224, 255, 251, 254],
new byte[] { 253, 217, 223, 254, 224, 255, 251, 254 }, [253, 217, 223, 254, 224, 255, 251, 254],
new byte[] { 253, 218, 224, 254, 225, 255, 251, 254 }, [253, 218, 224, 254, 225, 255, 251, 254],
new byte[] { 253, 219, 224, 254, 225, 255, 251, 254 }, [253, 219, 224, 254, 225, 255, 251, 254],
new byte[] { 254, 220, 225, 254, 225, 255, 251, 254 }, [254, 220, 225, 254, 225, 255, 251, 254],
new byte[] { 254, 221, 226, 254, 225, 255, 251, 254 }, [254, 221, 226, 254, 225, 255, 251, 254],
new byte[] { 254, 222, 227, 255, 226, 255, 251, 254 }, [254, 222, 227, 255, 226, 255, 251, 254],
new byte[] { 254, 223, 227, 255, 226, 255, 251, 254 }, [254, 223, 227, 255, 226, 255, 251, 254],
new byte[] { 254, 224, 228, 255, 227, 255, 251, 254 }, [254, 224, 228, 255, 227, 255, 251, 254],
new byte[] { 254, 225, 229, 255, 227, 255, 251, 254 }, [254, 225, 229, 255, 227, 255, 251, 254],
new byte[] { 254, 226, 230, 255, 228, 255, 251, 254 }, [254, 226, 230, 255, 228, 255, 251, 254],
new byte[] { 254, 227, 230, 255, 229, 255, 251, 254 }, [254, 227, 230, 255, 229, 255, 251, 254],
new byte[] { 255, 228, 231, 255, 230, 255, 251, 254 }, [255, 228, 231, 255, 230, 255, 251, 254],
new byte[] { 255, 229, 232, 255, 230, 255, 251, 254 }, [255, 229, 232, 255, 230, 255, 251, 254],
new byte[] { 255, 230, 233, 255, 231, 255, 252, 254 }, [255, 230, 233, 255, 231, 255, 252, 254],
new byte[] { 255, 231, 234, 255, 231, 255, 252, 254 }, [255, 231, 234, 255, 231, 255, 252, 254],
new byte[] { 255, 232, 235, 255, 232, 255, 252, 254 }, [255, 232, 235, 255, 232, 255, 252, 254],
new byte[] { 255, 233, 236, 255, 232, 255, 252, 254 }, [255, 233, 236, 255, 232, 255, 252, 254],
new byte[] { 255, 235, 237, 255, 233, 255, 252, 254 }, [255, 235, 237, 255, 233, 255, 252, 254],
new byte[] { 255, 236, 238, 255, 234, 255, 252, 254 }, [255, 236, 238, 255, 234, 255, 252, 254],
new byte[] { 255, 238, 240, 255, 235, 255, 252, 255 }, [255, 238, 240, 255, 235, 255, 252, 255],
new byte[] { 255, 239, 241, 255, 235, 255, 252, 254 }, [255, 239, 241, 255, 235, 255, 252, 254],
new byte[] { 255, 241, 243, 255, 236, 255, 252, 254 }, [255, 241, 243, 255, 236, 255, 252, 254],
new byte[] { 255, 243, 245, 255, 237, 255, 252, 254 }, [255, 243, 245, 255, 237, 255, 252, 254],
new byte[] { 255, 246, 247, 255, 239, 255, 253, 255 } [255, 246, 247, 255, 239, 255, 253, 255]
}; ];
internal static readonly byte[] DefaultCoefProbs4x4 = internal static readonly byte[] DefaultCoefProbs4X4 =
{ [
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -422,10 +422,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
127, 145, 243, 71, 129, 228, 17, 93, 177, 3, 61, 124, 1, 41, 84, 1, 21, 52, 127, 145, 243, 71, 129, 228, 17, 93, 177, 3, 61, 124, 1, 41, 84, 1, 21, 52,
// Band 5 // Band 5
157, 78, 244, 140, 72, 231, 69, 58, 184, 31, 44, 137, 14, 38, 105, 8, 23, 61 157, 78, 244, 140, 72, 231, 69, 58, 184, 31, 44, 137, 14, 38, 105, 8, 23, 61
}; ];
internal static readonly byte[] DefaultCoefProbs8x8 = internal static readonly byte[] DefaultCoefProbs8X8 =
{ [
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -480,10 +480,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
62, 190, 238, 21, 159, 222, 2, 107, 172, 1, 72, 122, 1, 40, 71, 1, 18, 32, 62, 190, 238, 21, 159, 222, 2, 107, 172, 1, 72, 122, 1, 40, 71, 1, 18, 32,
// Band 5 // Band 5
61, 199, 240, 27, 161, 226, 4, 113, 180, 1, 76, 129, 1, 46, 80, 1, 23, 41 61, 199, 240, 27, 161, 226, 4, 113, 180, 1, 76, 129, 1, 46, 80, 1, 23, 41
}; ];
internal static readonly byte[] DefaultCoefProbs16x16 = internal static readonly byte[] DefaultCoefProbs16X16 =
{ [
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -538,10 +538,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
40, 194, 227, 8, 147, 204, 1, 94, 155, 1, 65, 112, 1, 39, 66, 1, 14, 26, 40, 194, 227, 8, 147, 204, 1, 94, 155, 1, 65, 112, 1, 39, 66, 1, 14, 26,
// Band 5 // Band 5
16, 208, 228, 3, 151, 207, 1, 98, 160, 1, 67, 117, 1, 41, 74, 1, 17, 31 16, 208, 228, 3, 151, 207, 1, 98, 160, 1, 67, 117, 1, 41, 74, 1, 17, 31
}; ];
internal static readonly byte[] DefaultCoefProbs32x32 = internal static readonly byte[] DefaultCoefProbs32X32 =
{ [
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -596,11 +596,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
84, 220, 246, 31, 177, 231, 2, 115, 180, 1, 79, 134, 1, 55, 77, 1, 60, 79, 84, 220, 246, 31, 177, 231, 2, 115, 180, 1, 79, 134, 1, 55, 77, 1, 60, 79,
// Band 5 // Band 5
43, 243, 240, 8, 180, 217, 1, 115, 166, 1, 84, 121, 1, 51, 67, 1, 16, 6 43, 243, 240, 8, 180, 217, 1, 115, 166, 1, 84, 121, 1, 51, 67, 1, 16, 6
}; ];
public static byte[] GetBandTranslate(int txSize) public static byte[] GetBandTranslate(int txSize)
{ {
return txSize == (int)TxSize.Tx4x4 ? CoefbandTrans4x4 : CoefbandTrans8x8Plus; return txSize == (int)TxSize.Tx4X4 ? _coefbandTrans4X4 : _coefbandTrans8X8Plus;
} }
public static void CopyProbs<T>(ref T dest, ReadOnlySpan<byte> probs) where T : unmanaged public static void CopyProbs<T>(ref T dest, ReadOnlySpan<byte> probs) where T : unmanaged

View File

@@ -13,173 +13,163 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int TxSizeContexts = 2; public const int TxSizeContexts = 2;
public static readonly byte[][][] KfYModeProb = public static readonly byte[][][] KfYModeProb =
{ [
new[] [
{
// above = dc // above = dc
new byte[] { 137, 30, 42, 148, 151, 207, 70, 52, 91 }, // left = dc [137, 30, 42, 148, 151, 207, 70, 52, 91], // left = dc
new byte[] { 92, 45, 102, 136, 116, 180, 74, 90, 100 }, // left = v [92, 45, 102, 136, 116, 180, 74, 90, 100], // left = v
new byte[] { 73, 32, 19, 187, 222, 215, 46, 34, 100 }, // left = h [73, 32, 19, 187, 222, 215, 46, 34, 100], // left = h
new byte[] { 91, 30, 32, 116, 121, 186, 93, 86, 94 }, // left = d45 [91, 30, 32, 116, 121, 186, 93, 86, 94], // left = d45
new byte[] { 72, 35, 36, 149, 68, 206, 68, 63, 105 }, // left = d135 [72, 35, 36, 149, 68, 206, 68, 63, 105], // left = d135
new byte[] { 73, 31, 28, 138, 57, 124, 55, 122, 151 }, // left = d117 [73, 31, 28, 138, 57, 124, 55, 122, 151], // left = d117
new byte[] { 67, 23, 21, 140, 126, 197, 40, 37, 171 }, // left = d153 [67, 23, 21, 140, 126, 197, 40, 37, 171], // left = d153
new byte[] { 86, 27, 28, 128, 154, 212, 45, 43, 53 }, // left = d207 [86, 27, 28, 128, 154, 212, 45, 43, 53], // left = d207
new byte[] { 74, 32, 27, 107, 86, 160, 63, 134, 102 }, // left = d63 [74, 32, 27, 107, 86, 160, 63, 134, 102], // left = d63
new byte[] { 59, 67, 44, 140, 161, 202, 78, 67, 119 } // left = tm [59, 67, 44, 140, 161, 202, 78, 67, 119] // left = tm
}, ],
new[] [
{
// above = v // above = v
new byte[] { 63, 36, 126, 146, 123, 158, 60, 90, 96 }, // left = dc [63, 36, 126, 146, 123, 158, 60, 90, 96], // left = dc
new byte[] { 43, 46, 168, 134, 107, 128, 69, 142, 92 }, // left = v [43, 46, 168, 134, 107, 128, 69, 142, 92], // left = v
new byte[] { 44, 29, 68, 159, 201, 177, 50, 57, 77 }, // left = h [44, 29, 68, 159, 201, 177, 50, 57, 77], // left = h
new byte[] { 58, 38, 76, 114, 97, 172, 78, 133, 92 }, // left = d45 [58, 38, 76, 114, 97, 172, 78, 133, 92], // left = d45
new byte[] { 46, 41, 76, 140, 63, 184, 69, 112, 57 }, // left = d135 [46, 41, 76, 140, 63, 184, 69, 112, 57], // left = d135
new byte[] { 38, 32, 85, 140, 46, 112, 54, 151, 133 }, // left = d117 [38, 32, 85, 140, 46, 112, 54, 151, 133], // left = d117
new byte[] { 39, 27, 61, 131, 110, 175, 44, 75, 136 }, // left = d153 [39, 27, 61, 131, 110, 175, 44, 75, 136], // left = d153
new byte[] { 52, 30, 74, 113, 130, 175, 51, 64, 58 }, // left = d207 [52, 30, 74, 113, 130, 175, 51, 64, 58], // left = d207
new byte[] { 47, 35, 80, 100, 74, 143, 64, 163, 74 }, // left = d63 [47, 35, 80, 100, 74, 143, 64, 163, 74], // left = d63
new byte[] { 36, 61, 116, 114, 128, 162, 80, 125, 82 } // left = tm [36, 61, 116, 114, 128, 162, 80, 125, 82] // left = tm
}, ],
new[] [
{
// above = h // above = h
new byte[] { 82, 26, 26, 171, 208, 204, 44, 32, 105 }, // left = dc [82, 26, 26, 171, 208, 204, 44, 32, 105], // left = dc
new byte[] { 55, 44, 68, 166, 179, 192, 57, 57, 108 }, // left = v [55, 44, 68, 166, 179, 192, 57, 57, 108], // left = v
new byte[] { 42, 26, 11, 199, 241, 228, 23, 15, 85 }, // left = h [42, 26, 11, 199, 241, 228, 23, 15, 85], // left = h
new byte[] { 68, 42, 19, 131, 160, 199, 55, 52, 83 }, // left = d45 [68, 42, 19, 131, 160, 199, 55, 52, 83], // left = d45
new byte[] { 58, 50, 25, 139, 115, 232, 39, 52, 118 }, // left = d135 [58, 50, 25, 139, 115, 232, 39, 52, 118], // left = d135
new byte[] { 50, 35, 33, 153, 104, 162, 64, 59, 131 }, // left = d117 [50, 35, 33, 153, 104, 162, 64, 59, 131], // left = d117
new byte[] { 44, 24, 16, 150, 177, 202, 33, 19, 156 }, // left = d153 [44, 24, 16, 150, 177, 202, 33, 19, 156], // left = d153
new byte[] { 55, 27, 12, 153, 203, 218, 26, 27, 49 }, // left = d207 [55, 27, 12, 153, 203, 218, 26, 27, 49], // left = d207
new byte[] { 53, 49, 21, 110, 116, 168, 59, 80, 76 }, // left = d63 [53, 49, 21, 110, 116, 168, 59, 80, 76], // left = d63
new byte[] { 38, 72, 19, 168, 203, 212, 50, 50, 107 } // left = tm [38, 72, 19, 168, 203, 212, 50, 50, 107] // left = tm
}, ],
new[] [
{
// above = d45 // above = d45
new byte[] { 103, 26, 36, 129, 132, 201, 83, 80, 93 }, // left = dc [103, 26, 36, 129, 132, 201, 83, 80, 93], // left = dc
new byte[] { 59, 38, 83, 112, 103, 162, 98, 136, 90 }, // left = v [59, 38, 83, 112, 103, 162, 98, 136, 90], // left = v
new byte[] { 62, 30, 23, 158, 200, 207, 59, 57, 50 }, // left = h [62, 30, 23, 158, 200, 207, 59, 57, 50], // left = h
new byte[] { 67, 30, 29, 84, 86, 191, 102, 91, 59 }, // left = d45 [67, 30, 29, 84, 86, 191, 102, 91, 59], // left = d45
new byte[] { 60, 32, 33, 112, 71, 220, 64, 89, 104 }, // left = d135 [60, 32, 33, 112, 71, 220, 64, 89, 104], // left = d135
new byte[] { 53, 26, 34, 130, 56, 149, 84, 120, 103 }, // left = d117 [53, 26, 34, 130, 56, 149, 84, 120, 103], // left = d117
new byte[] { 53, 21, 23, 133, 109, 210, 56, 77, 172 }, // left = d153 [53, 21, 23, 133, 109, 210, 56, 77, 172], // left = d153
new byte[] { 77, 19, 29, 112, 142, 228, 55, 66, 36 }, // left = d207 [77, 19, 29, 112, 142, 228, 55, 66, 36], // left = d207
new byte[] { 61, 29, 29, 93, 97, 165, 83, 175, 162 }, // left = d63 [61, 29, 29, 93, 97, 165, 83, 175, 162], // left = d63
new byte[] { 47, 47, 43, 114, 137, 181, 100, 99, 95 } // left = tm [47, 47, 43, 114, 137, 181, 100, 99, 95] // left = tm
}, ],
new[] [
{
// above = d135 // above = d135
new byte[] { 69, 23, 29, 128, 83, 199, 46, 44, 101 }, // left = dc [69, 23, 29, 128, 83, 199, 46, 44, 101], // left = dc
new byte[] { 53, 40, 55, 139, 69, 183, 61, 80, 110 }, // left = v [53, 40, 55, 139, 69, 183, 61, 80, 110], // left = v
new byte[] { 40, 29, 19, 161, 180, 207, 43, 24, 91 }, // left = h [40, 29, 19, 161, 180, 207, 43, 24, 91], // left = h
new byte[] { 60, 34, 19, 105, 61, 198, 53, 64, 89 }, // left = d45 [60, 34, 19, 105, 61, 198, 53, 64, 89], // left = d45
new byte[] { 52, 31, 22, 158, 40, 209, 58, 62, 89 }, // left = d135 [52, 31, 22, 158, 40, 209, 58, 62, 89], // left = d135
new byte[] { 44, 31, 29, 147, 46, 158, 56, 102, 198 }, // left = d117 [44, 31, 29, 147, 46, 158, 56, 102, 198], // left = d117
new byte[] { 35, 19, 12, 135, 87, 209, 41, 45, 167 }, // left = d153 [35, 19, 12, 135, 87, 209, 41, 45, 167], // left = d153
new byte[] { 55, 25, 21, 118, 95, 215, 38, 39, 66 }, // left = d207 [55, 25, 21, 118, 95, 215, 38, 39, 66], // left = d207
new byte[] { 51, 38, 25, 113, 58, 164, 70, 93, 97 }, // left = d63 [51, 38, 25, 113, 58, 164, 70, 93, 97], // left = d63
new byte[] { 47, 54, 34, 146, 108, 203, 72, 103, 151 } // left = tm [47, 54, 34, 146, 108, 203, 72, 103, 151] // left = tm
}, ],
new[] [
{
// above = d117 // above = d117
new byte[] { 64, 19, 37, 156, 66, 138, 49, 95, 133 }, // left = dc [64, 19, 37, 156, 66, 138, 49, 95, 133], // left = dc
new byte[] { 46, 27, 80, 150, 55, 124, 55, 121, 135 }, // left = v [46, 27, 80, 150, 55, 124, 55, 121, 135], // left = v
new byte[] { 36, 23, 27, 165, 149, 166, 54, 64, 118 }, // left = h [36, 23, 27, 165, 149, 166, 54, 64, 118], // left = h
new byte[] { 53, 21, 36, 131, 63, 163, 60, 109, 81 }, // left = d45 [53, 21, 36, 131, 63, 163, 60, 109, 81], // left = d45
new byte[] { 40, 26, 35, 154, 40, 185, 51, 97, 123 }, // left = d135 [40, 26, 35, 154, 40, 185, 51, 97, 123], // left = d135
new byte[] { 35, 19, 34, 179, 19, 97, 48, 129, 124 }, // left = d117 [35, 19, 34, 179, 19, 97, 48, 129, 124], // left = d117
new byte[] { 36, 20, 26, 136, 62, 164, 33, 77, 154 }, // left = d153 [36, 20, 26, 136, 62, 164, 33, 77, 154], // left = d153
new byte[] { 45, 18, 32, 130, 90, 157, 40, 79, 91 }, // left = d207 [45, 18, 32, 130, 90, 157, 40, 79, 91], // left = d207
new byte[] { 45, 26, 28, 129, 45, 129, 49, 147, 123 }, // left = d63 [45, 26, 28, 129, 45, 129, 49, 147, 123], // left = d63
new byte[] { 38, 44, 51, 136, 74, 162, 57, 97, 121 } // left = tm [38, 44, 51, 136, 74, 162, 57, 97, 121] // left = tm
}, ],
new[] [
{
// above = d153 // above = d153
new byte[] { 75, 17, 22, 136, 138, 185, 32, 34, 166 }, // left = dc [75, 17, 22, 136, 138, 185, 32, 34, 166], // left = dc
new byte[] { 56, 39, 58, 133, 117, 173, 48, 53, 187 }, // left = v [56, 39, 58, 133, 117, 173, 48, 53, 187], // left = v
new byte[] { 35, 21, 12, 161, 212, 207, 20, 23, 145 }, // left = h [35, 21, 12, 161, 212, 207, 20, 23, 145], // left = h
new byte[] { 56, 29, 19, 117, 109, 181, 55, 68, 112 }, // left = d45 [56, 29, 19, 117, 109, 181, 55, 68, 112], // left = d45
new byte[] { 47, 29, 17, 153, 64, 220, 59, 51, 114 }, // left = d135 [47, 29, 17, 153, 64, 220, 59, 51, 114], // left = d135
new byte[] { 46, 16, 24, 136, 76, 147, 41, 64, 172 }, // left = d117 [46, 16, 24, 136, 76, 147, 41, 64, 172], // left = d117
new byte[] { 34, 17, 11, 108, 152, 187, 13, 15, 209 }, // left = d153 [34, 17, 11, 108, 152, 187, 13, 15, 209], // left = d153
new byte[] { 51, 24, 14, 115, 133, 209, 32, 26, 104 }, // left = d207 [51, 24, 14, 115, 133, 209, 32, 26, 104], // left = d207
new byte[] { 55, 30, 18, 122, 79, 179, 44, 88, 116 }, // left = d63 [55, 30, 18, 122, 79, 179, 44, 88, 116], // left = d63
new byte[] { 37, 49, 25, 129, 168, 164, 41, 54, 148 } // left = tm [37, 49, 25, 129, 168, 164, 41, 54, 148] // left = tm
}, ],
new[] [
{
// above = d207 // above = d207
new byte[] { 82, 22, 32, 127, 143, 213, 39, 41, 70 }, // left = dc [82, 22, 32, 127, 143, 213, 39, 41, 70], // left = dc
new byte[] { 62, 44, 61, 123, 105, 189, 48, 57, 64 }, // left = v [62, 44, 61, 123, 105, 189, 48, 57, 64], // left = v
new byte[] { 47, 25, 17, 175, 222, 220, 24, 30, 86 }, // left = h [47, 25, 17, 175, 222, 220, 24, 30, 86], // left = h
new byte[] { 68, 36, 17, 106, 102, 206, 59, 74, 74 }, // left = d45 [68, 36, 17, 106, 102, 206, 59, 74, 74], // left = d45
new byte[] { 57, 39, 23, 151, 68, 216, 55, 63, 58 }, // left = d135 [57, 39, 23, 151, 68, 216, 55, 63, 58], // left = d135
new byte[] { 49, 30, 35, 141, 70, 168, 82, 40, 115 }, // left = d117 [49, 30, 35, 141, 70, 168, 82, 40, 115], // left = d117
new byte[] { 51, 25, 15, 136, 129, 202, 38, 35, 139 }, // left = d153 [51, 25, 15, 136, 129, 202, 38, 35, 139], // left = d153
new byte[] { 68, 26, 16, 111, 141, 215, 29, 28, 28 }, // left = d207 [68, 26, 16, 111, 141, 215, 29, 28, 28], // left = d207
new byte[] { 59, 39, 19, 114, 75, 180, 77, 104, 42 }, // left = d63 [59, 39, 19, 114, 75, 180, 77, 104, 42], // left = d63
new byte[] { 40, 61, 26, 126, 152, 206, 61, 59, 93 } // left = tm [40, 61, 26, 126, 152, 206, 61, 59, 93] // left = tm
}, ],
new[] [
{
// above = d63 // above = d63
new byte[] { 78, 23, 39, 111, 117, 170, 74, 124, 94 }, // left = dc [78, 23, 39, 111, 117, 170, 74, 124, 94], // left = dc
new byte[] { 48, 34, 86, 101, 92, 146, 78, 179, 134 }, // left = v [48, 34, 86, 101, 92, 146, 78, 179, 134], // left = v
new byte[] { 47, 22, 24, 138, 187, 178, 68, 69, 59 }, // left = h [47, 22, 24, 138, 187, 178, 68, 69, 59], // left = h
new byte[] { 56, 25, 33, 105, 112, 187, 95, 177, 129 }, // left = d45 [56, 25, 33, 105, 112, 187, 95, 177, 129], // left = d45
new byte[] { 48, 31, 27, 114, 63, 183, 82, 116, 56 }, // left = d135 [48, 31, 27, 114, 63, 183, 82, 116, 56], // left = d135
new byte[] { 43, 28, 37, 121, 63, 123, 61, 192, 169 }, // left = d117 [43, 28, 37, 121, 63, 123, 61, 192, 169], // left = d117
new byte[] { 42, 17, 24, 109, 97, 177, 56, 76, 122 }, // left = d153 [42, 17, 24, 109, 97, 177, 56, 76, 122], // left = d153
new byte[] { 58, 18, 28, 105, 139, 182, 70, 92, 63 }, // left = d207 [58, 18, 28, 105, 139, 182, 70, 92, 63], // left = d207
new byte[] { 46, 23, 32, 74, 86, 150, 67, 183, 88 }, // left = d63 [46, 23, 32, 74, 86, 150, 67, 183, 88], // left = d63
new byte[] { 36, 38, 48, 92, 122, 165, 88, 137, 91 } // left = tm [36, 38, 48, 92, 122, 165, 88, 137, 91] // left = tm
}, ],
new[] [
{
// above = tm // above = tm
new byte[] { 65, 70, 60, 155, 159, 199, 61, 60, 81 }, // left = dc [65, 70, 60, 155, 159, 199, 61, 60, 81], // left = dc
new byte[] { 44, 78, 115, 132, 119, 173, 71, 112, 93 }, // left = v [44, 78, 115, 132, 119, 173, 71, 112, 93], // left = v
new byte[] { 39, 38, 21, 184, 227, 206, 42, 32, 64 }, // left = h [39, 38, 21, 184, 227, 206, 42, 32, 64], // left = h
new byte[] { 58, 47, 36, 124, 137, 193, 80, 82, 78 }, // left = d45 [58, 47, 36, 124, 137, 193, 80, 82, 78], // left = d45
new byte[] { 49, 50, 35, 144, 95, 205, 63, 78, 59 }, // left = d135 [49, 50, 35, 144, 95, 205, 63, 78, 59], // left = d135
new byte[] { 41, 53, 52, 148, 71, 142, 65, 128, 51 }, // left = d117 [41, 53, 52, 148, 71, 142, 65, 128, 51], // left = d117
new byte[] { 40, 36, 28, 143, 143, 202, 40, 55, 137 }, // left = d153 [40, 36, 28, 143, 143, 202, 40, 55, 137], // left = d153
new byte[] { 52, 34, 29, 129, 183, 227, 42, 35, 43 }, // left = d207 [52, 34, 29, 129, 183, 227, 42, 35, 43], // left = d207
new byte[] { 42, 44, 44, 104, 105, 164, 64, 130, 80 }, // left = d63 [42, 44, 44, 104, 105, 164, 64, 130, 80], // left = d63
new byte[] { 43, 81, 53, 140, 169, 204, 68, 84, 72 } // left = tm [43, 81, 53, 140, 169, 204, 68, 84, 72] // left = tm
} ]
}; ];
public static readonly byte[][] KfUvModeProb = public static readonly byte[][] KfUvModeProb =
{ [
new byte[] { 144, 11, 54, 157, 195, 130, 46, 58, 108 }, // y = dc [144, 11, 54, 157, 195, 130, 46, 58, 108], // y = dc
new byte[] { 118, 15, 123, 148, 131, 101, 44, 93, 131 }, // y = v [118, 15, 123, 148, 131, 101, 44, 93, 131], // y = v
new byte[] { 113, 12, 23, 188, 226, 142, 26, 32, 125 }, // y = h [113, 12, 23, 188, 226, 142, 26, 32, 125], // y = h
new byte[] { 120, 11, 50, 123, 163, 135, 64, 77, 103 }, // y = d45 [120, 11, 50, 123, 163, 135, 64, 77, 103], // y = d45
new byte[] { 113, 9, 36, 155, 111, 157, 32, 44, 161 }, // y = d135 [113, 9, 36, 155, 111, 157, 32, 44, 161], // y = d135
new byte[] { 116, 9, 55, 176, 76, 96, 37, 61, 149 }, // y = d117 [116, 9, 55, 176, 76, 96, 37, 61, 149], // y = d117
new byte[] { 115, 9, 28, 141, 161, 167, 21, 25, 193 }, // y = d153 [115, 9, 28, 141, 161, 167, 21, 25, 193], // y = d153
new byte[] { 120, 12, 32, 145, 195, 142, 32, 38, 86 }, // y = d207 [120, 12, 32, 145, 195, 142, 32, 38, 86], // y = d207
new byte[] { 116, 12, 64, 120, 140, 125, 49, 115, 121 }, // y = d63 [116, 12, 64, 120, 140, 125, 49, 115, 121], // y = d63
new byte[] { 102, 19, 66, 162, 182, 122, 35, 59, 128 } // y = tm [102, 19, 66, 162, 182, 122, 35, 59, 128] // y = tm
}; ];
private static readonly byte[] DefaultIfYProbs = private static readonly byte[] _defaultIfYProbs =
{ [
65, 32, 18, 144, 162, 194, 41, 51, 98, // block_size < 8x8 65, 32, 18, 144, 162, 194, 41, 51, 98, // block_size < 8x8
132, 68, 18, 165, 217, 196, 45, 40, 78, // block_size < 16x16 132, 68, 18, 165, 217, 196, 45, 40, 78, // block_size < 16x16
173, 80, 19, 176, 240, 193, 64, 35, 46, // block_size < 32x32 173, 80, 19, 176, 240, 193, 64, 35, 46, // block_size < 32x32
221, 135, 38, 194, 248, 121, 96, 85, 29 // block_size >= 32x32 221, 135, 38, 194, 248, 121, 96, 85, 29 // block_size >= 32x32
}; ];
private static readonly byte[] DefaultIfUvProbs = private static readonly byte[] _defaultIfUvProbs =
{ [
120, 7, 76, 176, 208, 126, 28, 54, 103, // y = dc 120, 7, 76, 176, 208, 126, 28, 54, 103, // y = dc
48, 12, 154, 155, 139, 90, 34, 117, 119, // y = v 48, 12, 154, 155, 139, 90, 34, 117, 119, // y = v
67, 6, 25, 204, 243, 158, 13, 21, 96, // y = h 67, 6, 25, 204, 243, 158, 13, 21, 96, // y = h
@@ -190,10 +180,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
85, 5, 32, 156, 216, 148, 19, 29, 73, // y = d207 85, 5, 32, 156, 216, 148, 19, 29, 73, // y = d207
77, 7, 64, 116, 132, 122, 37, 126, 120, // y = d63 77, 7, 64, 116, 132, 122, 37, 126, 120, // y = d63
101, 21, 107, 181, 192, 103, 19, 67, 125 // y = tm 101, 21, 107, 181, 192, 103, 19, 67, 125 // y = tm
}; ];
private static readonly byte[] DefaultPartitionProbs = private static readonly byte[] _defaultPartitionProbs =
{ [
// 8x8 . 4x4 // 8x8 . 4x4
199, 122, 141, // a/l both not split 199, 122, 141, // a/l both not split
147, 63, 159, // a split, l not split 147, 63, 159, // a split, l not split
@@ -214,10 +204,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
72, 16, 44, // a split, l not split 72, 16, 44, // a split, l not split
58, 32, 12, // l split, a not split 58, 32, 12, // l split, a not split
10, 7, 6 // a/l both split 10, 7, 6 // a/l both split
}; ];
private static readonly byte[] DefaultInterModeProbs = private static readonly byte[] _defaultInterModeProbs =
{ [
2, 173, 34, // 0 = both zero mv 2, 173, 34, // 0 = both zero mv
7, 145, 85, // 1 = one zero mv + one a predicted mv 7, 145, 85, // 1 = one zero mv + one a predicted mv
7, 166, 63, // 2 = two predicted mvs 7, 166, 63, // 2 = two predicted mvs
@@ -225,120 +215,120 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
8, 64, 46, // 4 = two new mvs 8, 64, 46, // 4 = two new mvs
17, 81, 31, // 5 = one intra neighbour + x 17, 81, 31, // 5 = one intra neighbour + x
25, 29, 30 // 6 = two intra neighbours 25, 29, 30 // 6 = two intra neighbours
}; ];
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */ /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */
public static readonly sbyte[] IntraModeTree = public static readonly sbyte[] IntraModeTree =
{ [
-(int)PredictionMode.DcPred, 2, /* 0 = DC_NODE */ -(int)PredictionMode.TmPred, 4, /* 1 = TM_NODE */ -(int)PredictionMode.DcPred, 2, /* 0 = DC_NODE */ -(int)PredictionMode.TmPred, 4, /* 1 = TM_NODE */
-(int)PredictionMode.VPred, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -(int)PredictionMode.HPred, -(int)PredictionMode.VPred, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -(int)PredictionMode.HPred,
10, /* 4 = H_NODE */ -(int)PredictionMode.D135Pred, -(int)PredictionMode.D117Pred, /* 5 = D135_NODE */ 10, /* 4 = H_NODE */ -(int)PredictionMode.D135Pred, -(int)PredictionMode.D117Pred, /* 5 = D135_NODE */
-(int)PredictionMode.D45Pred, 14, /* 6 = D45_NODE */ -(int)PredictionMode.D63Pred, -(int)PredictionMode.D45Pred, 14, /* 6 = D45_NODE */ -(int)PredictionMode.D63Pred,
16, /* 7 = D63_NODE */ -(int)PredictionMode.D153Pred, -(int)PredictionMode.D207Pred /* 8 = D153_NODE */ 16, /* 7 = D63_NODE */ -(int)PredictionMode.D153Pred, -(int)PredictionMode.D207Pred /* 8 = D153_NODE */
}; ];
public static readonly sbyte[] InterModeTree = public static readonly sbyte[] InterModeTree =
{ [
-((int)PredictionMode.ZeroMv - (int)PredictionMode.NearestMv), 2, -((int)PredictionMode.ZeroMv - (int)PredictionMode.NearestMv), 2,
-((int)PredictionMode.NearestMv - (int)PredictionMode.NearestMv), 4, -((int)PredictionMode.NearestMv - (int)PredictionMode.NearestMv), 4,
-((int)PredictionMode.NearMv - (int)PredictionMode.NearestMv), -((int)PredictionMode.NearMv - (int)PredictionMode.NearestMv),
-((int)PredictionMode.NewMv - (int)PredictionMode.NearestMv) -((int)PredictionMode.NewMv - (int)PredictionMode.NearestMv)
}; ];
public static readonly sbyte[] PartitionTree = public static readonly sbyte[] PartitionTree =
{ [
-(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4, -(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4,
-(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit -(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit
}; ];
public static readonly sbyte[] SwitchableInterpTree = public static readonly sbyte[] SwitchableInterpTree =
{ [
-Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp -Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp
}; ];
private static readonly byte[] DefaultIntraInterP = { 9, 102, 187, 225 }; private static readonly byte[] _defaultIntraInterP = [9, 102, 187, 225];
private static readonly byte[] DefaultCompInterP = { 239, 183, 119, 96, 41 }; private static readonly byte[] _defaultCompInterP = [239, 183, 119, 96, 41];
private static readonly byte[] DefaultCompRefP = { 50, 126, 123, 221, 226 }; private static readonly byte[] _defaultCompRefP = [50, 126, 123, 221, 226];
private static readonly byte[] DefaultSingleRefP = { 33, 16, 77, 74, 142, 142, 172, 170, 238, 247 }; private static readonly byte[] _defaultSingleRefP = [33, 16, 77, 74, 142, 142, 172, 170, 238, 247];
private static readonly byte[] DefaultTxProbs = { 3, 136, 37, 5, 52, 13, 20, 152, 15, 101, 100, 66 }; private static readonly byte[] _defaultTxProbs = [3, 136, 37, 5, 52, 13, 20, 152, 15, 101, 100, 66];
static EntropyMode() static EntropyMode()
{ {
byte[][] KfPartitionProbs = byte[][] kfPartitionProbs =
{ [
// 8x8 . 4x4 // 8x8 . 4x4
new byte[] { 158, 97, 94 }, // a/l both not split [158, 97, 94], // a/l both not split
new byte[] { 93, 24, 99 }, // a split, l not split [93, 24, 99], // a split, l not split
new byte[] { 85, 119, 44 }, // l split, a not split [85, 119, 44], // l split, a not split
new byte[] { 62, 59, 67 }, // a/l both split [62, 59, 67], // a/l both split
// 16x16 . 8x8 // 16x16 . 8x8
new byte[] { 149, 53, 53 }, // a/l both not split [149, 53, 53], // a/l both not split
new byte[] { 94, 20, 48 }, // a split, l not split [94, 20, 48], // a split, l not split
new byte[] { 83, 53, 24 }, // l split, a not split [83, 53, 24], // l split, a not split
new byte[] { 52, 18, 18 }, // a/l both split [52, 18, 18], // a/l both split
// 32x32 . 16x16 // 32x32 . 16x16
new byte[] { 150, 40, 39 }, // a/l both not split [150, 40, 39], // a/l both not split
new byte[] { 78, 12, 26 }, // a split, l not split [78, 12, 26], // a split, l not split
new byte[] { 67, 33, 11 }, // l split, a not split [67, 33, 11], // l split, a not split
new byte[] { 24, 7, 5 }, // a/l both split [24, 7, 5], // a/l both split
// 64x64 . 32x32 // 64x64 . 32x32
new byte[] { 174, 35, 49 }, // a/l both not split [174, 35, 49], // a/l both not split
new byte[] { 68, 11, 27 }, // a split, l not split [68, 11, 27], // a split, l not split
new byte[] { 57, 15, 9 }, // l split, a not split [57, 15, 9], // l split, a not split
new byte[] { 12, 3, 3 } // a/l both split [12, 3, 3] // a/l both split
}; ];
} }
private static readonly byte[] DefaultSkipProbs = { 192, 128, 64 }; private static readonly byte[] _defaultSkipProbs = [192, 128, 64];
private static readonly byte[] DefaultSwitchableInterpProb = { 235, 162, 36, 255, 34, 3, 149, 144 }; private static readonly byte[] _defaultSwitchableInterpProb = [235, 162, 36, 255, 34, 3, 149, 144];
private static void InitModeProbs(ref Vp9EntropyProbs fc) private static void InitModeProbs(ref Vp9EntropyProbs fc)
{ {
Entropy.CopyProbs(ref fc.UvModeProb, DefaultIfUvProbs); Entropy.CopyProbs(ref fc.UvModeProb, _defaultIfUvProbs);
Entropy.CopyProbs(ref fc.YModeProb, DefaultIfYProbs); Entropy.CopyProbs(ref fc.YModeProb, _defaultIfYProbs);
Entropy.CopyProbs(ref fc.SwitchableInterpProb, DefaultSwitchableInterpProb); Entropy.CopyProbs(ref fc.SwitchableInterpProb, _defaultSwitchableInterpProb);
Entropy.CopyProbs(ref fc.PartitionProb, DefaultPartitionProbs); Entropy.CopyProbs(ref fc.PartitionProb, _defaultPartitionProbs);
Entropy.CopyProbs(ref fc.IntraInterProb, DefaultIntraInterP); Entropy.CopyProbs(ref fc.IntraInterProb, _defaultIntraInterP);
Entropy.CopyProbs(ref fc.CompInterProb, DefaultCompInterP); Entropy.CopyProbs(ref fc.CompInterProb, _defaultCompInterP);
Entropy.CopyProbs(ref fc.CompRefProb, DefaultCompRefP); Entropy.CopyProbs(ref fc.CompRefProb, _defaultCompRefP);
Entropy.CopyProbs(ref fc.SingleRefProb, DefaultSingleRefP); Entropy.CopyProbs(ref fc.SingleRefProb, _defaultSingleRefP);
Entropy.CopyProbs(ref fc.Tx32x32Prob, DefaultTxProbs.AsSpan().Slice(0, 6)); Entropy.CopyProbs(ref fc.Tx32x32Prob, _defaultTxProbs.AsSpan().Slice(0, 6));
Entropy.CopyProbs(ref fc.Tx16x16Prob, DefaultTxProbs.AsSpan().Slice(6, 4)); Entropy.CopyProbs(ref fc.Tx16x16Prob, _defaultTxProbs.AsSpan().Slice(6, 4));
Entropy.CopyProbs(ref fc.Tx8x8Prob, DefaultTxProbs.AsSpan().Slice(10, 2)); Entropy.CopyProbs(ref fc.Tx8x8Prob, _defaultTxProbs.AsSpan().Slice(10, 2));
Entropy.CopyProbs(ref fc.SkipProb, DefaultSkipProbs); Entropy.CopyProbs(ref fc.SkipProb, _defaultSkipProbs);
Entropy.CopyProbs(ref fc.InterModeProb, DefaultInterModeProbs); Entropy.CopyProbs(ref fc.InterModeProb, _defaultInterModeProbs);
} }
internal static void TxCountsToBranchCounts32x32(ReadOnlySpan<uint> txCount32x32P, internal static void TxCountsToBranchCounts32X32(ReadOnlySpan<uint> txCount32X32P,
ref Array3<Array2<uint>> ct32x32P) ref Array3<Array2<uint>> ct32X32P)
{ {
ct32x32P[0][0] = txCount32x32P[(int)TxSize.Tx4x4]; ct32X32P[0][0] = txCount32X32P[(int)TxSize.Tx4X4];
ct32x32P[0][1] = txCount32x32P[(int)TxSize.Tx8x8] + txCount32x32P[(int)TxSize.Tx16x16] + ct32X32P[0][1] = txCount32X32P[(int)TxSize.Tx8X8] + txCount32X32P[(int)TxSize.Tx16X16] +
txCount32x32P[(int)TxSize.Tx32x32]; txCount32X32P[(int)TxSize.Tx32X32];
ct32x32P[1][0] = txCount32x32P[(int)TxSize.Tx8x8]; ct32X32P[1][0] = txCount32X32P[(int)TxSize.Tx8X8];
ct32x32P[1][1] = txCount32x32P[(int)TxSize.Tx16x16] + txCount32x32P[(int)TxSize.Tx32x32]; ct32X32P[1][1] = txCount32X32P[(int)TxSize.Tx16X16] + txCount32X32P[(int)TxSize.Tx32X32];
ct32x32P[2][0] = txCount32x32P[(int)TxSize.Tx16x16]; ct32X32P[2][0] = txCount32X32P[(int)TxSize.Tx16X16];
ct32x32P[2][1] = txCount32x32P[(int)TxSize.Tx32x32]; ct32X32P[2][1] = txCount32X32P[(int)TxSize.Tx32X32];
} }
internal static void TxCountsToBranchCounts16x16(ReadOnlySpan<uint> txCount16x16P, internal static void TxCountsToBranchCounts16X16(ReadOnlySpan<uint> txCount16X16P,
ref Array2<Array2<uint>> ct16x16P) ref Array2<Array2<uint>> ct16X16P)
{ {
ct16x16P[0][0] = txCount16x16P[(int)TxSize.Tx4x4]; ct16X16P[0][0] = txCount16X16P[(int)TxSize.Tx4X4];
ct16x16P[0][1] = txCount16x16P[(int)TxSize.Tx8x8] + txCount16x16P[(int)TxSize.Tx16x16]; ct16X16P[0][1] = txCount16X16P[(int)TxSize.Tx8X8] + txCount16X16P[(int)TxSize.Tx16X16];
ct16x16P[1][0] = txCount16x16P[(int)TxSize.Tx8x8]; ct16X16P[1][0] = txCount16X16P[(int)TxSize.Tx8X8];
ct16x16P[1][1] = txCount16x16P[(int)TxSize.Tx16x16]; ct16X16P[1][1] = txCount16X16P[(int)TxSize.Tx16X16];
} }
internal static void TxCountsToBranchCounts8x8(ReadOnlySpan<uint> txCount8x8P, internal static void TxCountsToBranchCounts8X8(ReadOnlySpan<uint> txCount8X8P,
ref Array1<Array2<uint>> ct8x8P) ref Array1<Array2<uint>> ct8X8P)
{ {
ct8x8P[0][0] = txCount8x8P[(int)TxSize.Tx4x4]; ct8X8P[0][0] = txCount8X8P[(int)TxSize.Tx4X4];
ct8x8P[0][1] = txCount8x8P[(int)TxSize.Tx8x8]; ct8X8P[0][1] = txCount8X8P[(int)TxSize.Tx8X8];
} }
public static unsafe void SetupPastIndependence(ref Vp9Common cm) public static unsafe void SetupPastIndependence(ref Vp9Common cm)

View File

@@ -14,22 +14,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public static readonly sbyte[] JointTree = public static readonly sbyte[] JointTree =
{ [
-(sbyte)MvJointType.Zero, 2, -(sbyte)MvJointType.Hnzvz, 4, -(sbyte)MvJointType.Zero, 2, -(sbyte)MvJointType.Hnzvz, 4,
-(sbyte)MvJointType.Hzvnz, -(sbyte)MvJointType.Hnzvnz -(sbyte)MvJointType.Hzvnz, -(sbyte)MvJointType.Hnzvnz
}; ];
public static readonly sbyte[] ClassTree = public static readonly sbyte[] ClassTree =
{ [
-(sbyte)MvClassType.Class0, 2, -(sbyte)MvClassType.Class1, 4, 6, 8, -(sbyte)MvClassType.Class2, -(sbyte)MvClassType.Class0, 2, -(sbyte)MvClassType.Class1, 4, 6, 8, -(sbyte)MvClassType.Class2,
-(sbyte)MvClassType.Class3, 10, 12, -(sbyte)MvClassType.Class4, -(sbyte)MvClassType.Class5, -(sbyte)MvClassType.Class3, 10, 12, -(sbyte)MvClassType.Class4, -(sbyte)MvClassType.Class5,
-(sbyte)MvClassType.Class6, 14, 16, 18, -(sbyte)MvClassType.Class7, -(sbyte)MvClassType.Class8, -(sbyte)MvClassType.Class6, 14, 16, 18, -(sbyte)MvClassType.Class7, -(sbyte)MvClassType.Class8,
-(sbyte)MvClassType.Class9, -(sbyte)MvClassType.Class10 -(sbyte)MvClassType.Class9, -(sbyte)MvClassType.Class10
}; ];
public static readonly sbyte[] Class0Tree = { -0, -1 }; public static readonly sbyte[] Class0Tree = [-0, -1];
public static readonly sbyte[] FpTree = { -0, 2, -1, 4, -2, -3 }; public static readonly sbyte[] FpTree = [-0, 2, -1, 4, -2, -3];
private static bool JointVertical(MvJointType type) private static bool JointVertical(MvJointType type)
{ {
@@ -41,8 +41,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return type == MvJointType.Hnzvz || type == MvJointType.Hnzvnz; return type == MvJointType.Hnzvz || type == MvJointType.Hnzvnz;
} }
private static readonly byte[] LogInBase2 = private static readonly byte[] _logInBase2 =
{ [
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
@@ -73,7 +73,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 10 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
}; ];
private static int ClassBase(MvClassType c) private static int ClassBase(MvClassType c)
{ {
@@ -84,7 +84,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
MvClassType c = z >= Class0Size * 4096 MvClassType c = z >= Class0Size * 4096
? MvClassType.Class10 ? MvClassType.Class10
: (MvClassType)LogInBase2[z >> 3]; : (MvClassType)_logInBase2[z >> 3];
if (!offset.IsNull) if (!offset.IsNull)
{ {
offset.Value = z - ClassBase(c); offset.Value = z - ClassBase(c);
@@ -95,18 +95,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
private static void IncComponent(int v, ref Vp9BackwardUpdates compCounts, int compIndex, int incr, int usehp) private static void IncComponent(int v, ref Vp9BackwardUpdates compCounts, int compIndex, int incr, int usehp)
{ {
int s, z, c, o = 0, d, e, f; int o = 0;
Debug.Assert(v != 0); /* should not be zero */ Debug.Assert(v != 0); /* should not be zero */
s = v < 0 ? 1 : 0; int s = v < 0 ? 1 : 0;
compCounts.Sign[compIndex][s] += (uint)incr; compCounts.Sign[compIndex][s] += (uint)incr;
z = (s != 0 ? -v : v) - 1; /* magnitude - 1 */ int z = (s != 0 ? -v : v) - 1 /* magnitude - 1 */;
c = (int)GetClass(z, new Ptr<int>(ref o)); int c = (int)GetClass(z, new Ptr<int>(ref o));
compCounts.Classes[compIndex][c] += (uint)incr; compCounts.Classes[compIndex][c] += (uint)incr;
d = o >> 3; /* int mv data */ int d = o >> 3 /* int mv data */;
f = (o >> 1) & 3; /* fractional pel mv data */ int f = (o >> 1) & 3 /* fractional pel mv data */;
e = o & 1; /* high precision mv data */ int e = o & 1 /* high precision mv data */;
if (c == (int)MvClassType.Class0) if (c == (int)MvClassType.Class0)
{ {

View File

@@ -21,48 +21,47 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref VpxCodecFrameBuffer fb) ref VpxCodecFrameBuffer fb)
{ {
int i; int i;
Ptr<InternalFrameBufferList> intFbList = cbPriv; if (cbPriv.IsNull)
if (intFbList.IsNull)
{ {
return -1; return -1;
} }
// Find a free frame buffer. // Find a free frame buffer.
for (i = 0; i < intFbList.Value.IntFb.Length; ++i) for (i = 0; i < cbPriv.Value.IntFb.Length; ++i)
{ {
if (!intFbList.Value.IntFb[i].InUse) if (!cbPriv.Value.IntFb[i].InUse)
{ {
break; break;
} }
} }
if (i == intFbList.Value.IntFb.Length) if (i == cbPriv.Value.IntFb.Length)
{ {
return -1; return -1;
} }
if ((ulong)intFbList.Value.IntFb[i].Data.Length < minSize) if ((ulong)cbPriv.Value.IntFb[i].Data.Length < minSize)
{ {
if (!intFbList.Value.IntFb[i].Data.IsNull) if (!cbPriv.Value.IntFb[i].Data.IsNull)
{ {
allocator.Free(intFbList.Value.IntFb[i].Data); allocator.Free(cbPriv.Value.IntFb[i].Data);
} }
// The data must be zeroed to fix a valgrind error from the C loop filter // The data must be zeroed to fix a valgrind error from the C loop filter
// due to access uninitialized memory in frame border. It could be // due to access uninitialized memory in frame border. It could be
// skipped if border were totally removed. // skipped if border were totally removed.
intFbList.Value.IntFb[i].Data = allocator.Allocate<byte>((int)minSize); cbPriv.Value.IntFb[i].Data = allocator.Allocate<byte>((int)minSize);
if (intFbList.Value.IntFb[i].Data.IsNull) if (cbPriv.Value.IntFb[i].Data.IsNull)
{ {
return -1; return -1;
} }
} }
fb.Data = intFbList.Value.IntFb[i].Data; fb.Data = cbPriv.Value.IntFb[i].Data;
intFbList.Value.IntFb[i].InUse = true; cbPriv.Value.IntFb[i].InUse = true;
// Set the frame buffer's private data to point at the internal frame buffer. // Set the frame buffer's private data to point at the internal frame buffer.
fb.Priv = new Ptr<InternalFrameBuffer>(ref intFbList.Value.IntFb[i]); fb.Priv = new Ptr<InternalFrameBuffer>(ref cbPriv.Value.IntFb[i]);
return 0; return 0;
} }

View File

@@ -35,15 +35,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly Transform2D[] Iht4 = private static readonly Transform2D[] _iht4 =
{ [
new(Idct4, Idct4), // DCT_DCT = 0 new(Idct4, Idct4), // DCT_DCT = 0
new(Iadst4, Idct4), // ADST_DCT = 1 new(Iadst4, Idct4), // ADST_DCT = 1
new(Idct4, Iadst4), // DCT_ADST = 2 new(Idct4, Iadst4), // DCT_ADST = 2
new(Iadst4, Iadst4) // ADST_ADST = 3 new(Iadst4, Iadst4) // ADST_ADST = 3
}; ];
public static void Iht4x416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType) public static void Iht4X416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -53,7 +53,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Inverse transform row vectors // Inverse transform row vectors
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
Iht4[txType].Rows(input, outptr); _iht4[txType].Rows(input, outptr);
input = input.Slice(4); input = input.Slice(4);
outptr = outptr.Slice(4); outptr = outptr.Slice(4);
} }
@@ -66,7 +66,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tempIn[j] = output[(j * 4) + i]; tempIn[j] = output[(j * 4) + i];
} }
Iht4[txType].Cols(tempIn, tempOut); _iht4[txType].Cols(tempIn, tempOut);
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
{ {
dest[(j * stride) + i] = dest[(j * stride) + i] =
@@ -75,21 +75,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly Transform2D[] Iht8 = private static readonly Transform2D[] _iht8 =
{ [
new(Idct8, Idct8), // DCT_DCT = 0 new(Idct8, Idct8), // DCT_DCT = 0
new(Iadst8, Idct8), // ADST_DCT = 1 new(Iadst8, Idct8), // ADST_DCT = 1
new(Idct8, Iadst8), // DCT_ADST = 2 new(Idct8, Iadst8), // DCT_ADST = 2
new(Iadst8, Iadst8) // ADST_ADST = 3 new(Iadst8, Iadst8) // ADST_ADST = 3
}; ];
public static void Iht8x864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType) public static void Iht8X864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[8]; Span<int> tempIn = stackalloc int[8];
Span<int> tempOut = stackalloc int[8]; Span<int> tempOut = stackalloc int[8];
Transform2D ht = Iht8[txType]; Transform2D ht = _iht8[txType];
// Inverse transform row vectors // Inverse transform row vectors
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
@@ -116,21 +116,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly Transform2D[] Iht16 = private static readonly Transform2D[] _iht16 =
{ [
new(Idct16, Idct16), // DCT_DCT = 0 new(Idct16, Idct16), // DCT_DCT = 0
new(Iadst16, Idct16), // ADST_DCT = 1 new(Iadst16, Idct16), // ADST_DCT = 1
new(Idct16, Iadst16), // DCT_ADST = 2 new(Idct16, Iadst16), // DCT_ADST = 2
new(Iadst16, Iadst16) // ADST_ADST = 3 new(Iadst16, Iadst16) // ADST_ADST = 3
}; ];
public static void Iht16x16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType) public static void Iht16X16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[16]; Span<int> tempIn = stackalloc int[16];
Span<int> tempOut = stackalloc int[16]; Span<int> tempOut = stackalloc int[16];
Transform2D ht = Iht16[txType]; Transform2D ht = _iht16[txType];
// Rows // Rows
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
@@ -158,31 +158,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Idct // Idct
public static void Idct4x4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct4X4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (eob > 1) if (eob > 1)
{ {
Idct4x416Add(input, dest, stride); Idct4X416Add(input, dest, stride);
} }
else else
{ {
Idct4x41Add(input, dest, stride); Idct4X41Add(input, dest, stride);
} }
} }
public static void Iwht4x4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Iwht4X4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (eob > 1) if (eob > 1)
{ {
Iwht4x416Add(input, dest, stride); Iwht4X416Add(input, dest, stride);
} }
else else
{ {
Iwht4x41Add(input, dest, stride); Iwht4X41Add(input, dest, stride);
} }
} }
public static void Idct8x8Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct8X8Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
// If dc is 1, then input[0] is the reconstructed value, do not need // If dc is 1, then input[0] is the reconstructed value, do not need
// dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1. // dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1.
@@ -192,109 +192,109 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
if (eob == 1) if (eob == 1)
{ {
// DC only DCT coefficient // DC only DCT coefficient
Idct8x81Add(input, dest, stride); Idct8X81Add(input, dest, stride);
} }
else if (eob <= 12) else if (eob <= 12)
{ {
Idct8x812Add(input, dest, stride); Idct8X812Add(input, dest, stride);
} }
else else
{ {
Idct8x864Add(input, dest, stride); Idct8X864Add(input, dest, stride);
} }
} }
public static void Idct16x16Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct16X16Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
/* The calculation can be simplified if there are not many non-zero dct /* The calculation can be simplified if there are not many non-zero dct
* coefficients. Use eobs to separate different cases. */ * coefficients. Use eobs to separate different cases. */
if (eob == 1) /* DC only DCT coefficient. */ if (eob == 1) /* DC only DCT coefficient. */
{ {
Idct16x161Add(input, dest, stride); Idct16X161Add(input, dest, stride);
} }
else if (eob <= 10) else if (eob <= 10)
{ {
Idct16x1610Add(input, dest, stride); Idct16X1610Add(input, dest, stride);
} }
else if (eob <= 38) else if (eob <= 38)
{ {
Idct16x1638Add(input, dest, stride); Idct16X1638Add(input, dest, stride);
} }
else else
{ {
Idct16x16256Add(input, dest, stride); Idct16X16256Add(input, dest, stride);
} }
} }
public static void Idct32x32Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct32X32Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (eob == 1) if (eob == 1)
{ {
Idct32x321Add(input, dest, stride); Idct32X321Add(input, dest, stride);
} }
else if (eob <= 34) else if (eob <= 34)
{ {
// Non-zero coeff only in upper-left 8x8 // Non-zero coeff only in upper-left 8x8
Idct32x3234Add(input, dest, stride); Idct32X3234Add(input, dest, stride);
} }
else if (eob <= 135) else if (eob <= 135)
{ {
// Non-zero coeff only in upper-left 16x16 // Non-zero coeff only in upper-left 16x16
Idct32x32135Add(input, dest, stride); Idct32X32135Add(input, dest, stride);
} }
else else
{ {
Idct32x321024Add(input, dest, stride); Idct32X321024Add(input, dest, stride);
} }
} }
// Iht // Iht
public static void Iht4x4Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Iht4X4Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
Idct4x4Add(input, dest, stride, eob); Idct4X4Add(input, dest, stride, eob);
} }
else else
{ {
Iht4x416Add(input, dest, stride, (int)txType); Iht4X416Add(input, dest, stride, (int)txType);
} }
} }
public static void Iht8x8Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Iht8X8Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
Idct8x8Add(input, dest, stride, eob); Idct8X8Add(input, dest, stride, eob);
} }
else else
{ {
Iht8x864Add(input, dest, stride, (int)txType); Iht8X864Add(input, dest, stride, (int)txType);
} }
} }
public static void Iht16x16Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, public static void Iht16X16Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest,
int stride, int eob) int stride, int eob)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
Idct16x16Add(input, dest, stride, eob); Idct16X16Add(input, dest, stride, eob);
} }
else else
{ {
Iht16x16256Add(input, dest, stride, (int)txType); Iht16X16256Add(input, dest, stride, (int)txType);
} }
} }
private static readonly HighbdTransform2D[] HighbdIht4 = private static readonly HighbdTransform2D[] _highbdIht4 =
{ [
new(HighbdIdct4, HighbdIdct4), // DCT_DCT = 0 new(HighbdIdct4, HighbdIdct4), // DCT_DCT = 0
new(HighbdIadst4, HighbdIdct4), // ADST_DCT = 1 new(HighbdIadst4, HighbdIdct4), // ADST_DCT = 1
new(HighbdIdct4, HighbdIadst4), // DCT_ADST = 2 new(HighbdIdct4, HighbdIadst4), // DCT_ADST = 2
new(HighbdIadst4, HighbdIadst4) // ADST_ADST = 3 new(HighbdIadst4, HighbdIadst4) // ADST_ADST = 3
}; ];
public static void HighbdIht4x416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd) public static void HighbdIht4X416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -304,7 +304,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Inverse transform row vectors. // Inverse transform row vectors.
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
HighbdIht4[txType].Rows(input, outptr, bd); _highbdIht4[txType].Rows(input, outptr, bd);
input = input.Slice(4); input = input.Slice(4);
outptr = outptr.Slice(4); outptr = outptr.Slice(4);
} }
@@ -317,7 +317,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tempIn[j] = output[(j * 4) + i]; tempIn[j] = output[(j * 4) + i];
} }
HighbdIht4[txType].Cols(tempIn, tempOut, bd); _highbdIht4[txType].Cols(tempIn, tempOut, bd);
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
{ {
dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i],
@@ -326,21 +326,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly HighbdTransform2D[] HighIht8 = private static readonly HighbdTransform2D[] _highIht8 =
{ [
new(HighbdIdct8, HighbdIdct8), // DCT_DCT = 0 new(HighbdIdct8, HighbdIdct8), // DCT_DCT = 0
new(HighbdIadst8, HighbdIdct8), // ADST_DCT = 1 new(HighbdIadst8, HighbdIdct8), // ADST_DCT = 1
new(HighbdIdct8, HighbdIadst8), // DCT_ADST = 2 new(HighbdIdct8, HighbdIadst8), // DCT_ADST = 2
new(HighbdIadst8, HighbdIadst8) // ADST_ADST = 3 new(HighbdIadst8, HighbdIadst8) // ADST_ADST = 3
}; ];
public static void HighbdIht8x864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd) public static void HighbdIht8X864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[8]; Span<int> tempIn = stackalloc int[8];
Span<int> tempOut = stackalloc int[8]; Span<int> tempOut = stackalloc int[8];
HighbdTransform2D ht = HighIht8[txType]; HighbdTransform2D ht = _highIht8[txType];
// Inverse transform row vectors. // Inverse transform row vectors.
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
@@ -367,22 +367,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly HighbdTransform2D[] HighIht16 = private static readonly HighbdTransform2D[] _highIht16 =
{ [
new(HighbdIdct16, HighbdIdct16), // DCT_DCT = 0 new(HighbdIdct16, HighbdIdct16), // DCT_DCT = 0
new(HighbdIadst16, HighbdIdct16), // ADST_DCT = 1 new(HighbdIadst16, HighbdIdct16), // ADST_DCT = 1
new(HighbdIdct16, HighbdIadst16), // DCT_ADST = 2 new(HighbdIdct16, HighbdIadst16), // DCT_ADST = 2
new(HighbdIadst16, HighbdIadst16) // ADST_ADST = 3 new(HighbdIadst16, HighbdIadst16) // ADST_ADST = 3
}; ];
public static void HighbdIht16x16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, public static void HighbdIht16X16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType,
int bd) int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[16]; Span<int> tempIn = stackalloc int[16];
Span<int> tempOut = stackalloc int[16]; Span<int> tempOut = stackalloc int[16];
HighbdTransform2D ht = HighIht16[txType]; HighbdTransform2D ht = _highIht16[txType];
// Rows // Rows
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
@@ -410,31 +410,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Idct // Idct
public static void HighbdIdct4x4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct4X4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
if (eob > 1) if (eob > 1)
{ {
HighbdIdct4x416Add(input, dest, stride, bd); HighbdIdct4X416Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct4x41Add(input, dest, stride, bd); HighbdIdct4X41Add(input, dest, stride, bd);
} }
} }
public static void HighbdIwht4x4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIwht4X4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
if (eob > 1) if (eob > 1)
{ {
HighbdIwht4x416Add(input, dest, stride, bd); HighbdIwht4X416Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIwht4x41Add(input, dest, stride, bd); HighbdIwht4X41Add(input, dest, stride, bd);
} }
} }
public static void HighbdIdct8x8Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct8X8Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
// If dc is 1, then input[0] is the reconstructed value, do not need // If dc is 1, then input[0] is the reconstructed value, do not need
// dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1. // dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1.
@@ -444,99 +444,99 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// DC only DCT coefficient // DC only DCT coefficient
if (eob == 1) if (eob == 1)
{ {
VpxHighbdidct8x81AddC(input, dest, stride, bd); VpxHighbdidct8X81AddC(input, dest, stride, bd);
} }
else if (eob <= 12) else if (eob <= 12)
{ {
HighbdIdct8x812Add(input, dest, stride, bd); HighbdIdct8X812Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct8x864Add(input, dest, stride, bd); HighbdIdct8X864Add(input, dest, stride, bd);
} }
} }
public static void HighbdIdct16x16Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct16X16Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
// The calculation can be simplified if there are not many non-zero dct // The calculation can be simplified if there are not many non-zero dct
// coefficients. Use eobs to separate different cases. // coefficients. Use eobs to separate different cases.
// DC only DCT coefficient. // DC only DCT coefficient.
if (eob == 1) if (eob == 1)
{ {
HighbdIdct16x161Add(input, dest, stride, bd); HighbdIdct16X161Add(input, dest, stride, bd);
} }
else if (eob <= 10) else if (eob <= 10)
{ {
HighbdIdct16x1610Add(input, dest, stride, bd); HighbdIdct16X1610Add(input, dest, stride, bd);
} }
else if (eob <= 38) else if (eob <= 38)
{ {
HighbdIdct16x1638Add(input, dest, stride, bd); HighbdIdct16X1638Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct16x16256Add(input, dest, stride, bd); HighbdIdct16X16256Add(input, dest, stride, bd);
} }
} }
public static void HighbdIdct32x32Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct32X32Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
// Non-zero coeff only in upper-left 8x8 // Non-zero coeff only in upper-left 8x8
if (eob == 1) if (eob == 1)
{ {
HighbdIdct32x321Add(input, dest, stride, bd); HighbdIdct32X321Add(input, dest, stride, bd);
} }
else if (eob <= 34) else if (eob <= 34)
{ {
HighbdIdct32x3234Add(input, dest, stride, bd); HighbdIdct32X3234Add(input, dest, stride, bd);
} }
else if (eob <= 135) else if (eob <= 135)
{ {
HighbdIdct32x32135Add(input, dest, stride, bd); HighbdIdct32X32135Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct32x321024Add(input, dest, stride, bd); HighbdIdct32X321024Add(input, dest, stride, bd);
} }
} }
// Iht // Iht
public static void HighbdIht4x4Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride, public static void HighbdIht4X4Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride,
int eob, int bd) int eob, int bd)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
HighbdIdct4x4Add(input, dest, stride, eob, bd); HighbdIdct4X4Add(input, dest, stride, eob, bd);
} }
else else
{ {
HighbdIht4x416Add(input, dest, stride, (int)txType, bd); HighbdIht4X416Add(input, dest, stride, (int)txType, bd);
} }
} }
public static void HighbdIht8x8Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride, public static void HighbdIht8X8Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride,
int eob, int bd) int eob, int bd)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
HighbdIdct8x8Add(input, dest, stride, eob, bd); HighbdIdct8X8Add(input, dest, stride, eob, bd);
} }
else else
{ {
HighbdIht8x864Add(input, dest, stride, (int)txType, bd); HighbdIht8X864Add(input, dest, stride, (int)txType, bd);
} }
} }
public static void HighbdIht16x16Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride, public static void HighbdIht16X16Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride,
int eob, int bd) int eob, int bd)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
HighbdIdct16x16Add(input, dest, stride, eob, bd); HighbdIdct16X16Add(input, dest, stride, eob, bd);
} }
else else
{ {
HighbdIht16x16256Add(input, dest, stride, (int)txType, bd); HighbdIht16X16256Add(input, dest, stride, (int)txType, bd);
} }
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -46,10 +46,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT;
private static readonly uint[] CountToUpdateFactor = private static readonly uint[] _countToUpdateFactor =
{ [
0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128
}; ];
private const int ModeMvCountSat = 20; private const int ModeMvCountSat = 20;
@@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
uint count = Math.Min(den, ModeMvCountSat); uint count = Math.Min(den, ModeMvCountSat);
uint factor = CountToUpdateFactor[(int)count]; uint factor = _countToUpdateFactor[(int)count];
byte prob = GetProb(ct[0], den); byte prob = GetProb(ct[0], den);
return WeightedProb(preProb, prob, (int)factor); return WeightedProb(preProb, prob, (int)factor);
} }

View File

@@ -8,8 +8,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int MaxQ = 255; public const int MaxQ = 255;
public const int QindexBits = 8; public const int QindexBits = 8;
private static readonly short[] DcQlookup = private static readonly short[] _dcQlookup =
{ [
4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29,
30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51,
52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72,
@@ -22,10 +22,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590, 602, 614, 626, 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590, 602, 614, 626,
640, 654, 668, 684, 700, 717, 736, 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 640, 654, 668, 684, 700, 717, 736, 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098,
1139, 1184, 1232, 1282, 1336 1139, 1184, 1232, 1282, 1336
}; ];
private static readonly short[] DcQlookup10 = private static readonly short[] _dcQlookup10 =
{ [
4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82, 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82,
86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163, 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163,
166, 170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 233, 237, 241, 166, 170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 233, 237, 241,
@@ -39,10 +39,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 2123, 2159, 1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 2123, 2159,
2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102, 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102,
3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347 3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347
}; ];
private static readonly short[] DcQlookup12 = private static readonly short[] _dcQlookup12 =
{ [
4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 251, 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 251,
266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580, 266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580,
596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 768, 783, 798, 814, 829, 844, 859, 874, 889, 904,
@@ -58,10 +58,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
8214, 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245, 10465, 10702, 10946, 8214, 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245, 10465, 10702, 10946,
11210, 11482, 11776, 12081, 12409, 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, 11210, 11482, 11776, 12081, 12409, 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943,
17575, 18237, 18949, 19718, 20521, 21387 17575, 18237, 18949, 19718, 20521, 21387
}; ];
private static readonly short[] AcQlookup = private static readonly short[] _acQlookup =
{ [
4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
@@ -74,10 +74,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046, 729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046,
1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451,
1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828
}; ];
private static readonly short[] AcQlookup10 = private static readonly short[] _acQlookup10 =
{ [
4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92, 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92,
96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186, 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186,
190, 195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 271, 275, 280, 190, 195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 271, 275, 280,
@@ -92,10 +92,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972, 3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972,
5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768, 6900, 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768, 6900,
7036, 7172, 7312 7036, 7172, 7312
}; ];
private static readonly short[] AcQlookup12 = private static readonly short[] _acQlookup12 =
{ [
4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 280, 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 280,
297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660, 297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660,
679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 884, 902, 920, 939, 957, 976, 994, 1012, 1030, 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 884, 902, 920, 939, 957, 976, 994, 1012, 1030,
@@ -111,15 +111,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
13565, 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, 13565, 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726,
18062, 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 22766, 23214, 23662, 18062, 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 22766, 23214, 23662,
24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247
}; ];
public static short DcQuant(int qindex, int delta, BitDepth bitDepth) public static short DcQuant(int qindex, int delta, BitDepth bitDepth)
{ {
switch (bitDepth) switch (bitDepth)
{ {
case BitDepth.Bits8: return DcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits8: return _dcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits10: return DcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits10: return _dcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits12: return DcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits12: return _dcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)];
default: default:
Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12"); Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12");
return -1; return -1;
@@ -130,9 +130,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
switch (bitDepth) switch (bitDepth)
{ {
case BitDepth.Bits8: return AcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits8: return _acQlookup[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits10: return AcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits10: return _acQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits12: return AcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits12: return _acQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)];
default: default:
Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12"); Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12");
return -1; return -1;

View File

@@ -8,7 +8,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
internal static class ReconIntra internal static class ReconIntra
{ {
public static readonly TxType[] IntraModeToTxTypeLookup = public static readonly TxType[] IntraModeToTxTypeLookup =
{ [
TxType.DctDct, // DC TxType.DctDct, // DC
TxType.AdstDct, // V TxType.AdstDct, // V
TxType.DctAdst, // H TxType.DctAdst, // H
@@ -19,14 +19,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
TxType.DctAdst, // D207 TxType.DctAdst, // D207
TxType.AdstDct, // D63 TxType.AdstDct, // D63
TxType.AdstAdst // TM TxType.AdstAdst // TM
}; ];
private const int NeedLeft = 1 << 1; private const int NeedLeft = 1 << 1;
private const int NeedAbove = 1 << 2; private const int NeedAbove = 1 << 2;
private const int NeedAboveRight = 1 << 3; private const int NeedAboveRight = 1 << 3;
private static ReadOnlySpan<byte> ExtendModes => new byte[] private static ReadOnlySpan<byte> ExtendModes =>
{ [
NeedAbove | NeedLeft, // DC NeedAbove | NeedLeft, // DC
NeedAbove, // V NeedAbove, // V
NeedLeft, // H NeedLeft, // H
@@ -37,123 +37,103 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
NeedLeft, // D207 NeedLeft, // D207
NeedAboveRight, // D63 NeedAboveRight, // D63
NeedLeft | NeedAbove // TM NeedLeft | NeedAbove // TM
}; ];
private unsafe delegate void IntraPredFn(byte* dst, int stride, byte* above, byte* left); private unsafe delegate void IntraPredFn(byte* dst, int stride, byte* above, byte* left);
private static readonly unsafe IntraPredFn[][] Pred = private static readonly unsafe IntraPredFn[][] _pred =
{ [
new IntraPredFn[] { null, null, null, null }, [null, null, null, null],
new IntraPredFn[] { VPredictor4x4, VPredictor8x8, VPredictor16x16, VPredictor32x32 }, [VPredictor4X4, VPredictor8X8, VPredictor16X16, VPredictor32X32],
new IntraPredFn[] { HPredictor4x4, HPredictor8x8, HPredictor16x16, HPredictor32x32 }, [HPredictor4X4, HPredictor8X8, HPredictor16X16, HPredictor32X32],
new IntraPredFn[] { D45Predictor4x4, D45Predictor8x8, D45Predictor16x16, D45Predictor32x32 }, [D45Predictor4X4, D45Predictor8X8, D45Predictor16X16, D45Predictor32X32],
new IntraPredFn[] { D135Predictor4x4, D135Predictor8x8, D135Predictor16x16, D135Predictor32x32 }, [D135Predictor4X4, D135Predictor8X8, D135Predictor16X16, D135Predictor32X32],
new IntraPredFn[] { D117Predictor4x4, D117Predictor8x8, D117Predictor16x16, D117Predictor32x32 }, [D117Predictor4X4, D117Predictor8X8, D117Predictor16X16, D117Predictor32X32],
new IntraPredFn[] { D153Predictor4x4, D153Predictor8x8, D153Predictor16x16, D153Predictor32x32 }, [D153Predictor4X4, D153Predictor8X8, D153Predictor16X16, D153Predictor32X32],
new IntraPredFn[] { D207Predictor4x4, D207Predictor8x8, D207Predictor16x16, D207Predictor32x32 }, [D207Predictor4X4, D207Predictor8X8, D207Predictor16X16, D207Predictor32X32],
new IntraPredFn[] { D63Predictor4x4, D63Predictor8x8, D63Predictor16x16, D63Predictor32x32 }, [D63Predictor4X4, D63Predictor8X8, D63Predictor16X16, D63Predictor32X32],
new IntraPredFn[] { TmPredictor4x4, TmPredictor8x8, TmPredictor16x16, TmPredictor32x32 } [TmPredictor4X4, TmPredictor8X8, TmPredictor16X16, TmPredictor32X32]
}; ];
private static readonly unsafe IntraPredFn[][][] DcPred = private static readonly unsafe IntraPredFn[][][] _dcPred =
{ [
new[] [
{ [
new IntraPredFn[] Dc128Predictor4X4, Dc128Predictor8X8, Dc128Predictor16X16, Dc128Predictor32X32
{ ],
Dc128Predictor4x4, Dc128Predictor8x8, Dc128Predictor16x16, Dc128Predictor32x32 [
}, DcTopPredictor4X4, DcTopPredictor8X8, DcTopPredictor16X16, DcTopPredictor32X32
new IntraPredFn[] ]
{ ],
DcTopPredictor4x4, DcTopPredictor8x8, DcTopPredictor16x16, DcTopPredictor32x32 [
} [
}, DcLeftPredictor4X4, DcLeftPredictor8X8, DcLeftPredictor16X16, DcLeftPredictor32X32
new[] ],
{ [DcPredictor4X4, DcPredictor8X8, DcPredictor16X16, DcPredictor32X32]
new IntraPredFn[] ]
{ ];
DcLeftPredictor4x4, DcLeftPredictor8x8, DcLeftPredictor16x16, DcLeftPredictor32x32
},
new IntraPredFn[] { DcPredictor4x4, DcPredictor8x8, DcPredictor16x16, DcPredictor32x32 }
}
};
private unsafe delegate void IntraHighPredFn(ushort* dst, int stride, ushort* above, ushort* left, int bd); private unsafe delegate void IntraHighPredFn(ushort* dst, int stride, ushort* above, ushort* left, int bd);
private static readonly unsafe IntraHighPredFn[][] PredHigh = private static readonly unsafe IntraHighPredFn[][] _predHigh =
{ [
new IntraHighPredFn[] { null, null, null, null }, [null, null, null, null],
new IntraHighPredFn[] [
{ HighbdVPredictor4X4, HighbdVPredictor8X8, HighbdVPredictor16X16, HighbdVPredictor32X32
HighbdVPredictor4x4, HighbdVPredictor8x8, HighbdVPredictor16x16, HighbdVPredictor32x32 ],
}, [
new IntraHighPredFn[] HighbdHPredictor4X4, HighbdHPredictor8X8, HighbdHPredictor16X16, HighbdHPredictor32X32
{ ],
HighbdHPredictor4x4, HighbdHPredictor8x8, HighbdHPredictor16x16, HighbdHPredictor32x32 [
}, HighbdD45Predictor4X4, HighbdD45Predictor8X8, HighbdD45Predictor16X16, HighbdD45Predictor32X32
new IntraHighPredFn[] ],
{ [
HighbdD45Predictor4x4, HighbdD45Predictor8x8, HighbdD45Predictor16x16, HighbdD45Predictor32x32 HighbdD135Predictor4X4, HighbdD135Predictor8X8, HighbdD135Predictor16X16,
}, HighbdD135Predictor32X32
new IntraHighPredFn[] ],
{ [
HighbdD135Predictor4x4, HighbdD135Predictor8x8, HighbdD135Predictor16x16, HighbdD117Predictor4X4, HighbdD117Predictor8X8, HighbdD117Predictor16X16,
HighbdD135Predictor32x32 HighbdD117Predictor32X32
}, ],
new IntraHighPredFn[] [
{ HighbdD153Predictor4X4, HighbdD153Predictor8X8, HighbdD153Predictor16X16,
HighbdD117Predictor4x4, HighbdD117Predictor8x8, HighbdD117Predictor16x16, HighbdD153Predictor32X32
HighbdD117Predictor32x32 ],
}, [
new IntraHighPredFn[] HighbdD207Predictor4X4, HighbdD207Predictor8X8, HighbdD207Predictor16X16,
{ HighbdD207Predictor32X32
HighbdD153Predictor4x4, HighbdD153Predictor8x8, HighbdD153Predictor16x16, ],
HighbdD153Predictor32x32 [
}, HighbdD63Predictor4X4, HighbdD63Predictor8X8, HighbdD63Predictor16X16, HighbdD63Predictor32X32
new IntraHighPredFn[] ],
{ [
HighbdD207Predictor4x4, HighbdD207Predictor8x8, HighbdD207Predictor16x16, HighbdTmPredictor4X4, HighbdTmPredictor8X8, HighbdTmPredictor16X16, HighbdTmPredictor32X32
HighbdD207Predictor32x32 ]
}, ];
new IntraHighPredFn[]
{
HighbdD63Predictor4x4, HighbdD63Predictor8x8, HighbdD63Predictor16x16, HighbdD63Predictor32x32
},
new IntraHighPredFn[]
{
HighbdTmPredictor4x4, HighbdTmPredictor8x8, HighbdTmPredictor16x16, HighbdTmPredictor32x32
}
};
private static readonly unsafe IntraHighPredFn[][][] DcPredHigh = private static readonly unsafe IntraHighPredFn[][][] _dcPredHigh =
{ [
new[] [
{ [
new IntraHighPredFn[] HighbdDc128Predictor4X4, HighbdDc128Predictor8X8, HighbdDc128Predictor16X16,
{ HighbdDc128Predictor32X32
HighbdDc128Predictor4x4, HighbdDc128Predictor8x8, HighbdDc128Predictor16x16, ],
HighbdDc128Predictor32x32 [
}, HighbdDcTopPredictor4X4, HighbdDcTopPredictor8X8, HighbdDcTopPredictor16X16,
new IntraHighPredFn[] HighbdDcTopPredictor32X32
{ ]
HighbdDcTopPredictor4x4, HighbdDcTopPredictor8x8, HighbdDcTopPredictor16x16, ],
HighbdDcTopPredictor32x32 [
} [
}, HighbdDcLeftPredictor4X4, HighbdDcLeftPredictor8X8, HighbdDcLeftPredictor16X16,
new[] HighbdDcLeftPredictor32X32
{ ],
new IntraHighPredFn[] [
{ HighbdDcPredictor4X4, HighbdDcPredictor8X8, HighbdDcPredictor16X16,
HighbdDcLeftPredictor4x4, HighbdDcLeftPredictor8x8, HighbdDcLeftPredictor16x16, HighbdDcPredictor32X32
HighbdDcLeftPredictor32x32 ]
}, ]
new IntraHighPredFn[] ];
{
HighbdDcPredictor4x4, HighbdDcPredictor8x8, HighbdDcPredictor16x16,
HighbdDcPredictor32x32
}
}
};
private static unsafe void BuildIntraPredictorsHigh( private static unsafe void BuildIntraPredictorsHigh(
ref MacroBlockD xd, ref MacroBlockD xd,
@@ -371,11 +351,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Predict // Predict
if (mode == PredictionMode.DcPred) if (mode == PredictionMode.DcPred)
{ {
DcPredHigh[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd); _dcPredHigh[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd);
} }
else else
{ {
PredHigh[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd); _predHigh[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd);
} }
} }
@@ -588,11 +568,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Predict // Predict
if (mode == PredictionMode.DcPred) if (mode == PredictionMode.DcPred)
{ {
DcPred[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol); _dcPred[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol);
} }
else else
{ {
Pred[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol); _pred[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol);
} }
} }

View File

@@ -2,19 +2,19 @@
{ {
internal enum BlockSize internal enum BlockSize
{ {
Block4x4, Block4X4,
Block4x8, Block4X8,
Block8x4, Block8X4,
Block8x8, Block8X8,
Block8x16, Block8X16,
Block16x8, Block16X8,
Block16x16, Block16X16,
Block16x32, Block16X32,
Block32x16, Block32X16,
Block32x32, Block32X32,
Block32x64, Block32X64,
Block64x32, Block64X32,
Block64x64, Block64X64,
BlockSizes, BlockSizes,
BlockInvalid = BlockSizes BlockInvalid = BlockSizes
} }

View File

@@ -15,10 +15,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
{ {
public Array4<ulong> LeftY; public Array4<ulong> LeftY;
public Array4<ulong> AboveY; public Array4<ulong> AboveY;
public ulong Int4x4Y; public ulong Int4X4Y;
public Array4<ushort> LeftUv; public Array4<ushort> LeftUv;
public Array4<ushort> AboveUv; public Array4<ushort> AboveUv;
public ushort Int4x4Uv; public ushort Int4X4Uv;
public Array64<byte> LflY; public Array64<byte> LflY;
} }
} }

View File

@@ -29,12 +29,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
public PredictionMode GetYMode(int block) public PredictionMode GetYMode(int block)
{ {
return SbType < BlockSize.Block8x8 ? Bmi[block].Mode : Mode; return SbType < BlockSize.Block8X8 ? Bmi[block].Mode : Mode;
} }
public TxSize GetUvTxSize(ref MacroBlockDPlane pd) public TxSize GetUvTxSize(ref MacroBlockDPlane pd)
{ {
Debug.Assert(SbType < BlockSize.Block8x8 || Debug.Assert(SbType < BlockSize.Block8X8 ||
Luts.SsSizeLookup[(int)SbType][pd.SubsamplingX][pd.SubsamplingY] != BlockSize.BlockInvalid); Luts.SsSizeLookup[(int)SbType][pd.SubsamplingX][pd.SubsamplingY] != BlockSize.BlockInvalid);
return Luts.UvTxsizeLookup[(int)SbType][(int)TxSize][pd.SubsamplingX][pd.SubsamplingY]; return Luts.UvTxsizeLookup[(int)SbType][(int)TxSize][pd.SubsamplingX][pd.SubsamplingY];
} }
@@ -49,17 +49,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
return RefFrame[1] > Constants.IntraFrame; return RefFrame[1] > Constants.IntraFrame;
} }
private static readonly int[][] IdxNColumnToSubblock = private static readonly int[][] _idxNColumnToSubblock =
{ [
new[] { 1, 2 }, new[] { 1, 3 }, new[] { 3, 2 }, new[] { 3, 3 } [1, 2], [1, 3], [3, 2], [3, 3]
}; ];
// This function returns either the appropriate sub block or block's mv // This function returns either the appropriate sub block or block's mv
// on whether the block_size < 8x8 and we have check_sub_blocks set. // on whether the block_size < 8x8 and we have check_sub_blocks set.
public Mv GetSubBlockMv(int whichMv, int searchCol, int blockIdx) public Mv GetSubBlockMv(int whichMv, int searchCol, int blockIdx)
{ {
return blockIdx >= 0 && SbType < BlockSize.Block8x8 return blockIdx >= 0 && SbType < BlockSize.Block8X8
? Bmi[IdxNColumnToSubblock[blockIdx][searchCol == 0 ? 1 : 0]].Mv[whichMv] ? Bmi[_idxNColumnToSubblock[blockIdx][searchCol == 0 ? 1 : 0]].Mv[whichMv]
: Mv[whichMv]; : Mv[whichMv];
} }

View File

@@ -10,8 +10,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
public short Row; public short Row;
public short Col; public short Col;
private static ReadOnlySpan<byte> LogInBase2 => new byte[] private static ReadOnlySpan<byte> LogInBase2 =>
{ [
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
@@ -42,12 +42,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 10 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
}; ];
public bool UseHp() public bool UseHp()
{ {
const int kMvRefThresh = 64; // Threshold for use of high-precision 1/8 mv const int KMvRefThresh = 64; // Threshold for use of high-precision 1/8 mv
return Math.Abs(Row) < kMvRefThresh && Math.Abs(Col) < kMvRefThresh; return Math.Abs(Row) < KMvRefThresh && Math.Abs(Col) < KMvRefThresh;
} }
public static bool JointVertical(MvJointType type) public static bool JointVertical(MvJointType type)

View File

@@ -38,96 +38,85 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
int h, int h,
int bd); int bd);
private static readonly unsafe ConvolveFn[][][] PredictX16Y16 = private static readonly unsafe ConvolveFn[][][] _predictX16Y16 =
{ [
new[] [
{ [ConvolveCopy, ConvolveAvg],
new ConvolveFn[] { ConvolveCopy, ConvolveAvg }, [Convolve8Vert, Convolve8AvgVert]
new ConvolveFn[] { Convolve8Vert, Convolve8AvgVert } ],
}, [
new[] [Convolve8Horiz, Convolve8AvgHoriz],
{ [Convolve8, Convolve8Avg]
new ConvolveFn[] { Convolve8Horiz, Convolve8AvgHoriz }, ]
new ConvolveFn[] { Convolve8, Convolve8Avg } ];
}
};
private static readonly unsafe ConvolveFn[][][] PredictX16 = private static readonly unsafe ConvolveFn[][][] _predictX16 =
{ [
new[] [
{ [ScaledVert, ScaledAvgVert], [ScaledVert, ScaledAvgVert]
new ConvolveFn[] { ScaledVert, ScaledAvgVert }, new ConvolveFn[] { ScaledVert, ScaledAvgVert } ],
}, [[Scaled2D, ScaledAvg2D], [Scaled2D, ScaledAvg2D]]
new[] { new ConvolveFn[] { Scaled2D, ScaledAvg2D }, new ConvolveFn[] { Scaled2D, ScaledAvg2D } } ];
};
private static readonly unsafe ConvolveFn[][][] PredictY16 = private static readonly unsafe ConvolveFn[][][] _predictY16 =
{ [
new[] { new ConvolveFn[] { ScaledHoriz, ScaledAvgHoriz }, new ConvolveFn[] { Scaled2D, ScaledAvg2D } }, [[ScaledHoriz, ScaledAvgHoriz], [Scaled2D, ScaledAvg2D]],
new[] { new ConvolveFn[] { ScaledHoriz, ScaledAvgHoriz }, new ConvolveFn[] { Scaled2D, ScaledAvg2D } } [[ScaledHoriz, ScaledAvgHoriz], [Scaled2D, ScaledAvg2D]]
}; ];
private static readonly unsafe ConvolveFn[][][] Predict = private static readonly unsafe ConvolveFn[][][] _predict =
{ [
new[] { new ConvolveFn[] { Scaled2D, ScaledAvg2D }, new ConvolveFn[] { Scaled2D, ScaledAvg2D } }, [[Scaled2D, ScaledAvg2D], [Scaled2D, ScaledAvg2D]],
new[] { new ConvolveFn[] { Scaled2D, ScaledAvg2D }, new ConvolveFn[] { Scaled2D, ScaledAvg2D } } [[Scaled2D, ScaledAvg2D], [Scaled2D, ScaledAvg2D]]
}; ];
private static readonly unsafe HighbdConvolveFn[][][] HighbdPredictX16Y16 = private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictX16Y16 =
{ [
new[] [
{ [HighbdConvolveCopy, HighbdConvolveAvg],
new HighbdConvolveFn[] { HighbdConvolveCopy, HighbdConvolveAvg }, [HighbdConvolve8Vert, HighbdConvolve8AvgVert]
new HighbdConvolveFn[] { HighbdConvolve8Vert, HighbdConvolve8AvgVert } ],
}, [
new[] [HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz],
{ [HighbdConvolve8, HighbdConvolve8Avg]
new HighbdConvolveFn[] { HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz }, ]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg } ];
}
};
private static readonly unsafe HighbdConvolveFn[][][] HighbdPredictX16 = private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictX16 =
{ [
new[] [
{ [HighbdConvolve8Vert, HighbdConvolve8AvgVert],
new HighbdConvolveFn[] { HighbdConvolve8Vert, HighbdConvolve8AvgVert }, [HighbdConvolve8Vert, HighbdConvolve8AvgVert]
new HighbdConvolveFn[] { HighbdConvolve8Vert, HighbdConvolve8AvgVert } ],
}, [
new[] [HighbdConvolve8, HighbdConvolve8Avg],
{ [HighbdConvolve8, HighbdConvolve8Avg]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg }, ]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg } ];
}
};
private static readonly unsafe HighbdConvolveFn[][][] HighbdPredictY16 = private static readonly unsafe HighbdConvolveFn[][][] _highbdPredictY16 =
{ [
new[] [
{ [HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz],
new HighbdConvolveFn[] { HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz }, [HighbdConvolve8, HighbdConvolve8Avg]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg } ],
}, [
new[] [HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz],
{ [HighbdConvolve8, HighbdConvolve8Avg]
new HighbdConvolveFn[] { HighbdConvolve8Horiz, HighbdConvolve8AvgHoriz }, ]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg } ];
}
};
private static readonly unsafe HighbdConvolveFn[][][] HighbdPredict = private static readonly unsafe HighbdConvolveFn[][][] _highbdPredict =
{ [
new[] [
{ [HighbdConvolve8, HighbdConvolve8Avg],
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg }, [HighbdConvolve8, HighbdConvolve8Avg]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg } ],
}, [
new[] [HighbdConvolve8, HighbdConvolve8Avg],
{ [HighbdConvolve8, HighbdConvolve8Avg]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg }, ]
new HighbdConvolveFn[] { HighbdConvolve8, HighbdConvolve8Avg } ];
}
};
public int XScaleFp; // Horizontal fixed point scale factor public int XScaleFp; // Horizontal fixed point scale factor
public int YScaleFp; // Vertical fixed point scale factor public int YScaleFp; // Vertical fixed point scale factor
@@ -166,13 +155,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
if (YStepQ4 == 16) if (YStepQ4 == 16)
{ {
// No scaling in either direction. // No scaling in either direction.
PredictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, _predictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w,
h); h);
} }
else else
{ {
// No scaling in x direction. Must always scale in the y direction. // No scaling in x direction. Must always scale in the y direction.
PredictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, _predictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w,
h); h);
} }
} }
@@ -181,13 +170,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
if (YStepQ4 == 16) if (YStepQ4 == 16)
{ {
// No scaling in the y direction. Must always scale in the x direction. // No scaling in the y direction. Must always scale in the x direction.
PredictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, _predictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w,
h); h);
} }
else else
{ {
// Must always scale in both directions. // Must always scale in both directions.
Predict[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h); _predict[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, h);
} }
} }
} }
@@ -215,13 +204,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
if (YStepQ4 == 16) if (YStepQ4 == 16)
{ {
// No scaling in either direction. // No scaling in either direction.
HighbdPredictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, _highbdPredictX16Y16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY,
ys, w, h, bd); ys, w, h, bd);
} }
else else
{ {
// No scaling in x direction. Must always scale in the y direction. // No scaling in x direction. Must always scale in the y direction.
HighbdPredictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, _highbdPredictX16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys,
w, h, bd); w, h, bd);
} }
} }
@@ -230,13 +219,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
if (YStepQ4 == 16) if (YStepQ4 == 16)
{ {
// No scaling in the y direction. Must always scale in the x direction. // No scaling in the y direction. Must always scale in the x direction.
HighbdPredictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, _highbdPredictY16[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys,
w, h, bd); w, h, bd);
} }
else else
{ {
// Must always scale in both directions. // Must always scale in both directions.
HighbdPredict[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w, _highbdPredict[horiz][vert][avg](src, srcStride, dst, dstStride, kernel, subpelX, xs, subpelY, ys, w,
h, bd); h, bd);
} }
} }

View File

@@ -16,8 +16,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
public const int PredictionProbs = 3; public const int PredictionProbs = 3;
private static readonly int[] SegFeatureDataSigned = { 1, 1, 0, 0 }; private static readonly int[] _segFeatureDataSigned = [1, 1, 0, 0];
private static readonly int[] SegFeatureDataMax = { QuantCommon.MaxQ, Vp9.LoopFilter.MaxLoopFilter, 3, 0 }; private static readonly int[] _segFeatureDataMax = [QuantCommon.MaxQ, Vp9.LoopFilter.MaxLoopFilter, 3, 0];
public bool Enabled; public bool Enabled;
public bool UpdateMap; public bool UpdateMap;
@@ -48,21 +48,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
internal static int FeatureDataMax(SegLvlFeatures featureId) internal static int FeatureDataMax(SegLvlFeatures featureId)
{ {
return SegFeatureDataMax[(int)featureId]; return _segFeatureDataMax[(int)featureId];
} }
internal static int IsSegFeatureSigned(SegLvlFeatures featureId) internal static int IsSegFeatureSigned(SegLvlFeatures featureId)
{ {
return SegFeatureDataSigned[(int)featureId]; return _segFeatureDataSigned[(int)featureId];
} }
internal void SetSegData(int segmentId, SegLvlFeatures featureId, int segData) internal void SetSegData(int segmentId, SegLvlFeatures featureId, int segData)
{ {
Debug.Assert(segData <= SegFeatureDataMax[(int)featureId]); Debug.Assert(segData <= _segFeatureDataMax[(int)featureId]);
if (segData < 0) if (segData < 0)
{ {
Debug.Assert(SegFeatureDataSigned[(int)featureId] != 0); Debug.Assert(_segFeatureDataSigned[(int)featureId] != 0);
Debug.Assert(-segData <= SegFeatureDataMax[(int)featureId]); Debug.Assert(-segData <= _segFeatureDataMax[(int)featureId]);
} }
FeatureData[segmentId][(int)featureId] = (short)segData; FeatureData[segmentId][(int)featureId] = (short)segData;

View File

@@ -65,23 +65,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
public Surface(int width, int height) public Surface(int width, int height)
{ {
const int border = 32; const int Border = 32;
const int ssX = 1; const int SsX = 1;
const int ssY = 1; const int SsY = 1;
const bool highbd = false; const bool Highbd = false;
int alignedWidth = (width + 7) & ~7; int alignedWidth = (width + 7) & ~7;
int alignedHeight = (height + 7) & ~7; int alignedHeight = (height + 7) & ~7;
int yStride = (alignedWidth + (2 * border) + 31) & ~31; int yStride = (alignedWidth + (2 * Border) + 31) & ~31;
int yplaneSize = (alignedHeight + (2 * border)) * yStride; int yplaneSize = (alignedHeight + (2 * Border)) * yStride;
int uvWidth = alignedWidth >> ssX; int uvWidth = alignedWidth >> SsX;
int uvHeight = alignedHeight >> ssY; int uvHeight = alignedHeight >> SsY;
int uvStride = yStride >> ssX; int uvStride = yStride >> SsX;
int uvBorderW = border >> ssX; int uvBorderW = Border >> SsX;
int uvBorderH = border >> ssY; int uvBorderH = Border >> SsY;
int uvplaneSize = (uvHeight + (2 * uvBorderH)) * uvStride; int uvplaneSize = (uvHeight + (2 * uvBorderH)) * uvStride;
int frameSize = (highbd ? 2 : 1) * (yplaneSize + (2 * uvplaneSize)); int frameSize = (Highbd ? 2 : 1) * (yplaneSize + (2 * uvplaneSize));
nint pointer = Marshal.AllocHGlobal(frameSize); nint pointer = Marshal.AllocHGlobal(frameSize);
_pointer = pointer; _pointer = pointer;
@@ -90,8 +90,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
AlignedWidth = alignedWidth; AlignedWidth = alignedWidth;
AlignedHeight = alignedHeight; AlignedHeight = alignedHeight;
Stride = yStride; Stride = yStride;
UvWidth = (width + ssX) >> ssX; UvWidth = (width + SsX) >> SsX;
UvHeight = (height + ssY) >> ssY; UvHeight = (height + SsY) >> SsY;
UvAlignedWidth = uvWidth; UvAlignedWidth = uvWidth;
UvAlignedHeight = uvHeight; UvAlignedHeight = uvHeight;
UvStride = uvStride; UvStride = uvStride;
@@ -101,7 +101,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
return new ArrayPtr<byte>(pointer + start + border, size - border); return new ArrayPtr<byte>(pointer + start + border, size - border);
} }
YBuffer = NewPlane(0, yplaneSize, (border * yStride) + border); YBuffer = NewPlane(0, yplaneSize, (Border * yStride) + Border);
UBuffer = NewPlane(yplaneSize, uvplaneSize, (uvBorderH * uvStride) + uvBorderW); UBuffer = NewPlane(yplaneSize, uvplaneSize, (uvBorderH * uvStride) + uvBorderW);
VBuffer = NewPlane(yplaneSize + uvplaneSize, uvplaneSize, (uvBorderH * uvStride) + uvBorderW); VBuffer = NewPlane(yplaneSize + uvplaneSize, uvplaneSize, (uvBorderH * uvStride) + uvBorderW);
} }
@@ -146,8 +146,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
if (cb != null) if (cb != null)
{ {
const int alignAddrExtraSize = 31; const int AlignAddrExtraSize = 31;
ulong externalFrameSize = frameSize + alignAddrExtraSize; ulong externalFrameSize = frameSize + AlignAddrExtraSize;
Debug.Assert(!fb.IsNull); Debug.Assert(!fb.IsNull);

View File

@@ -2,10 +2,10 @@
{ {
public enum TxMode public enum TxMode
{ {
Only4x4, // Only 4x4 transform used Only4X4, // Only 4x4 transform used
Allow8x8, // Allow block transform size up to 8x8 Allow8X8, // Allow block transform size up to 8x8
Allow16x16, // Allow block transform size up to 16x16 Allow16X16, // Allow block transform size up to 16x16
Allow32x32, // Allow block transform size up to 32x32 Allow32X32, // Allow block transform size up to 32x32
TxModeSelect, // Transform specified for each block TxModeSelect, // Transform specified for each block
TxModes TxModes
} }

View File

@@ -2,10 +2,10 @@
{ {
public enum TxSize public enum TxSize
{ {
Tx4x4, // 4x4 transform Tx4X4, // 4x4 transform
Tx8x8, // 8x8 transform Tx8X8, // 8x8 transform
Tx16x16, // 16x16 transform Tx16X16, // 16x16 transform
Tx32x32, // 32x32 transform Tx32X32, // 32x32 transform
TxSizes TxSizes
} }
} }

View File

@@ -845,30 +845,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
if (TxMode == TxMode.TxModeSelect) if (TxMode == TxMode.TxModeSelect)
{ {
Array1<Array2<uint>> branchCt8x8P = new(); Array1<Array2<uint>> branchCt8X8P = new();
Array2<Array2<uint>> branchCt16x16P = new(); Array2<Array2<uint>> branchCt16X16P = new();
Array3<Array2<uint>> branchCt32x32P = new(); Array3<Array2<uint>> branchCt32X32P = new();
for (int i = 0; i < EntropyMode.TxSizeContexts; ++i) for (int i = 0; i < EntropyMode.TxSizeContexts; ++i)
{ {
EntropyMode.TxCountsToBranchCounts8x8(counts.Tx8x8[i].AsSpan(), ref branchCt8x8P); EntropyMode.TxCountsToBranchCounts8X8(counts.Tx8x8[i].AsSpan(), ref branchCt8X8P);
for (int j = 0; j < (int)TxSize.TxSizes - 3; ++j) for (int j = 0; j < (int)TxSize.TxSizes - 3; ++j)
{ {
fc.Tx8x8Prob[i][j] = Prob.ModeMvMergeProbs(preFc.Tx8x8Prob[i][j], ref branchCt8x8P[j]); fc.Tx8x8Prob[i][j] = Prob.ModeMvMergeProbs(preFc.Tx8x8Prob[i][j], ref branchCt8X8P[j]);
} }
EntropyMode.TxCountsToBranchCounts16x16(counts.Tx16x16[i].AsSpan(), ref branchCt16x16P); EntropyMode.TxCountsToBranchCounts16X16(counts.Tx16x16[i].AsSpan(), ref branchCt16X16P);
for (int j = 0; j < (int)TxSize.TxSizes - 2; ++j) for (int j = 0; j < (int)TxSize.TxSizes - 2; ++j)
{ {
fc.Tx16x16Prob[i][j] = fc.Tx16x16Prob[i][j] =
Prob.ModeMvMergeProbs(preFc.Tx16x16Prob[i][j], ref branchCt16x16P[j]); Prob.ModeMvMergeProbs(preFc.Tx16x16Prob[i][j], ref branchCt16X16P[j]);
} }
EntropyMode.TxCountsToBranchCounts32x32(counts.Tx32x32[i].AsSpan(), ref branchCt32x32P); EntropyMode.TxCountsToBranchCounts32X32(counts.Tx32x32[i].AsSpan(), ref branchCt32X32P);
for (int j = 0; j < (int)TxSize.TxSizes - 1; ++j) for (int j = 0; j < (int)TxSize.TxSizes - 1; ++j)
{ {
fc.Tx32x32Prob[i][j] = fc.Tx32x32Prob[i][j] =
Prob.ModeMvMergeProbs(preFc.Tx32x32Prob[i][j], ref branchCt32x32P[j]); Prob.ModeMvMergeProbs(preFc.Tx32x32Prob[i][j], ref branchCt32X32P[j]);
} }
} }
} }
@@ -900,7 +900,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
countSat = Entropy.CoefCountSat; countSat = Entropy.CoefCountSat;
} }
for (t = (int)TxSize.Tx4x4; t <= (int)TxSize.Tx32x32; t++) for (t = (int)TxSize.Tx4X4; t <= (int)TxSize.Tx32X32; t++)
{ {
AdaptCoefProbs(t, countSat, updateFactor); AdaptCoefProbs(t, countSat, updateFactor);
} }
@@ -990,10 +990,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
public void DefaultCoefProbs() public void DefaultCoefProbs()
{ {
Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx4x4], Entropy.DefaultCoefProbs4x4); Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx4X4], Entropy.DefaultCoefProbs4X4);
Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx8x8], Entropy.DefaultCoefProbs8x8); Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx8X8], Entropy.DefaultCoefProbs8X8);
Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx16x16], Entropy.DefaultCoefProbs16x16); Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx16X16], Entropy.DefaultCoefProbs16X16);
Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx32x32], Entropy.DefaultCoefProbs32x32); Entropy.CopyProbs(ref Fc.Value.CoefProbs[(int)TxSize.Tx32X32], Entropy.DefaultCoefProbs32X32);
} }
} }
} }

View File

@@ -62,38 +62,38 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
} }
} }
byte[][] KfPartitionProbs = byte[][] kfPartitionProbs =
{ [
// 8x8 . 4x4 // 8x8 . 4x4
new byte[] { 158, 97, 94 }, // a/l both not split [158, 97, 94], // a/l both not split
new byte[] { 93, 24, 99 }, // a split, l not split [93, 24, 99], // a split, l not split
new byte[] { 85, 119, 44 }, // l split, a not split [85, 119, 44], // l split, a not split
new byte[] { 62, 59, 67 }, // a/l both split [62, 59, 67], // a/l both split
// 16x16 . 8x8 // 16x16 . 8x8
new byte[] { 149, 53, 53 }, // a/l both not split [149, 53, 53], // a/l both not split
new byte[] { 94, 20, 48 }, // a split, l not split [94, 20, 48], // a split, l not split
new byte[] { 83, 53, 24 }, // l split, a not split [83, 53, 24], // l split, a not split
new byte[] { 52, 18, 18 }, // a/l both split [52, 18, 18], // a/l both split
// 32x32 . 16x16 // 32x32 . 16x16
new byte[] { 150, 40, 39 }, // a/l both not split [150, 40, 39], // a/l both not split
new byte[] { 78, 12, 26 }, // a split, l not split [78, 12, 26], // a split, l not split
new byte[] { 67, 33, 11 }, // l split, a not split [67, 33, 11], // l split, a not split
new byte[] { 24, 7, 5 }, // a/l both split [24, 7, 5], // a/l both split
// 64x64 . 32x32 // 64x64 . 32x32
new byte[] { 174, 35, 49 }, // a/l both not split [174, 35, 49], // a/l both not split
new byte[] { 68, 11, 27 }, // a split, l not split [68, 11, 27], // a split, l not split
new byte[] { 57, 15, 9 }, // l split, a not split [57, 15, 9], // l split, a not split
new byte[] { 12, 3, 3 } // a/l both split [12, 3, 3] // a/l both split
}; ];
for (int i = 0; i < KfPartitionProbs.Length; i++) for (int i = 0; i < kfPartitionProbs.Length; i++)
{ {
for (int j = 0; j < KfPartitionProbs[i].Length; j++) for (int j = 0; j < kfPartitionProbs[i].Length; j++)
{ {
cm.Fc.Value.KfPartitionProb[i][j] = KfPartitionProbs[i][j]; cm.Fc.Value.KfPartitionProb[i][j] = kfPartitionProbs[i][j];
} }
} }
@@ -281,7 +281,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
Array8<uint> frameSizes = new(); Array8<uint> frameSizes = new();
int frameCount = 0; int frameCount = 0;
res = Types.Decoder.ParseSuperframeIndex(data, (ulong)data.Length, ref frameSizes, out frameCount); res = Decoder.ParseSuperframeIndex(data, (ulong)data.Length, ref frameSizes, out frameCount);
if (res != CodecErr.Ok) if (res != CodecErr.Ok)
{ {
return res; return res;
@@ -322,7 +322,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Types
// Account for suboptimal termination by the encoder. // Account for suboptimal termination by the encoder.
while (dataStart.Length != 0) while (dataStart.Length != 0)
{ {
byte marker = Types.Decoder.ReadMarker(dataStart); byte marker = Decoder.ReadMarker(dataStart);
if (marker != 0) if (marker != 0)
{ {
break; break;

View File

@@ -41,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Applets.Browser
{ {
List<BrowserOutput> result = List<BrowserOutput> result =
[ [
new BrowserOutput(BrowserOutputType.ExitReason, (uint)WebExitReason.ExitButton) new(BrowserOutputType.ExitReason, (uint)WebExitReason.ExitButton)
]; ];
_normalSession.Push(BuildResponseNew(result)); _normalSession.Push(BuildResponseNew(result));

View File

@@ -463,7 +463,7 @@
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Abrir Pasta de Capturas de Tela", "pt_BR": "Abrir Pasta de Capturas de Tela",
"ru_RU": "", "ru_RU": "Открыть папку со скриншотами",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -613,7 +613,7 @@
"no_NO": "Start Spillet med UI Gjemt", "no_NO": "Start Spillet med UI Gjemt",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Iniciar Jogos Ocultando a Interface", "pt_BR": "Iniciar Jogos Ocultando a Interface",
"ru_RU": "", "ru_RU": "Запускать игры скрывая интерфейс",
"sv_SE": "Starta spel med dolt användargränssnitt", "sv_SE": "Starta spel med dolt användargränssnitt",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -688,7 +688,7 @@
"no_NO": "_Administrere Brukerprofiler", "no_NO": "_Administrere Brukerprofiler",
"pl_PL": "_Zarządzaj profilami użytkowników", "pl_PL": "_Zarządzaj profilami użytkowników",
"pt_BR": "_Gerenciar Perfis de Usuário", "pt_BR": "_Gerenciar Perfis de Usuário",
"ru_RU": "_Менеджер учетных записей", "ru_RU": "_Менеджер учётных записей",
"sv_SE": "_Hantera användarprofiler", "sv_SE": "_Hantera användarprofiler",
"th_TH": "_จัดการโปรไฟล์ผู้ใช้งาน", "th_TH": "_จัดการโปรไฟล์ผู้ใช้งาน",
"tr_TR": "_Kullanıcı Profillerini Yönet", "tr_TR": "_Kullanıcı Profillerini Yönet",
@@ -1563,7 +1563,7 @@
"no_NO": "Utviklet av {0}", "no_NO": "Utviklet av {0}",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Desenvolvido por {0}", "pt_BR": "Desenvolvido por {0}",
"ru_RU": "", "ru_RU": "Разработана {0}",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -1863,7 +1863,7 @@
"no_NO": "Kompatibilitet", "no_NO": "Kompatibilitet",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Compatibilidade:", "pt_BR": "Compatibilidade:",
"ru_RU": "", "ru_RU": "Совместимость:",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -1888,7 +1888,7 @@
"no_NO": "Tittel ID:", "no_NO": "Tittel ID:",
"pl_PL": "", "pl_PL": "",
"pt_BR": "ID do Título:", "pt_BR": "ID do Título:",
"ru_RU": "", "ru_RU": "ID приложения",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -1913,7 +1913,7 @@
"no_NO": "Spill som Arrangeres: {0}", "no_NO": "Spill som Arrangeres: {0}",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Jogos Hospedados: {0}", "pt_BR": "Jogos Hospedados: {0}",
"ru_RU": "", "ru_RU": "Запущенно игр: {0}",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -1938,7 +1938,7 @@
"no_NO": "Online-spillere: {0}", "no_NO": "Online-spillere: {0}",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Jogadores Online: {0}", "pt_BR": "Jogadores Online: {0}",
"ru_RU": "", "ru_RU": "Игроков онлайн: {0}",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2288,7 +2288,7 @@
"no_NO": "Tøm PPTC-bufferen", "no_NO": "Tøm PPTC-bufferen",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Limpar Cache PPTC", "pt_BR": "Limpar Cache PPTC",
"ru_RU": "", "ru_RU": "Очистить кэш PPTC",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2313,7 +2313,7 @@
"no_NO": "Sletter alle PPTC-cache-filer for applikasjonen", "no_NO": "Sletter alle PPTC-cache-filer for applikasjonen",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Apaga os arquivos de cache PPTC do aplicativo", "pt_BR": "Apaga os arquivos de cache PPTC do aplicativo",
"ru_RU": "", "ru_RU": "Удаляет все файлы кэша PPTC для приложения",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2638,7 +2638,7 @@
"no_NO": "Pakk ut RomFS filene fra valgt DLC fil", "no_NO": "Pakk ut RomFS filene fra valgt DLC fil",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Extraia o RomFS de um arquivo DLC selecionado", "pt_BR": "Extraia o RomFS de um arquivo DLC selecionado",
"ru_RU": "", "ru_RU": "Извлекает файлы RomFS из выбранного файла DLC",
"sv_SE": "Extrahera RomFS från en vald DLC-fil", "sv_SE": "Extrahera RomFS från en vald DLC-fil",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2788,7 +2788,7 @@
"no_NO": "Vis kompatibilitetsoppføring", "no_NO": "Vis kompatibilitetsoppføring",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Mostrar Dados de Compatibilidade", "pt_BR": "Mostrar Dados de Compatibilidade",
"ru_RU": "", "ru_RU": "Показать записи о совместимости",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2813,7 +2813,7 @@
"no_NO": "Vis det valgte spillet i kompatibilitetslisten, som du vanligvis får tilgang til via Hjelp-menyen.", "no_NO": "Vis det valgte spillet i kompatibilitetslisten, som du vanligvis får tilgang til via Hjelp-menyen.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Exibe o jogo selecionado na Lista de Compatibilidade, que normalmente pode ser acessada pelo menu Ajuda.", "pt_BR": "Exibe o jogo selecionado na Lista de Compatibilidade, que normalmente pode ser acessada pelo menu Ajuda.",
"ru_RU": "", "ru_RU": "Отобразить выбранную игру в списке совместимости, доступ к которому вы обычно можете получить через меню Справки.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2838,7 +2838,7 @@
"no_NO": "Vis Spill Info", "no_NO": "Vis Spill Info",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Mostrar Informações do Jogo", "pt_BR": "Mostrar Informações do Jogo",
"ru_RU": "", "ru_RU": "Показать информацию об игре",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -2863,7 +2863,7 @@
"no_NO": "Vis statistikk og detaljer om det valgte spillet.", "no_NO": "Vis statistikk og detaljer om det valgte spillet.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Exibe estatísticas e detalhes sobre o jogo selecionado.", "pt_BR": "Exibe estatísticas e detalhes sobre o jogo selecionado.",
"ru_RU": "", "ru_RU": "Показывать статистику и подробную информацию о выбранной игре.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3388,7 +3388,7 @@
"no_NO": "Se etter Oppdateringer:", "no_NO": "Se etter Oppdateringer:",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Verificar Atualizações:", "pt_BR": "Verificar Atualizações:",
"ru_RU": "", "ru_RU": "Проверка наличия обновлений",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3413,7 +3413,7 @@
"no_NO": "Av", "no_NO": "Av",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Desligado", "pt_BR": "Desligado",
"ru_RU": "", "ru_RU": "Отключить",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3438,7 +3438,7 @@
"no_NO": "Spør", "no_NO": "Spør",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Ao Abrir", "pt_BR": "Ao Abrir",
"ru_RU": "", "ru_RU": "При запуске",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3463,7 +3463,7 @@
"no_NO": "Bakgrunn", "no_NO": "Bakgrunn",
"pl_PL": "", "pl_PL": "",
"pt_BR": "2° Plano", "pt_BR": "2° Plano",
"ru_RU": "", "ru_RU": "В фоне",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3488,7 +3488,7 @@
"no_NO": "På Emulator Fokus Tapt:", "no_NO": "På Emulator Fokus Tapt:",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Ao Perder o Foco:", "pt_BR": "Ao Perder o Foco:",
"ru_RU": "", "ru_RU": "При выходе эмулятора из фокуса",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3513,7 +3513,7 @@
"no_NO": "Gjør Ingenting", "no_NO": "Gjør Ingenting",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Não Fazer Nada", "pt_BR": "Não Fazer Nada",
"ru_RU": "", "ru_RU": "Ничего не делать",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3538,7 +3538,7 @@
"no_NO": "Blokkinngang", "no_NO": "Blokkinngang",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Bloquear Controles", "pt_BR": "Bloquear Controles",
"ru_RU": "", "ru_RU": "Блокировать управление",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3563,7 +3563,7 @@
"no_NO": "Demp Lyd", "no_NO": "Demp Lyd",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Ficar Mudo", "pt_BR": "Ficar Mudo",
"ru_RU": "", "ru_RU": "Отключить звук",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3588,7 +3588,7 @@
"no_NO": "Blokker Inputs og demp Volumet", "no_NO": "Blokker Inputs og demp Volumet",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Bloquear Controles & Ficar Mudo", "pt_BR": "Bloquear Controles & Ficar Mudo",
"ru_RU": "", "ru_RU": "Блокировать управление и отключить звук",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3613,7 +3613,7 @@
"no_NO": "Pause Emulatoren", "no_NO": "Pause Emulatoren",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Pausar a Emulação", "pt_BR": "Pausar a Emulação",
"ru_RU": "", "ru_RU": "Поставить паузу",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -3688,7 +3688,7 @@
"no_NO": "Deaktiver inndata når vinduet er ute av fokus", "no_NO": "Deaktiver inndata når vinduet er ute av fokus",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Desativar Controles Quando Estiver Fora de Foco", "pt_BR": "Desativar Controles Quando Estiver Fora de Foco",
"ru_RU": "", "ru_RU": "Отключает управление при выходе из фокуса",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -4647,56 +4647,6 @@
"zh_TW": "正體中文 (建議)" "zh_TW": "正體中文 (建議)"
} }
}, },
{
"ID": "SettingsTabSystemSystemLanguageSwedish",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Swedish",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "스웨덴어",
"no_NO": "Svensk",
"pl_PL": "",
"pt_BR": "Sueco",
"ru_RU": "",
"sv_SE": "Svenska",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "瑞典语",
"zh_TW": ""
}
},
{
"ID": "SettingsTabSystemSystemLanguageNorwegian",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Norwegian",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "노르웨이어",
"no_NO": "Norsk",
"pl_PL": "",
"pt_BR": "Norueguês",
"ru_RU": "",
"sv_SE": "Norska",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "挪威语",
"zh_TW": ""
}
},
{ {
"ID": "SettingsTabSystemSystemTimeZone", "ID": "SettingsTabSystemSystemTimeZone",
"Translations": { "Translations": {
@@ -4763,7 +4713,7 @@
"no_NO": "Match systemtid", "no_NO": "Match systemtid",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Sincronizar com o Sistema PC", "pt_BR": "Sincronizar com o Sistema PC",
"ru_RU": "", "ru_RU": "Соответствовать времени в системе",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -5188,7 +5138,7 @@
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Ignorar Applet do Controlador", "pt_BR": "Ignorar Applet do Controlador",
"ru_RU": "", "ru_RU": "Игнорировать апплет контроллера",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -6038,7 +5988,7 @@
"no_NO": "Aktivere UI-logger", "no_NO": "Aktivere UI-logger",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Habilitar Logs da IU", "pt_BR": "Habilitar Logs da IU",
"ru_RU": "", "ru_RU": "Включить журнал интерфейса",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -6438,7 +6388,7 @@
"no_NO": "Tilbakestill innstillinger", "no_NO": "Tilbakestill innstillinger",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Redefinir Configurações", "pt_BR": "Redefinir Configurações",
"ru_RU": "", "ru_RU": "Сбросить настройки",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -6463,7 +6413,7 @@
"no_NO": "Jeg vil tilbakestille innstillingene mine.", "no_NO": "Jeg vil tilbakestille innstillingene mine.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Quero redefinir minhas configurações.", "pt_BR": "Quero redefinir minhas configurações.",
"ru_RU": "", "ru_RU": "Я хочу сбросить свои настройки.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -8363,7 +8313,7 @@
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "",
"ru_RU": "", "ru_RU": "LED-подсветка",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -8388,7 +8338,7 @@
"no_NO": "Deaktiver", "no_NO": "Deaktiver",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Desabilitar", "pt_BR": "Desabilitar",
"ru_RU": "", "ru_RU": "Отключить",
"sv_SE": "Inaktivera", "sv_SE": "Inaktivera",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -8413,7 +8363,7 @@
"no_NO": "Regnbue", "no_NO": "Regnbue",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Arco-íris", "pt_BR": "Arco-íris",
"ru_RU": "", "ru_RU": "Радужная",
"sv_SE": "Regnbåge", "sv_SE": "Regnbåge",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -8438,7 +8388,7 @@
"no_NO": "Regnbue Hastighet", "no_NO": "Regnbue Hastighet",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Velocidade do Arco-íris", "pt_BR": "Velocidade do Arco-íris",
"ru_RU": "", "ru_RU": "Скорость переливания",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -8463,7 +8413,7 @@
"no_NO": "Farge", "no_NO": "Farge",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Cor", "pt_BR": "Cor",
"ru_RU": "", "ru_RU": "Цвет",
"sv_SE": "Färg", "sv_SE": "Färg",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -9488,7 +9438,7 @@
"no_NO": "Numerisk 1", "no_NO": "Numerisk 1",
"pl_PL": "", "pl_PL": "",
"pt_BR": "", "pt_BR": "",
"ru_RU": "1 (цифровий блок)", "ru_RU": "Блок цифр 1",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -11888,7 +11838,7 @@
"no_NO": "Vis/Skjul favorittstatus for spillet", "no_NO": "Vis/Skjul favorittstatus for spillet",
"pl_PL": "Przełącz status Ulubionej Gry", "pl_PL": "Przełącz status Ulubionej Gry",
"pt_BR": "Marca ou desmarca o jogo como favorito", "pt_BR": "Marca ou desmarca o jogo como favorito",
"ru_RU": "Добавляет игру в избранное и помечает звездочкой", "ru_RU": "Добавляет игру в избранное и помечает звёздочкой",
"sv_SE": "Växla favoritstatus för spelet", "sv_SE": "Växla favoritstatus för spelet",
"th_TH": "สลับสถานะเกมที่ชื่นชอบ", "th_TH": "สลับสถานะเกมที่ชื่นชอบ",
"tr_TR": "Oyunu Favorilere Ekle/Çıkar", "tr_TR": "Oyunu Favorilere Ekle/Çıkar",
@@ -11963,7 +11913,7 @@
"no_NO": "Mørk", "no_NO": "Mørk",
"pl_PL": "Ciemny", "pl_PL": "Ciemny",
"pt_BR": "Escuro", "pt_BR": "Escuro",
"ru_RU": "Темная", "ru_RU": "Тёмная",
"sv_SE": "Mörkt", "sv_SE": "Mörkt",
"th_TH": "มืด", "th_TH": "มืด",
"tr_TR": "Karanlık", "tr_TR": "Karanlık",
@@ -12163,7 +12113,7 @@
"no_NO": "{0} - Bekreftelse", "no_NO": "{0} - Bekreftelse",
"pl_PL": "{0} - Potwierdzenie", "pl_PL": "{0} - Potwierdzenie",
"pt_BR": "{0} - Confirmação", "pt_BR": "{0} - Confirmação",
"ru_RU": "{0} - Подтверждение", "ru_RU": "{0} Подтверждение",
"sv_SE": "{0} - Bekräftelse", "sv_SE": "{0} - Bekräftelse",
"th_TH": "{0} - ยืนยัน", "th_TH": "{0} - ยืนยัน",
"tr_TR": "{0} - Onay", "tr_TR": "{0} - Onay",
@@ -12188,7 +12138,7 @@
"no_NO": "{0} Oppdaterer", "no_NO": "{0} Oppdaterer",
"pl_PL": "{0} - Asystent aktualizacji", "pl_PL": "{0} - Asystent aktualizacji",
"pt_BR": "{0} - Atualizador", "pt_BR": "{0} - Atualizador",
"ru_RU": "{0} - Обновление", "ru_RU": "{0} Обновление",
"sv_SE": "{0} - Uppdatering", "sv_SE": "{0} - Uppdatering",
"th_TH": "{0} - อัพเดต", "th_TH": "{0} - อัพเดต",
"tr_TR": "{0} - Güncelleyici", "tr_TR": "{0} - Güncelleyici",
@@ -12213,7 +12163,7 @@
"no_NO": "{0} - Feil", "no_NO": "{0} - Feil",
"pl_PL": "{0} - Błąd", "pl_PL": "{0} - Błąd",
"pt_BR": "{0} - Erro", "pt_BR": "{0} - Erro",
"ru_RU": "{0} - Ошибка", "ru_RU": "{0} Ошибка",
"sv_SE": "{0} - Fel", "sv_SE": "{0} - Fel",
"th_TH": "{0} - ผิดพลาด", "th_TH": "{0} - ผิดพลาด",
"tr_TR": "{0} - Hata", "tr_TR": "{0} - Hata",
@@ -12238,7 +12188,7 @@
"no_NO": "{0} - Advarsel", "no_NO": "{0} - Advarsel",
"pl_PL": "{0} - Ostrzeżenie", "pl_PL": "{0} - Ostrzeżenie",
"pt_BR": "{0} - Alerta", "pt_BR": "{0} - Alerta",
"ru_RU": "{0} - Предупреждение", "ru_RU": "{0} Предупреждение",
"sv_SE": "{0} - Varning", "sv_SE": "{0} - Varning",
"th_TH": "{0} - คำเตือน", "th_TH": "{0} - คำเตือน",
"tr_TR": "{0} - Uyarı", "tr_TR": "{0} - Uyarı",
@@ -12263,7 +12213,7 @@
"no_NO": "{0} - Avslutt", "no_NO": "{0} - Avslutt",
"pl_PL": "{0} - Wyjdź", "pl_PL": "{0} - Wyjdź",
"pt_BR": "{0} - Sair", "pt_BR": "{0} - Sair",
"ru_RU": "{0} - Выход", "ru_RU": "{0} Выход",
"sv_SE": "{0} - Avslut", "sv_SE": "{0} - Avslut",
"th_TH": "{0} - ออก", "th_TH": "{0} - ออก",
"tr_TR": "{0} - Çıkış", "tr_TR": "{0} - Çıkış",
@@ -12338,7 +12288,7 @@
"no_NO": "Alle ulagrede data vil gå tapt!", "no_NO": "Alle ulagrede data vil gå tapt!",
"pl_PL": "Wszystkie niezapisane dane zostaną utracone!", "pl_PL": "Wszystkie niezapisane dane zostaną utracone!",
"pt_BR": "Todos os dados que não foram salvos serão perdidos!", "pt_BR": "Todos os dados que não foram salvos serão perdidos!",
"ru_RU": "Все несохраненные данные будут потеряны", "ru_RU": "Все несохранённые данные будут потеряны",
"sv_SE": "Allt data som inte sparats kommer att förloras!", "sv_SE": "Allt data som inte sparats kommer att förloras!",
"th_TH": "ข้อมูลทั้งหมดที่ไม่ได้บันทึกทั้งหมดจะสูญหาย!", "th_TH": "ข้อมูลทั้งหมดที่ไม่ได้บันทึกทั้งหมดจะสูญหาย!",
"tr_TR": "Kaydedilmeyen bütün veriler kaybedilecek!", "tr_TR": "Kaydedilmeyen bütün veriler kaybedilecek!",
@@ -13713,7 +13663,7 @@
"no_NO": "Du er i ferd med å slette alle PPTC-data fra:\n\n{0}\n\n\nEr du sikker på at du vil fortsette?", "no_NO": "Du er i ferd med å slette alle PPTC-data fra:\n\n{0}\n\n\nEr du sikker på at du vil fortsette?",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Você está prestes a limpar todos os dados PPTC de:\n\n{0}\n\nTem certeza de que deseja continuar?", "pt_BR": "Você está prestes a limpar todos os dados PPTC de:\n\n{0}\n\nTem certeza de que deseja continuar?",
"ru_RU": "", "ru_RU": "Вы собираетесь удалить все данные PPTC из:\n\n{0}\n\nВы уверены, что хотите продолжить?",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -14263,7 +14213,7 @@
"no_NO": "Du har gjort endringer i denne brukerprofilen som ikke er lagret.", "no_NO": "Du har gjort endringer i denne brukerprofilen som ikke er lagret.",
"pl_PL": "Wprowadziłeś zmiany dla tego profilu użytkownika, które nie zostały zapisane.", "pl_PL": "Wprowadziłeś zmiany dla tego profilu użytkownika, które nie zostały zapisane.",
"pt_BR": "Você fez alterações para este perfil de usuário que não foram salvas.", "pt_BR": "Você fez alterações para este perfil de usuário que não foram salvas.",
"ru_RU": "В эту учетную запись внесены изменения, которые не были сохранены.", "ru_RU": "В эту учётную запись внесены изменения, которые не были сохранены.",
"sv_SE": "Du har gjort ändringar i denna användarprofil som inte har sparats.", "sv_SE": "Du har gjort ändringar i denna användarprofil som inte har sparats.",
"th_TH": "คุณได้ทำการเปลี่ยนแปลงโปรไฟล์ผู้ใช้นี้โดยไม่ได้รับการบันทึก", "th_TH": "คุณได้ทำการเปลี่ยนแปลงโปรไฟล์ผู้ใช้นี้โดยไม่ได้รับการบันทึก",
"tr_TR": "Kullanıcı profilinizde kaydedilmemiş değişiklikler var.", "tr_TR": "Kullanıcı profilinizde kaydedilmemiş değişiklikler var.",
@@ -15813,7 +15763,7 @@
"no_NO": "Velg om Ryujinx skal vises på din \"spillende\" Discord aktivitet eller ikke", "no_NO": "Velg om Ryujinx skal vises på din \"spillende\" Discord aktivitet eller ikke",
"pl_PL": "Wybierz, czy chcesz wyświetlać Ryujinx w swojej \"aktualnie grane\" aktywności Discord", "pl_PL": "Wybierz, czy chcesz wyświetlać Ryujinx w swojej \"aktualnie grane\" aktywności Discord",
"pt_BR": "Escolha se deseja mostrar Ryujinx ou não na sua atividade do Discord quando estiver usando-o", "pt_BR": "Escolha se deseja mostrar Ryujinx ou não na sua atividade do Discord quando estiver usando-o",
"ru_RU": "Включает или отключает отображение статуса \"Играет в игру\" в Discord", "ru_RU": "Включает или отключает отображение статуса «Играет в игру» в Discord",
"sv_SE": "Välj huruvida Ryujinx ska visas på din \"spelar för tillfället\" Discord-aktivitet", "sv_SE": "Välj huruvida Ryujinx ska visas på din \"spelar för tillfället\" Discord-aktivitet",
"th_TH": "เลือกว่าจะแสดง Ryujinx ในกิจกรรม Discord \"ที่กำลังเล่นอยู่\" ของคุณหรือไม่?", "th_TH": "เลือกว่าจะแสดง Ryujinx ในกิจกรรม Discord \"ที่กำลังเล่นอยู่\" ของคุณหรือไม่?",
"tr_TR": "Ryujinx'i \"şimdi oynanıyor\" Discord aktivitesinde göstermeyi veya göstermemeyi seçin", "tr_TR": "Ryujinx'i \"şimdi oynanıyor\" Discord aktivitesinde göstermeyi veya göstermemeyi seçin",
@@ -16388,7 +16338,7 @@
"no_NO": "Endre hvordan gjesteminne tilordnes og åpnes. Påvirker emulator CPU-ytelsen veldig mye.\n\nSett til HOST UNCHECKED hvis usikker.", "no_NO": "Endre hvordan gjesteminne tilordnes og åpnes. Påvirker emulator CPU-ytelsen veldig mye.\n\nSett til HOST UNCHECKED hvis usikker.",
"pl_PL": "Zmień sposób mapowania i uzyskiwania dostępu do pamięci gości. Znacznie wpływa na wydajność emulowanego procesora.\n\nUstaw na HOST UNCHECKED, jeśli nie masz pewności.", "pl_PL": "Zmień sposób mapowania i uzyskiwania dostępu do pamięci gości. Znacznie wpływa na wydajność emulowanego procesora.\n\nUstaw na HOST UNCHECKED, jeśli nie masz pewności.",
"pt_BR": "Altera como a memória do convidado é mapeada e acessada. Afeta muito o desempenho da CPU emulada.\n\nDefina como HÓSPEDE SEM VERIFICAÇÃO se não tiver certeza.", "pt_BR": "Altera como a memória do convidado é mapeada e acessada. Afeta muito o desempenho da CPU emulada.\n\nDefina como HÓSPEDE SEM VERIFICAÇÃO se não tiver certeza.",
"ru_RU": "Меняет разметку и доступ к гостевой памяти. Значительно влияет на производительность процессора.\n\nРекомендуется оставить \"Хост не установлен\"", "ru_RU": "Меняет разметку и доступ к гостевой памяти. Значительно влияет на производительность процессора.\n\nРекомендуется оставить «Хост не установлен»",
"sv_SE": "Ändra hur gästminne mappas och ges åtkomst till. Påverkar emulerad CPU-prestanda mycket.\n\nStäll in till \"Värd inte kontrollerad\" om du är osäker.", "sv_SE": "Ändra hur gästminne mappas och ges åtkomst till. Påverkar emulerad CPU-prestanda mycket.\n\nStäll in till \"Värd inte kontrollerad\" om du är osäker.",
"th_TH": "เปลี่ยนวิธีการเข้าถึงหน่วยความจำของผู้เยี่ยมชม ส่งผลอย่างมากต่อประสิทธิภาพการทำงานของ CPU ที่จำลอง\n\nตั้งค่าเป็น ไม่ได้ตรวจสอบโฮสต์ หากคุณไม่แน่ใจ", "th_TH": "เปลี่ยนวิธีการเข้าถึงหน่วยความจำของผู้เยี่ยมชม ส่งผลอย่างมากต่อประสิทธิภาพการทำงานของ CPU ที่จำลอง\n\nตั้งค่าเป็น ไม่ได้ตรวจสอบโฮสต์ หากคุณไม่แน่ใจ",
"tr_TR": "Guest hafızasının nasıl tahsis edilip erişildiğini değiştirir. Emüle edilen CPU performansını ciddi biçimde etkiler.\n\nEmin değilseniz HOST UNCHECKED seçeneğine ayarlayın.", "tr_TR": "Guest hafızasının nasıl tahsis edilip erişildiğini değiştirir. Emüle edilen CPU performansını ciddi biçimde etkiler.\n\nEmin değilseniz HOST UNCHECKED seçeneğine ayarlayın.",
@@ -16563,7 +16513,7 @@
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "A caixa de diálogo do Applet do controlador não aparecerá se o controle for desconectado enquanto um aplicativo estiver em execução.\n\nDeixe a opção DESLIGADO se não tiver certeza.", "pt_BR": "A caixa de diálogo do Applet do controlador não aparecerá se o controle for desconectado enquanto um aplicativo estiver em execução.\n\nDeixe a opção DESLIGADO se não tiver certeza.",
"ru_RU": "", "ru_RU": "Диалоговое окно апплета контроллера не будет отображаться, если геймпад отключен во время работы приложения.\n\nОставьте выключенным, если не уверены.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -16663,7 +16613,7 @@
"no_NO": "Dobler spillets gjengivelse.\n\nNoen få spill fungerer kanskje ikke med dette aktivert og kan se veldig pikselert ut selv når gjengivelsen er økt; for de spillene, så kan det hende du må bruke modifikasjoner som fjerner anti-aliasing eller som øker den interne gjengivelsen. For og bruke sistnenvte, så vil du helst bruke \"Native\".\n\nHa til tanke at 4x er unødig for virituelt alle maskiner.", "no_NO": "Dobler spillets gjengivelse.\n\nNoen få spill fungerer kanskje ikke med dette aktivert og kan se veldig pikselert ut selv når gjengivelsen er økt; for de spillene, så kan det hende du må bruke modifikasjoner som fjerner anti-aliasing eller som øker den interne gjengivelsen. For og bruke sistnenvte, så vil du helst bruke \"Native\".\n\nHa til tanke at 4x er unødig for virituelt alle maskiner.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Multiplica a resolução de renderização do jogo.\n\nAlguns jogos podem não funcionar bem com essa opção e apresentar uma aparência pixelada, mesmo com o aumento da resolução; para esses jogos, talvez seja necessário encontrar mods que removam o anti-aliasing ou aumentem a resolução de renderização interna. Ao usar a segunda opção, provavelmente desejará selecionar Nativa.\n\nEssa opção pode ser alterada enquanto um jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nLembre-se de que 4x é exagerado para praticamente qualquer configuração.", "pt_BR": "Multiplica a resolução de renderização do jogo.\n\nAlguns jogos podem não funcionar bem com essa opção e apresentar uma aparência pixelada, mesmo com o aumento da resolução; para esses jogos, talvez seja necessário encontrar mods que removam o anti-aliasing ou aumentem a resolução de renderização interna. Ao usar a segunda opção, provavelmente desejará selecionar Nativa.\n\nEssa opção pode ser alterada enquanto um jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nLembre-se de que 4x é exagerado para praticamente qualquer configuração.",
"ru_RU": "Увеличивает разрешение рендера игры.\n\nНекоторые игры могут не работать с этой настройкой и выглядеть смазано даже когда разрешение увеличено. Для таких игр может потребоваться установка модов, которые убирают сглаживание или увеличивают разрешение рендеринга. \nДля использования последнего, вам нужно будет выбрать опцию \"Нативное\".\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже. Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nИмейте в виду, что \"4x\" является излишеством.", "ru_RU": "Увеличивает разрешение рендера игры.\n\nНекоторые игры могут не работать с этой настройкой и выглядеть смазано даже когда разрешение увеличено. Для таких игр может потребоваться установка модов, которые убирают сглаживание или увеличивают разрешение рендеринга. \nДля использования последнего, вам нужно будет выбрать опцию «Нативное».\n\nЭта опция может быть изменена во время игры по нажатию кнопки «Применить» ниже. Вы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nИмейте в виду, что «4x» является излишеством.",
"sv_SE": "Multiplicerar spelets renderingsupplösning.\n\nNågra spel kanske inte fungerar med detta och ser pixelerade ut även när upplösningen ökas; för dessa spel så kan du behöva hitta moddar som tar bort anti-aliasing eller som ökar deras interna renderingsupplösning. För att använda det senare, kommer du sannolikt vilja välja Inbyggd.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nTänk på att 4x är overkill för praktiskt taget alla maskiner.", "sv_SE": "Multiplicerar spelets renderingsupplösning.\n\nNågra spel kanske inte fungerar med detta och ser pixelerade ut även när upplösningen ökas; för dessa spel så kan du behöva hitta moddar som tar bort anti-aliasing eller som ökar deras interna renderingsupplösning. För att använda det senare, kommer du sannolikt vilja välja Inbyggd.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nTänk på att 4x är overkill för praktiskt taget alla maskiner.",
"th_TH": "คูณความละเอียดการเรนเดอร์ของเกม\n\nเกมบางเกมอาจไม่สามารถใช้งานได้และดูเป็นพิกเซลแม้ว่าความละเอียดจะเพิ่มขึ้นก็ตาม สำหรับเกมเหล่านั้น คุณอาจต้องค้นหาม็อดที่ลบรอยหยักของภาพหรือเพิ่มความละเอียดในการเรนเดอร์ภายใน หากต้องการใช้อย่างหลัง คุณอาจต้องเลือก Native\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำมาใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nโปรดทราบว่า 4x นั้นเกินความจำเป็นสำหรับการตั้งค่าแทบทุกประเภท", "th_TH": "คูณความละเอียดการเรนเดอร์ของเกม\n\nเกมบางเกมอาจไม่สามารถใช้งานได้และดูเป็นพิกเซลแม้ว่าความละเอียดจะเพิ่มขึ้นก็ตาม สำหรับเกมเหล่านั้น คุณอาจต้องค้นหาม็อดที่ลบรอยหยักของภาพหรือเพิ่มความละเอียดในการเรนเดอร์ภายใน หากต้องการใช้อย่างหลัง คุณอาจต้องเลือก Native\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำมาใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nโปรดทราบว่า 4x นั้นเกินความจำเป็นสำหรับการตั้งค่าแทบทุกประเภท",
"tr_TR": "", "tr_TR": "",
@@ -17038,7 +16988,7 @@
"no_NO": "Skriver ut Avalonia (UI)-loggmeldinger i konsollen.", "no_NO": "Skriver ut Avalonia (UI)-loggmeldinger i konsollen.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Imprime mensagens de log do Avalonia (UI) no console.", "pt_BR": "Imprime mensagens de log do Avalonia (UI) no console.",
"ru_RU": "", "ru_RU": "Выводит сообщения журнала Avalonia (интерфейс) в консоли.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -17238,7 +17188,7 @@
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Abre a pasta de capturas de tela do Ryujinx", "pt_BR": "Abre a pasta de capturas de tela do Ryujinx",
"ru_RU": "", "ru_RU": "Открывает папку скриншотов Ryujinx",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -17263,7 +17213,7 @@
"no_NO": "Åpner mappen hvor logger er lagret", "no_NO": "Åpner mappen hvor logger er lagret",
"pl_PL": "Otwiera folder, w którym zapisywane są logi", "pl_PL": "Otwiera folder, w którym zapisywane są logi",
"pt_BR": "Abre a pasta onde os logs são gravados", "pt_BR": "Abre a pasta onde os logs são gravados",
"ru_RU": "Открывает папку в которую записываются логи", "ru_RU": "Открывает папку, в которую записываются логи",
"sv_SE": "Öppnar mappen där loggarna har skrivits till", "sv_SE": "Öppnar mappen där loggarna har skrivits till",
"th_TH": "เปิดโฟลเดอร์ ที่เก็บไฟล์ประวัติ", "th_TH": "เปิดโฟลเดอร์ ที่เก็บไฟล์ประวัติ",
"tr_TR": "Log dosyalarının bulunduğu klasörü açar", "tr_TR": "Log dosyalarının bulunduğu klasörü açar",
@@ -17338,7 +17288,7 @@
"no_NO": "Åpne vindu for brukerprofiler", "no_NO": "Åpne vindu for brukerprofiler",
"pl_PL": "Otwórz okno Menedżera Profili Użytkownika", "pl_PL": "Otwórz okno Menedżera Profili Użytkownika",
"pt_BR": "Abrir Janela de Gerenciamento de Perfis", "pt_BR": "Abrir Janela de Gerenciamento de Perfis",
"ru_RU": "Открыть менеджер учетных записей", "ru_RU": "Открыть менеджер учётных записей",
"sv_SE": "Öppna hanterare för användarprofiler", "sv_SE": "Öppna hanterare för användarprofiler",
"th_TH": "เปิดหน้าต่างตัวจัดการโปรไฟล์ผู้ใช้", "th_TH": "เปิดหน้าต่างตัวจัดการโปรไฟล์ผู้ใช้",
"tr_TR": "Kullanıcı profil yöneticisi penceresini açar", "tr_TR": "Kullanıcı profil yöneticisi penceresini açar",
@@ -17988,7 +17938,7 @@
"no_NO": "Oppdatering tilgjengelig!", "no_NO": "Oppdatering tilgjengelig!",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Atualização Disponível!", "pt_BR": "Atualização Disponível!",
"ru_RU": "", "ru_RU": "Доступно обновление!",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -19788,7 +19738,7 @@
"no_NO": "LED-innstillinger", "no_NO": "LED-innstillinger",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Configurações de LED", "pt_BR": "Configurações de LED",
"ru_RU": "", "ru_RU": "Настройки LED-подсветки",
"sv_SE": "LED-inställningar", "sv_SE": "LED-inställningar",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -20388,7 +20338,7 @@
"no_NO": "Bruker Profiler Behandler", "no_NO": "Bruker Profiler Behandler",
"pl_PL": "Menedżer Profili Użytkowników", "pl_PL": "Menedżer Profili Użytkowników",
"pt_BR": "Gerenciador de Perfis de Usuário", "pt_BR": "Gerenciador de Perfis de Usuário",
"ru_RU": "Менеджер учетных записей", "ru_RU": "Менеджер учётных записей",
"sv_SE": "Hanterare för användarprofiler", "sv_SE": "Hanterare för användarprofiler",
"th_TH": "จัดการโปรไฟล์ผู้ใช้", "th_TH": "จัดการโปรไฟล์ผู้ใช้",
"tr_TR": "Kullanıcı Profillerini Yönet", "tr_TR": "Kullanıcı Profillerini Yönet",
@@ -21713,7 +21663,7 @@
"no_NO": "Velg grafikkkortet som skal brukes sammen med Vulkan grafikkbackenden\n\nPåvirker ikke GPU-er som OpenGL skal bruke.\n\nSett til GPU-merket som \"dGPU\" hvis usikker. Hvis det ikke det er en, la være uberørt.", "no_NO": "Velg grafikkkortet som skal brukes sammen med Vulkan grafikkbackenden\n\nPåvirker ikke GPU-er som OpenGL skal bruke.\n\nSett til GPU-merket som \"dGPU\" hvis usikker. Hvis det ikke det er en, la være uberørt.",
"pl_PL": "Wybierz kartę graficzną, która będzie używana z backendem graficznym Vulkan.\n\nNie wpływa na GPU używane przez OpenGL.\n\nW razie wątpliwości ustaw flagę GPU jako \"dGPU\". Jeśli żadnej nie ma, pozostaw nietknięte.", "pl_PL": "Wybierz kartę graficzną, która będzie używana z backendem graficznym Vulkan.\n\nNie wpływa na GPU używane przez OpenGL.\n\nW razie wątpliwości ustaw flagę GPU jako \"dGPU\". Jeśli żadnej nie ma, pozostaw nietknięte.",
"pt_BR": "Selecione a placa de vídeo que será usada com o renderizador gráfico Vulkan.\n\nNão afeta a GPU que OpenGL usará.\n\nSelecione \"dGPU\" em caso de dúvida. Se não houver nenhuma, não mexa.", "pt_BR": "Selecione a placa de vídeo que será usada com o renderizador gráfico Vulkan.\n\nNão afeta a GPU que OpenGL usará.\n\nSelecione \"dGPU\" em caso de dúvida. Se não houver nenhuma, não mexa.",
"ru_RU": "Выберает видеоадаптер, который будет использоваться графическим бэкендом Vulkan.\n\nЭта настройка не влияет на видеоадаптер, который будет использоваться с OpenGL.\n\nЕсли вы не уверены что нужно выбрать, используйте графический процессор, помеченный как \"dGPU\". Если его нет, оставьте выбор по умолчанию.", "ru_RU": "Выберает видеоадаптер, который будет использоваться графическим бэкендом Vulkan.\n\nЭта настройка не влияет на видеоадаптер, который будет использоваться с OpenGL.\n\nЕсли вы не уверены что нужно выбрать, используйте графический процессор, помеченный как «dGPU». Если его нет, оставьте выбор по умолчанию.",
"sv_SE": "Välj grafikkortet som ska användas med Vulkan-grafikbakänden.\n\nPåverkar inte GPU:n som OpenGL använder.\n\nStäll in till den GPU som flaggats som \"dGPU\" om osäker. Om det inte finns någon, lämna orörd.", "sv_SE": "Välj grafikkortet som ska användas med Vulkan-grafikbakänden.\n\nPåverkar inte GPU:n som OpenGL använder.\n\nStäll in till den GPU som flaggats som \"dGPU\" om osäker. Om det inte finns någon, lämna orörd.",
"th_TH": "เลือกการ์ดจอที่จะใช้กับแบ็กเอนด์กราฟิก Vulkan\n\nไม่ส่งผลต่อ GPU ที่ OpenGL จะใช้\n\nตั้งค่าเป็น GPU ที่ถูกตั้งค่าสถานะเป็น \"dGPU\" ถ้าหากคุณไม่แน่ใจ ,หากไม่มีก็ปล่อยทิ้งไว้โดยไม่ต้องแตะต้องมัน", "th_TH": "เลือกการ์ดจอที่จะใช้กับแบ็กเอนด์กราฟิก Vulkan\n\nไม่ส่งผลต่อ GPU ที่ OpenGL จะใช้\n\nตั้งค่าเป็น GPU ที่ถูกตั้งค่าสถานะเป็น \"dGPU\" ถ้าหากคุณไม่แน่ใจ ,หากไม่มีก็ปล่อยทิ้งไว้โดยไม่ต้องแตะต้องมัน",
"tr_TR": "Vulkan Grafik Arka Ucu ile kullanılacak Ekran Kartını Seçin.\n\nOpenGL'nin kullanacağı GPU'yu etkilemez.\n\n Emin değilseniz \"dGPU\" olarak işaretlenmiş GPU'ya ayarlayın. Eğer yoksa, dokunmadan bırakın.\n", "tr_TR": "Vulkan Grafik Arka Ucu ile kullanılacak Ekran Kartını Seçin.\n\nOpenGL'nin kullanacağı GPU'yu etkilemez.\n\n Emin değilseniz \"dGPU\" olarak işaretlenmiş GPU'ya ayarlayın. Eğer yoksa, dokunmadan bırakın.\n",
@@ -22213,7 +22163,7 @@
"no_NO": "Gjenopprett tapte kontoer", "no_NO": "Gjenopprett tapte kontoer",
"pl_PL": "Odzyskaj Utracone Konta", "pl_PL": "Odzyskaj Utracone Konta",
"pt_BR": "Recuperar Contas Perdidas", "pt_BR": "Recuperar Contas Perdidas",
"ru_RU": "Восстановить учетные записи", "ru_RU": "Восстановить учётные записи",
"sv_SE": "Återskapa förlorade konton", "sv_SE": "Återskapa förlorade konton",
"th_TH": "กู้คืนบัญชีที่สูญหาย", "th_TH": "กู้คืนบัญชีที่สูญหาย",
"tr_TR": "Kayıp Hesapları Kurtar", "tr_TR": "Kayıp Hesapları Kurtar",
@@ -22288,7 +22238,7 @@
"no_NO": "Ingen profiler å gjenopprette", "no_NO": "Ingen profiler å gjenopprette",
"pl_PL": "Brak profili do odzyskania", "pl_PL": "Brak profili do odzyskania",
"pt_BR": "Nenhum perfil para recuperar", "pt_BR": "Nenhum perfil para recuperar",
"ru_RU": "Нет учетных записей для восстановления", "ru_RU": "Нет учётных записей для восстановления",
"sv_SE": "Inga profiler att återskapa", "sv_SE": "Inga profiler att återskapa",
"th_TH": "ไม่มีโปรไฟล์ที่สามารถกู้คืนได้", "th_TH": "ไม่มีโปรไฟล์ที่สามารถกู้คืนได้",
"tr_TR": "Kurtarılacak profil bulunamadı", "tr_TR": "Kurtarılacak profil bulunamadı",
@@ -22313,7 +22263,7 @@
"no_NO": "Aktiverer anti-aliasing til spill render.\n\nFXAA vil gjøre det meste av bildet, mens SMAA vil forsøke å finne berørte kanter og glatte dem ut.\n\nAnbefales ikke til bruk i forbindelse med FSR-skaleringsfilteret.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nForlat på NONE hvis usikker.", "no_NO": "Aktiverer anti-aliasing til spill render.\n\nFXAA vil gjøre det meste av bildet, mens SMAA vil forsøke å finne berørte kanter og glatte dem ut.\n\nAnbefales ikke til bruk i forbindelse med FSR-skaleringsfilteret.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nForlat på NONE hvis usikker.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Aplica anti-aliasing à renderização do jogo.\n\nFXAA borrará a maior parte da imagem, enquanto SMAA tentará identificar e suavizar bordas serrilhadas.\n\nNão é recomendado usar em conjunto com o filtro de escala FSR.\n\nEssa opção pode ser alterada enquanto o jogo está em execução clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nDeixe em NENHUM se estiver em dúvida.", "pt_BR": "Aplica anti-aliasing à renderização do jogo.\n\nFXAA borrará a maior parte da imagem, enquanto SMAA tentará identificar e suavizar bordas serrilhadas.\n\nNão é recomendado usar em conjunto com o filtro de escala FSR.\n\nEssa opção pode ser alterada enquanto o jogo está em execução clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nDeixe em NENHUM se estiver em dúvida.",
"ru_RU": "Применимое сглаживание для рендера.\n\nFXAA размывает большую часть изображения, SMAA попытается найти \"зазубренные\" края и сгладить их.\n\nНе рекомендуется использовать вместе с масштабирующим фильтром FSR.\n\nЭта опция может быть изменена во время игры по нажатию \"Применить\" ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не найдёте подходящую настройку игры.\n\nРекомендуется использовать \"Нет\".", "ru_RU": "Применимое сглаживание для рендера.\n\nFXAA размывает большую часть изображения, SMAA попытается найти «зазубренные» края и сгладить их.\n\nНе рекомендуется использовать вместе с масштабирующим фильтром FSR.\n\nЭта опция может быть изменена во время игры по нажатию «Применить» ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не найдёте подходящую настройку игры.\n\nРекомендуется использовать «Нет».",
"sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.", "sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.",
"th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ", "th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ",
"tr_TR": "", "tr_TR": "",
@@ -22388,7 +22338,7 @@
"no_NO": "Velg det skaleringsfilteret som skal brukes når du bruker oppløsningsskalaen.\n\nBilinear fungerer godt for 3D-spill og er et trygt standardalternativ.\n\nNærmeste anbefales for pixel kunst-spill.\n\nFSR 1.0 er bare et skarpere filter, ikke anbefalt for bruk med FXAA eller SMAA.\n\nOmrådeskalering anbefales når nedskalering er større enn utgangsvinduet. Den kan brukes til å oppnå en superprøvetaket anti-aliasingseffekt når en nedskalerer med mer enn 2x.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nLa være på BILINEAR hvis usikker.", "no_NO": "Velg det skaleringsfilteret som skal brukes når du bruker oppløsningsskalaen.\n\nBilinear fungerer godt for 3D-spill og er et trygt standardalternativ.\n\nNærmeste anbefales for pixel kunst-spill.\n\nFSR 1.0 er bare et skarpere filter, ikke anbefalt for bruk med FXAA eller SMAA.\n\nOmrådeskalering anbefales når nedskalering er større enn utgangsvinduet. Den kan brukes til å oppnå en superprøvetaket anti-aliasingseffekt når en nedskalerer med mer enn 2x.\n\nDette valget kan endres mens et spill kjører ved å klikke \"Apply\" nedenfor; du kan bare flytte innstillingsvinduet til du finner det foretrukne utseendet til et spill.\n\nLa være på BILINEAR hvis usikker.",
"pl_PL": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", "pl_PL": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
"pt_BR": "Escolha o filtro de escala que será aplicado ao usar a escala de resolução.\n\nBilinear funciona bem para jogos 3D e é uma opção padrão segura.\n\nNearest é recomendado para jogos em pixel art.\n\nFSR 1.0 é apenas um filtro de nitidez, não recomendado para uso com FXAA ou SMAA.\n\nEssa opção pode ser alterada enquanto o jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nMantenha em BILINEAR se estiver em dúvida.", "pt_BR": "Escolha o filtro de escala que será aplicado ao usar a escala de resolução.\n\nBilinear funciona bem para jogos 3D e é uma opção padrão segura.\n\nNearest é recomendado para jogos em pixel art.\n\nFSR 1.0 é apenas um filtro de nitidez, não recomendado para uso com FXAA ou SMAA.\n\nEssa opção pode ser alterada enquanto o jogo está em execução, clicando em \"Aplicar\" abaixo; basta mover a janela de configurações para o lado e experimentar até encontrar o visual preferido para o jogo.\n\nMantenha em BILINEAR se estiver em dúvida.",
"ru_RU": "Фильтрация текстур, которая будет применяться при масштабировании.\n\nБилинейная хорошо работает для 3D-игр и является настройкой по умолчанию.\n\nСтупенчатая рекомендуется для пиксельных игр.\n\nFSR это фильтр резкости, который не рекомендуется использовать с FXAA или SMAA.\n\nЭта опция может быть изменена во время игры по нажатию кнопки \"Применить\" ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nРекомендуется использовать \"Билинейная\".", "ru_RU": "Фильтрация текстур, которая будет применяться при масштабировании.\n\nБилинейная хорошо работает для 3D-игр и является настройкой по умолчанию.\n\nСтупенчатая рекомендуется для пиксельных игр.\n\nFSR это фильтр резкости, который не рекомендуется использовать с FXAA или SMAA.\n\nЗональная рекомендуется в случае использования разрешения больше разрешения окна. Можно использовать для достижения эффекта суперсемплига (SSAA) при даунскейле более чем в 2 раза.\n\nЭта опция может быть изменена во время игры по нажатию кнопки «Применить» ниже; \nВы можете просто переместить окно настроек в сторону и поэкспериментировать, пока не подберете подходящие настройки для конкретной игры.\n\nРекомендуется использовать «Билинейная».",
"sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.", "sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.",
"th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม", "th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม",
"tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.", "tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
@@ -22538,7 +22488,7 @@
"no_NO": "Definer FSR 1,0 skarpere nivå. Høyere er skarpere.", "no_NO": "Definer FSR 1,0 skarpere nivå. Høyere er skarpere.",
"pl_PL": "Ustaw poziom ostrzeżenia FSR 1.0. Wyższy jest ostrzejszy.", "pl_PL": "Ustaw poziom ostrzeżenia FSR 1.0. Wyższy jest ostrzejszy.",
"pt_BR": "Defina o nível de nitidez do FSR 1.0. Quanto maior, mais nítido.", "pt_BR": "Defina o nível de nitidez do FSR 1.0. Quanto maior, mais nítido.",
"ru_RU": "Выбор режима работы FSR 1.0. Выше - четче.", "ru_RU": "Выбор режима работы FSR 1.0. Выше четче.",
"sv_SE": "Ställ in nivå för FSR 1.0 sharpening. Högre är skarpare.", "sv_SE": "Ställ in nivå för FSR 1.0 sharpening. Högre är skarpare.",
"th_TH": "ตั้งค่าระดับความคมชัด FSR 1.0 ยิ่งสูงกว่าจะยิ่งคมชัดกว่า", "th_TH": "ตั้งค่าระดับความคมชัด FSR 1.0 ยิ่งสูงกว่าจะยิ่งคมชัดกว่า",
"tr_TR": "", "tr_TR": "",
@@ -22738,7 +22688,7 @@
"no_NO": "Nettverksgrensesnittets grensesnitt brukt for LAN/LDN funksjoner.\n\ni konjuksjon med en VPN eller XLink Kai og ett spill med LAN støtte, kan bli brukt til og spoofe ett \"samme-nettverk\" tilkobling over nettet.\n\nLa være på DEFAULT om usikker.", "no_NO": "Nettverksgrensesnittets grensesnitt brukt for LAN/LDN funksjoner.\n\ni konjuksjon med en VPN eller XLink Kai og ett spill med LAN støtte, kan bli brukt til og spoofe ett \"samme-nettverk\" tilkobling over nettet.\n\nLa være på DEFAULT om usikker.",
"pl_PL": "Interfejs sieciowy używany dla funkcji LAN/LDN.\n\nw połączeniu z VPN lub XLink Kai i grą z obsługą sieci LAN, może być użyty do spoofowania połączenia z tą samą siecią przez Internet.\n\nZostaw DOMYŚLNE, jeśli nie ma pewności.", "pl_PL": "Interfejs sieciowy używany dla funkcji LAN/LDN.\n\nw połączeniu z VPN lub XLink Kai i grą z obsługą sieci LAN, może być użyty do spoofowania połączenia z tą samą siecią przez Internet.\n\nZostaw DOMYŚLNE, jeśli nie ma pewności.",
"pt_BR": "A interface de rede usada para recursos de LAN/LDN.\n\nEm conjunto com uma VPN ou XLink Kai e um jogo com suporte a LAN, pode ser usada para simular uma conexão na mesma rede pela Internet.\n\nMantenha em PADRÃO se estiver em dúvida.", "pt_BR": "A interface de rede usada para recursos de LAN/LDN.\n\nEm conjunto com uma VPN ou XLink Kai e um jogo com suporte a LAN, pode ser usada para simular uma conexão na mesma rede pela Internet.\n\nMantenha em PADRÃO se estiver em dúvida.",
"ru_RU": "Сетевой интерфейс, используемый для функций LAN/LDN.\n\nМожет использоваться для игры через интернет в сочетании с VPN или XLink Kai и игрой с поддержкой LAN.\n\nРекомендуется использовать \"По умолчанию\".", "ru_RU": "Сетевой интерфейс, используемый для функций LAN/LDN.\n\nМожет использоваться для игры через интернет в сочетании с VPN или XLink Kai и игрой с поддержкой LAN.\n\nРекомендуется использовать «По умолчанию».",
"sv_SE": "Nätverksgränssnittet som används för LAN/LDN-funktioner.\n\nTillsammans med en VPN eller XLink Kai och ett spel med LAN-stöd så kan detta användas för att spoofa en same-network-anslutning över internet.\n\nLämna som STANDARD om du är osäker.", "sv_SE": "Nätverksgränssnittet som används för LAN/LDN-funktioner.\n\nTillsammans med en VPN eller XLink Kai och ett spel med LAN-stöd så kan detta användas för att spoofa en same-network-anslutning över internet.\n\nLämna som STANDARD om du är osäker.",
"th_TH": "อินเทอร์เฟซเครือข่ายที่ใช้สำหรับคุณสมบัติ LAN/LDN\n\nเมื่อใช้ร่วมกับ VPN หรือ XLink Kai และเกมที่รองรับ LAN สามารถใช้เพื่อปลอมการเชื่อมต่อเครือข่ายเดียวกันผ่านทางอินเทอร์เน็ต\n\nปล่อยให้เป็น ค่าเริ่มต้น หากคุณไม่แน่ใจ", "th_TH": "อินเทอร์เฟซเครือข่ายที่ใช้สำหรับคุณสมบัติ LAN/LDN\n\nเมื่อใช้ร่วมกับ VPN หรือ XLink Kai และเกมที่รองรับ LAN สามารถใช้เพื่อปลอมการเชื่อมต่อเครือข่ายเดียวกันผ่านทางอินเทอร์เน็ต\n\nปล่อยให้เป็น ค่าเริ่มต้น หากคุณไม่แน่ใจ",
"tr_TR": "", "tr_TR": "",
@@ -22913,7 +22863,7 @@
"no_NO": "Endre LDN flerspillermodus.\n\nLdnMitm vil endre lokal trådløst/lokal spillfunksjonalitet i spill som skal fungere som om den var LAN, noe som tillater lokal, samme nettverk forbindelser med andre Ryujinx instanser og hacket Nintendo Switch konsoller som har installert ldn_mitm-modulen.\n\nFlerspiller krever at alle spillerne er på samme versjon (dvs. Super Smash Bros. Ultimat v13.0.1 kan ikke koble til v13.0.0).\n\nForlat DEAKTIVERT hvis usikker.", "no_NO": "Endre LDN flerspillermodus.\n\nLdnMitm vil endre lokal trådløst/lokal spillfunksjonalitet i spill som skal fungere som om den var LAN, noe som tillater lokal, samme nettverk forbindelser med andre Ryujinx instanser og hacket Nintendo Switch konsoller som har installert ldn_mitm-modulen.\n\nFlerspiller krever at alle spillerne er på samme versjon (dvs. Super Smash Bros. Ultimat v13.0.1 kan ikke koble til v13.0.0).\n\nForlat DEAKTIVERT hvis usikker.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Alterar o modo multiplayer LDN.\n\nLdnMitm modificará a funcionalidade de jogo sem fio/local nos jogos para funcionar como se fosse LAN, permitindo conexões locais, na mesma rede, com outras instâncias do Ryujinx e consoles Nintendo Switch hackeados que possuem o módulo ldn_mitm instalado.\n\nO multiplayer exige que todos os jogadores estejam na mesma versão do jogo (ex.: Super Smash Bros. Ultimate v13.0.1 não consegue se conectar à v13.0.0).\n\nDeixe DESATIVADO se estiver em dúvida.", "pt_BR": "Alterar o modo multiplayer LDN.\n\nLdnMitm modificará a funcionalidade de jogo sem fio/local nos jogos para funcionar como se fosse LAN, permitindo conexões locais, na mesma rede, com outras instâncias do Ryujinx e consoles Nintendo Switch hackeados que possuem o módulo ldn_mitm instalado.\n\nO multiplayer exige que todos os jogadores estejam na mesma versão do jogo (ex.: Super Smash Bros. Ultimate v13.0.1 não consegue se conectar à v13.0.0).\n\nDeixe DESATIVADO se estiver em dúvida.",
"ru_RU": "Меняет многопользовательский режим LDN.\n\nLdnMitm модифицирует функциональность локальной беспроводной/игры на одном устройстве в играх, позволяя играть с другими пользователями Ryujinx или взломанными консолями Nintendo Switch с установленным модулем ldn_mitm, находящимися в одной локальной сети друг с другом.\n\nМногопользовательская игра требует наличия у всех игроков одной и той же версии игры (т.е. Super Smash Bros. Ultimate v13.0.1 не может подключиться к v13.0.0).\n\nРекомендуется оставить отключенным.", "ru_RU": "Меняет многопользовательский режим LDN.\n\nLdnMitm модифицирует функциональность локальной беспроводной/игры на одном устройстве в играх, позволяя играть с другими пользователями Ryujinx или взломанными консолями Nintendo Switch с установленным модулем ldn_mitm, находящимися в одной локальной сети друг с другом.\n\nМногопользовательская игра требует наличия у всех игроков одной и той же версии игры (т.е. Super Smash Bros. Ultimate v13.0.1 не может подключиться к v13.0.0).\n\nРекомендуется оставить выключенным.",
"sv_SE": "Ändra LDN-flerspelarläge\n\nLdnMitm kommer att ändra lokal funktionalitet för trådlös/lokalt spel att fungera som om det vore ett LAN, vilket ger stöd för anslutningar med local och same-network med andra Ryujinx-instanser och hackade Nintendo Switch-konsoller som har modulen ldn_mitm installerad.\n\nFlerspelare kräver att alla spelare har samma spelversion (t.ex. Super Smash Bros. Ultimate v13.0.1 kan inte ansluta till v13.0.0).\n\nLämna INAKTIVERAD om du är osäker.", "sv_SE": "Ändra LDN-flerspelarläge\n\nLdnMitm kommer att ändra lokal funktionalitet för trådlös/lokalt spel att fungera som om det vore ett LAN, vilket ger stöd för anslutningar med local och same-network med andra Ryujinx-instanser och hackade Nintendo Switch-konsoller som har modulen ldn_mitm installerad.\n\nFlerspelare kräver att alla spelare har samma spelversion (t.ex. Super Smash Bros. Ultimate v13.0.1 kan inte ansluta till v13.0.0).\n\nLämna INAKTIVERAD om du är osäker.",
"th_TH": "เปลี่ยนโหมดผู้เล่นหลายคนของ LDN\n\nLdnMitm จะปรับเปลี่ยนฟังก์ชันการเล่นแบบไร้สาย/ภายใน จะให้เกมทำงานเหมือนกับว่าเป็น LAN ช่วยให้สามารถเชื่อมต่อภายในเครือข่ายเดียวกันกับอินสแตนซ์ Ryujinx อื่น ๆ และคอนโซล Nintendo Switch ที่ถูกแฮ็กซึ่งมีโมดูล ldn_mitm ติดตั้งอยู่\n\nผู้เล่นหลายคนต้องการให้ผู้เล่นทุกคนอยู่ในเกมเวอร์ชันเดียวกัน (เช่น Super Smash Bros. Ultimate v13.0.1 ไม่สามารถเชื่อมต่อกับ v13.0.0)\n\nปล่อยให้ปิดการใช้งานหากไม่แน่ใจ", "th_TH": "เปลี่ยนโหมดผู้เล่นหลายคนของ LDN\n\nLdnMitm จะปรับเปลี่ยนฟังก์ชันการเล่นแบบไร้สาย/ภายใน จะให้เกมทำงานเหมือนกับว่าเป็น LAN ช่วยให้สามารถเชื่อมต่อภายในเครือข่ายเดียวกันกับอินสแตนซ์ Ryujinx อื่น ๆ และคอนโซล Nintendo Switch ที่ถูกแฮ็กซึ่งมีโมดูล ldn_mitm ติดตั้งอยู่\n\nผู้เล่นหลายคนต้องการให้ผู้เล่นทุกคนอยู่ในเกมเวอร์ชันเดียวกัน (เช่น Super Smash Bros. Ultimate v13.0.1 ไม่สามารถเชื่อมต่อกับ v13.0.0)\n\nปล่อยให้ปิดการใช้งานหากไม่แน่ใจ",
"tr_TR": "", "tr_TR": "",
@@ -23263,7 +23213,7 @@
"no_NO": "Ugyldig passordfrase! Må være i formatet \"Ryujinx-<8 hex tegn>\"", "no_NO": "Ugyldig passordfrase! Må være i formatet \"Ryujinx-<8 hex tegn>\"",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Frase-senha inválida! Deve estar no formato \"Ryujinx-<8 hex chars>\"", "pt_BR": "Frase-senha inválida! Deve estar no formato \"Ryujinx-<8 hex chars>\"",
"ru_RU": "Неверный пароль! Пароль должен быть в формате \"Ryujinx-<8 шестнадцатеричных символов>\"", "ru_RU": "Неверный пароль! Пароль должен быть в формате «Ryujinx-<8 шестнадцатеричных символов>»",
"sv_SE": "Ogiltig lösenfras! Måste vara i formatet \"Ryujinx-<8 hextecken>\"", "sv_SE": "Ogiltig lösenfras! Måste vara i formatet \"Ryujinx-<8 hextecken>\"",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23413,7 +23363,7 @@
"no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens.", "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Sincronização vertical emulada. 'Switch' emula a taxa de atualização de 60 Hz do Switch. 'Ilimitada' é uma taxa de atualização sem limite.", "pt_BR": "Sincronização vertical emulada. 'Switch' emula a taxa de atualização de 60 Hz do Switch. 'Ilimitada' é uma taxa de atualização sem limite.",
"ru_RU": "Эмулированная вертикальная синхронизация. 'Консоль' эмулирует частоту обновления консоли, равную 60 Гц. 'Без ограничений' - неограниченная частота кадров.", "ru_RU": "Эмулированная вертикальная синхронизация. «Консоль» эмулирует частоту обновления консоли, равную 60 Гц. «Без ограничений» — неограниченная частота кадров.",
"sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens.", "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens.",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23438,7 +23388,7 @@
"no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens. «Egendefinert» emulerer den angitte egendefinerte oppdateringsfrekvensen.", "no_NO": "Emulert vertikal synkronisering. «Switch» emulerer Switchs oppdateringsfrekvens på 60 Hz. «Ubegrenset» er en ubegrenset oppdateringsfrekvens. «Egendefinert» emulerer den angitte egendefinerte oppdateringsfrekvensen.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Sincronização Vertical Emulada. 'Switch' emula a taxa de atualização de 60 Hz do Switch. 'Ilimitada' é uma taxa de atualização sem limite. 'Taxa de atualização personalizada' emula a taxa de atualização personalizada especificada.", "pt_BR": "Sincronização Vertical Emulada. 'Switch' emula a taxa de atualização de 60 Hz do Switch. 'Ilimitada' é uma taxa de atualização sem limite. 'Taxa de atualização personalizada' emula a taxa de atualização personalizada especificada.",
"ru_RU": "Эмулированная вертикальная синхронизация. 'Консоль' эмулирует частоту обновления консоли, равную 60 Гц. 'Без ограничений' - неограниченная частота кадров. 'Пользовательска частота кадров' эмулирует выбранную пользователем частоту кадров.", "ru_RU": "Эмулированная вертикальная синхронизация. «Консоль» эмулирует частоту обновления консоли, равную 60 Гц. «Без ограничений» — неограниченная частота кадров. «Пользовательска частота кадров» эмулирует выбранную пользователем частоту кадров.",
"sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens. 'Anpassad uppdateringsfrekvens' emulerar den angivna anpassade uppdateringsfrekvensen.", "sv_SE": "Emulerad vertikal synk. 'Switch' emulerar Switchens uppdateringsfrekvens på 60Hz. 'Obunden' är en obegränsad uppdateringsfrekvens. 'Anpassad uppdateringsfrekvens' emulerar den angivna anpassade uppdateringsfrekvensen.",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23688,7 +23638,7 @@
"no_NO": "Sist oppdatert: {0}", "no_NO": "Sist oppdatert: {0}",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Última atualização: {0}", "pt_BR": "Última atualização: {0}",
"ru_RU": "", "ru_RU": "Последнее обновление: {0}",
"sv_SE": "Senast uppdaterad: {0}", "sv_SE": "Senast uppdaterad: {0}",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23713,7 +23663,7 @@
"no_NO": "Denne kompatibilitetslisten kan inneholde oppføringer som er tomme for data.\nVær ikke imot å teste spill i statusen «Ingame».", "no_NO": "Denne kompatibilitetslisten kan inneholde oppføringer som er tomme for data.\nVær ikke imot å teste spill i statusen «Ingame».",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Esta lista de compatibilidade pode estar desatualizada.\nNão se oponha a testar os jogos", "pt_BR": "Esta lista de compatibilidade pode estar desatualizada.\nNão se oponha a testar os jogos",
"ru_RU": "", "ru_RU": "В списке совместимости могут содержаться устаревшие записи.\nНе стестняйтесь тестировать игр в статусе «Запускается»",
"sv_SE": "Denna kompatibilitetslista kan innehålla utdaterade poster.\nTesta gärna spelen som listas med \"Spelproblem\"-status.", "sv_SE": "Denna kompatibilitetslista kan innehålla utdaterade poster.\nTesta gärna spelen som listas med \"Spelproblem\"-status.",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23738,7 +23688,7 @@
"no_NO": "Søk i kompatibilitetsoppføringer...", "no_NO": "Søk i kompatibilitetsoppføringer...",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Pesquisa de compatibilidade", "pt_BR": "Pesquisa de compatibilidade",
"ru_RU": "", "ru_RU": "Поиск записей о совместимости...",
"sv_SE": "Sök i kompatibilitetsposter...", "sv_SE": "Sök i kompatibilitetsposter...",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23763,7 +23713,7 @@
"no_NO": "Åpne kompatibilitetslisten", "no_NO": "Åpne kompatibilitetslisten",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Lista de Compatibilidade", "pt_BR": "Lista de Compatibilidade",
"ru_RU": "", "ru_RU": "Открыть список совместимости",
"sv_SE": "Öppna kompatibilitetslistan", "sv_SE": "Öppna kompatibilitetslistan",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23788,7 +23738,7 @@
"no_NO": "Vis bare eide spill", "no_NO": "Vis bare eide spill",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Mostrar apenas jogos disponíveis", "pt_BR": "Mostrar apenas jogos disponíveis",
"ru_RU": "", "ru_RU": "Показывать только свои игры",
"sv_SE": "Visa endast ägda spel", "sv_SE": "Visa endast ägda spel",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23813,7 +23763,7 @@
"no_NO": "Spillbar", "no_NO": "Spillbar",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Jogável", "pt_BR": "Jogável",
"ru_RU": "", "ru_RU": "Играбельно",
"sv_SE": "Spelbart", "sv_SE": "Spelbart",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23838,7 +23788,7 @@
"no_NO": "", "no_NO": "",
"pl_PL": "", "pl_PL": "",
"pt_BR": "No jogo", "pt_BR": "No jogo",
"ru_RU": "", "ru_RU": "Запускается",
"sv_SE": "Spelproblem", "sv_SE": "Spelproblem",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23863,7 +23813,7 @@
"no_NO": "Menyer", "no_NO": "Menyer",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Menu", "pt_BR": "Menu",
"ru_RU": "", "ru_RU": "Меню",
"sv_SE": "Menyer", "sv_SE": "Menyer",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23888,7 +23838,7 @@
"no_NO": "Starter", "no_NO": "Starter",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Inicializa", "pt_BR": "Inicializa",
"ru_RU": "", "ru_RU": "Стартует",
"sv_SE": "Startar", "sv_SE": "Startar",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23913,7 +23863,7 @@
"no_NO": "Ingenting", "no_NO": "Ingenting",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Nada", "pt_BR": "Nada",
"ru_RU": "", "ru_RU": "Ничего",
"sv_SE": "Ingenting", "sv_SE": "Ingenting",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23938,7 +23888,7 @@
"no_NO": "Starter opp og spiller uten krasj eller GPU-feil av noe slag, og med en hastighet som er rask nok til å ha rimelig glede av på en gjennomsnittlig PC.", "no_NO": "Starter opp og spiller uten krasj eller GPU-feil av noe slag, og med en hastighet som er rask nok til å ha rimelig glede av på en gjennomsnittlig PC.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Inicializa e roda sem travamentos ou bugs de GPU de qualquer tipo, e em uma velocidade rápida o suficiente para ser aproveitado em um PC comum.", "pt_BR": "Inicializa e roda sem travamentos ou bugs de GPU de qualquer tipo, e em uma velocidade rápida o suficiente para ser aproveitado em um PC comum.",
"ru_RU": "", "ru_RU": "Запускается и работает без любого рода сбоев или графисечких ошибок и на скорости, достаточной для работы на обычном ПК.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23963,7 +23913,7 @@
"no_NO": "Starter og går i gang i spillet, men lider av ett eller flere av følgende: krasjer, fastlåser, GPU-feil, distraherende dårlig lyd eller er rett og slett for tregt. Spillet kan fortsatt spilles helt til ende, men ikke slik det er ment å spilles.", "no_NO": "Starter og går i gang i spillet, men lider av ett eller flere av følgende: krasjer, fastlåser, GPU-feil, distraherende dårlig lyd eller er rett og slett for tregt. Spillet kan fortsatt spilles helt til ende, men ikke slik det er ment å spilles.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Inicializa e entra no jogo, mas sofre de um ou mais dos seguintes: travamentos, deadlocks, bugs de GPU, áudio ruim que distrai ou é simplesmente muito lento. O jogo ainda pode ser jogado até o fim, mas não da forma como foi criado para ser jogado.", "pt_BR": "Inicializa e entra no jogo, mas sofre de um ou mais dos seguintes: travamentos, deadlocks, bugs de GPU, áudio ruim que distrai ou é simplesmente muito lento. O jogo ainda pode ser jogado até o fim, mas não da forma como foi criado para ser jogado.",
"ru_RU": "", "ru_RU": "Запускается и работает, но возникает одна или несколько из следующих проблем: сбои, взаимоблокировки, ошибки GPU, отвлекающие звуки или просто слишком медленная работа. Возможно, игру всё же удастся пройти до конца, но не так, как она задумана.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -23988,7 +23938,7 @@
"no_NO": "Starter opp og går forbi tittelskjermen, men kommer ikke inn i hovedspillet.", "no_NO": "Starter opp og går forbi tittelskjermen, men kommer ikke inn i hovedspillet.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Inicializa e passa da tela de título, mas não entra no jogo principal.", "pt_BR": "Inicializa e passa da tela de título, mas não entra no jogo principal.",
"ru_RU": "", "ru_RU": "Загружается титульный экран и можно перейти дальше, но сама игра не работает.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -24013,7 +23963,7 @@
"no_NO": "Starter, men kommer ikke lenger enn til tittelskjermen.", "no_NO": "Starter, men kommer ikke lenger enn til tittelskjermen.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Inizializa, mas não passa da tela de título.", "pt_BR": "Inizializa, mas não passa da tela de título.",
"ru_RU": "", "ru_RU": "Загружается, но не проходит дальше титульного экрана.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -24038,7 +23988,7 @@
"no_NO": "Starter ikke opp eller viser ingen tegn til aktivitet.", "no_NO": "Starter ikke opp eller viser ingen tegn til aktivitet.",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Não inicializa ou não mostra sinais de atividade.", "pt_BR": "Não inicializa ou não mostra sinais de atividade.",
"ru_RU": "", "ru_RU": "Не запускается или не подаёт признаков жизни.",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -24063,7 +24013,7 @@
"no_NO": "Velg en DLC og hente ut", "no_NO": "Velg en DLC og hente ut",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Selecione um DLC para Extrair", "pt_BR": "Selecione um DLC para Extrair",
"ru_RU": "", "ru_RU": "Выберите DLC для извлечения",
"sv_SE": "Välj en DLC att extrahera", "sv_SE": "Välj en DLC att extrahera",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -24088,7 +24038,7 @@
"no_NO": "Rikt nærværsbilde", "no_NO": "Rikt nærværsbilde",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Imagem da Presença do Discord", "pt_BR": "Imagem da Presença do Discord",
"ru_RU": "", "ru_RU": "Изображение для статуса активности",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",
@@ -24113,7 +24063,7 @@
"no_NO": "Dynamisk og rik tilstedeværelse", "no_NO": "Dynamisk og rik tilstedeværelse",
"pl_PL": "", "pl_PL": "",
"pt_BR": "Presença Dinâmica do Discord", "pt_BR": "Presença Dinâmica do Discord",
"ru_RU": "", "ru_RU": "Динамический статус активности",
"sv_SE": "", "sv_SE": "",
"th_TH": "", "th_TH": "",
"tr_TR": "", "tr_TR": "",

View File

@@ -189,7 +189,7 @@ namespace Ryujinx.Ava.UI.Controls
DirectoryInfo mainDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "0")); DirectoryInfo mainDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "0"));
DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "1")); DirectoryInfo backupDir = new(Path.Combine(AppDataManager.GamesDirPath, viewModel.SelectedApplication.IdString, "cache", "cpu", "1"));
List<FileInfo> cacheFiles = new(); List<FileInfo> cacheFiles = [];
if (mainDir.Exists) if (mainDir.Exists)
{ {

View File

@@ -793,7 +793,7 @@ namespace Ryujinx.Ava.UI.ViewModels
return false; return false;
} }
private async Task HandleFirmwareInstallation(string filename) public async Task HandleFirmwareInstallation(string filename)
{ {
try try
{ {

View File

@@ -133,12 +133,6 @@
<ComboBoxItem> <ComboBoxItem>
<TextBlock Text="{ext:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" /> <TextBlock Text="{ext:Locale SettingsTabSystemSystemLanguageBrazilianPortuguese}" />
</ComboBoxItem> </ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="{ext:Locale SettingsTabSystemSystemLanguageSwedish}" />
</ComboBoxItem>
<ComboBoxItem>
<TextBlock Text="{ext:Locale SettingsTabSystemSystemLanguageNorwegian}" />
</ComboBoxItem>
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<StackPanel <StackPanel

View File

@@ -140,7 +140,20 @@ namespace Ryujinx.Ava.UI.Windows
NotificationHelper.SetNotificationManager(this); NotificationHelper.SetNotificationManager(this);
Executor.ExecuteBackgroundAsync(ShowIntelMacWarningAsync); Executor.ExecuteBackgroundAsync(async () =>
{
await ShowIntelMacWarningAsync();
FilePath firmwarePath = CommandLineState.FirmwareToInstallPathArg;
if (firmwarePath is not null)
{
if ((firmwarePath.ExistsAsFile && firmwarePath.Extension is "xci" or "zip") ||
firmwarePath.ExistsAsDirectory)
await Dispatcher.UIThread.InvokeAsync(() =>
ViewModel.HandleFirmwareInstallation(firmwarePath));
else
Logger.Notice.Print(LogClass.UI, "Invalid firmware type provided. Path must be a directory, or a .zip or .xci file.");
}
});
} }
private void OnScalingChanged(object sender, EventArgs e) private void OnScalingChanged(object sender, EventArgs e)

View File

@@ -1,3 +1,4 @@
using Gommon;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using System.Collections.Generic; using System.Collections.Generic;
@@ -13,6 +14,7 @@ namespace Ryujinx.Ava.Utilities
public static string OverrideBackendThreading { get; private set; } public static string OverrideBackendThreading { get; private set; }
public static string OverrideHideCursor { get; private set; } public static string OverrideHideCursor { get; private set; }
public static string BaseDirPathArg { get; private set; } public static string BaseDirPathArg { get; private set; }
public static FilePath FirmwareToInstallPathArg { get; private set; }
public static string Profile { get; private set; } public static string Profile { get; private set; }
public static string LaunchPathArg { get; private set; } public static string LaunchPathArg { get; private set; }
public static string LaunchApplicationId { get; private set; } public static string LaunchApplicationId { get; private set; }
@@ -41,6 +43,19 @@ namespace Ryujinx.Ava.Utilities
BaseDirPathArg = args[++i]; BaseDirPathArg = args[++i];
arguments.Add(arg);
arguments.Add(args[i]);
break;
case "--install-firmware":
if (i + 1 >= args.Length)
{
Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");
continue;
}
FirmwareToInstallPathArg = new FilePath(args[++i]);
arguments.Add(arg); arguments.Add(arg);
arguments.Add(args[i]); arguments.Add(args[i]);
break; break;