Adress requested changes

This commit is contained in:
Kenny van Vulpen 2018-10-24 07:00:31 +02:00
commit f7c0506e61
No known key found for this signature in database
GPG key ID: BBD011B8B9C45F87
19 changed files with 205 additions and 197 deletions

View file

@ -7,7 +7,7 @@ namespace ChocolArm64.Decoder
public struct BitMask public struct BitMask
{ {
public long WMask; public long WMask;
public long Mask; public long TMask;
public int Pos; public int Pos;
public int Shift; public int Shift;
public bool IsUndefined; public bool IsUndefined;
@ -54,7 +54,7 @@ namespace ChocolArm64.Decoder
return new BitMask() return new BitMask()
{ {
WMask = ABitUtils.Replicate(wMask, size), WMask = ABitUtils.Replicate(wMask, size),
Mask = ABitUtils.Replicate(mask, size), TMask = ABitUtils.Replicate(mask, size),
Pos = immS, Pos = immS,
Shift = immR Shift = immR

View file

@ -5,7 +5,7 @@ namespace ChocolArm64.Decoder
class AOpCodeBfm : AOpCodeAlu class AOpCodeBfm : AOpCodeAlu
{ {
public long WMask { get; private set; } public long WMask { get; private set; }
public long Mask { get; private set; } public long TMask { get; private set; }
public int Pos { get; private set; } public int Pos { get; private set; }
public int Shift { get; private set; } public int Shift { get; private set; }
@ -21,7 +21,7 @@ namespace ChocolArm64.Decoder
} }
WMask = bm.WMask; WMask = bm.WMask;
Mask = bm.Mask; TMask = bm.TMask;
Pos = bm.Pos; Pos = bm.Pos;
Shift = bm.Shift; Shift = bm.Shift;
} }

View file

@ -14,13 +14,13 @@ namespace ChocolArm64.Instruction
EmitBfmLoadRn(context); EmitBfmLoadRn(context);
context.EmitLdintzr(op.Rd); context.EmitLdintzr(op.Rd);
context.EmitLdc_I(~op.WMask & op.Mask); context.EmitLdc_I(~op.WMask & op.TMask);
context.Emit(OpCodes.And); context.Emit(OpCodes.And);
context.Emit(OpCodes.Or); context.Emit(OpCodes.Or);
context.EmitLdintzr(op.Rd); context.EmitLdintzr(op.Rd);
context.EmitLdc_I(~op.Mask); context.EmitLdc_I(~op.TMask);
context.Emit(OpCodes.And); context.Emit(OpCodes.And);
context.Emit(OpCodes.Or); context.Emit(OpCodes.Or);
@ -63,7 +63,7 @@ namespace ChocolArm64.Instruction
context.EmitLsl(bitsCount - 1 - op.Pos); context.EmitLsl(bitsCount - 1 - op.Pos);
context.EmitAsr(bitsCount - 1); context.EmitAsr(bitsCount - 1);
context.EmitLdc_I(~op.Mask); context.EmitLdc_I(~op.TMask);
context.Emit(OpCodes.And); context.Emit(OpCodes.And);
context.Emit(OpCodes.Or); context.Emit(OpCodes.Or);
@ -200,7 +200,7 @@ namespace ChocolArm64.Instruction
context.EmitRor(op.Shift); context.EmitRor(op.Shift);
context.EmitLdc_I(op.WMask & op.Mask); context.EmitLdc_I(op.WMask & op.TMask);
context.Emit(OpCodes.And); context.Emit(OpCodes.And);
} }

View file

@ -543,17 +543,17 @@ namespace ChocolArm64.Instruction
return Sha256Hash(hashAbcd, hashEfgh, wk, false); return Sha256Hash(hashAbcd, hashEfgh, wk, false);
} }
public static Vector128<float> SchedulePart1(Vector128<float> w03, Vector128<float> w47) public static Vector128<float> SchedulePart1(Vector128<float> w0_3, Vector128<float> w4_7)
{ {
Vector128<float> result = new Vector128<float>(); Vector128<float> result = new Vector128<float>();
for (int e = 0; e <= 3; e++) for (int e = 0; e <= 3; e++)
{ {
uint elt = (uint)VectorExtractIntZx(e <= 2 ? w03 : w47, (byte)(e <= 2 ? e + 1 : 0), 2); uint elt = (uint)VectorExtractIntZx(e <= 2 ? w0_3 : w4_7, (byte)(e <= 2 ? e + 1 : 0), 2);
elt = elt.Ror(7) ^ elt.Ror(18) ^ elt.Lsr(3); elt = elt.Ror(7) ^ elt.Ror(18) ^ elt.Lsr(3);
elt += (uint)VectorExtractIntZx(w03, (byte)e, 2); elt += (uint)VectorExtractIntZx(w0_3, (byte)e, 2);
result = VectorInsertInt((ulong)elt, result, (byte)e, 2); result = VectorInsertInt((ulong)elt, result, (byte)e, 2);
} }
@ -561,11 +561,11 @@ namespace ChocolArm64.Instruction
return result; return result;
} }
public static Vector128<float> SchedulePart2(Vector128<float> w03, Vector128<float> w811, Vector128<float> w1215) public static Vector128<float> SchedulePart2(Vector128<float> w0_3, Vector128<float> w8_11, Vector128<float> w1_215)
{ {
Vector128<float> result = new Vector128<float>(); Vector128<float> result = new Vector128<float>();
ulong t1 = VectorExtractIntZx(w1215, (byte)1, 3); ulong t1 = VectorExtractIntZx(w1_215, (byte)1, 3);
for (int e = 0; e <= 1; e++) for (int e = 0; e <= 1; e++)
{ {
@ -573,8 +573,8 @@ namespace ChocolArm64.Instruction
elt = elt.Ror(17) ^ elt.Ror(19) ^ elt.Lsr(10); elt = elt.Ror(17) ^ elt.Ror(19) ^ elt.Lsr(10);
elt += (uint)VectorExtractIntZx(w03, (byte)e, 2); elt += (uint)VectorExtractIntZx(w0_3, (byte)e, 2);
elt += (uint)VectorExtractIntZx(w811, (byte)(e + 1), 2); elt += (uint)VectorExtractIntZx(w8_11, (byte)(e + 1), 2);
result = VectorInsertInt((ulong)elt, result, (byte)e, 2); result = VectorInsertInt((ulong)elt, result, (byte)e, 2);
} }
@ -587,8 +587,8 @@ namespace ChocolArm64.Instruction
elt = elt.Ror(17) ^ elt.Ror(19) ^ elt.Lsr(10); elt = elt.Ror(17) ^ elt.Ror(19) ^ elt.Lsr(10);
elt += (uint)VectorExtractIntZx(w03, (byte)e, 2); elt += (uint)VectorExtractIntZx(w0_3, (byte)e, 2);
elt += (uint)VectorExtractIntZx(e == 2 ? w811 : w1215, (byte)(e == 2 ? 3 : 0), 2); elt += (uint)VectorExtractIntZx(e == 2 ? w8_11 : w1_215, (byte)(e == 2 ? 3 : 0), 2);
result = VectorInsertInt((ulong)elt, result, (byte)e, 2); result = VectorInsertInt((ulong)elt, result, (byte)e, 2);
} }
@ -600,21 +600,21 @@ namespace ChocolArm64.Instruction
{ {
for (int e = 0; e <= 3; e++) for (int e = 0; e <= 3; e++)
{ {
uint chs = ShAchoose((uint)VectorExtractIntZx(y, (byte)0, 2), uint chs = ShaChoose((uint)VectorExtractIntZx(y, (byte)0, 2),
(uint)VectorExtractIntZx(y, (byte)1, 2), (uint)VectorExtractIntZx(y, (byte)1, 2),
(uint)VectorExtractIntZx(y, (byte)2, 2)); (uint)VectorExtractIntZx(y, (byte)2, 2));
uint maj = ShAmajority((uint)VectorExtractIntZx(x, (byte)0, 2), uint maj = ShaMajority((uint)VectorExtractIntZx(x, (byte)0, 2),
(uint)VectorExtractIntZx(x, (byte)1, 2), (uint)VectorExtractIntZx(x, (byte)1, 2),
(uint)VectorExtractIntZx(x, (byte)2, 2)); (uint)VectorExtractIntZx(x, (byte)2, 2));
uint t1 = (uint)VectorExtractIntZx(y, (byte)3, 2); uint t1 = (uint)VectorExtractIntZx(y, (byte)3, 2);
t1 += ShAhashSigma1((uint)VectorExtractIntZx(y, (byte)0, 2)) + chs; t1 += ShaHashSigma1((uint)VectorExtractIntZx(y, (byte)0, 2)) + chs;
t1 += (uint)VectorExtractIntZx(w, (byte)e, 2); t1 += (uint)VectorExtractIntZx(w, (byte)e, 2);
uint t2 = t1 + (uint)VectorExtractIntZx(x, (byte)3, 2); uint t2 = t1 + (uint)VectorExtractIntZx(x, (byte)3, 2);
x = VectorInsertInt((ulong)t2, x, (byte)3, 2); x = VectorInsertInt((ulong)t2, x, (byte)3, 2);
t2 = t1 + ShAhashSigma0((uint)VectorExtractIntZx(x, (byte)0, 2)) + maj; t2 = t1 + ShaHashSigma0((uint)VectorExtractIntZx(x, (byte)0, 2)) + maj;
y = VectorInsertInt((ulong)t2, y, (byte)3, 2); y = VectorInsertInt((ulong)t2, y, (byte)3, 2);
Rol32_256(ref y, ref x); Rol32_256(ref y, ref x);
@ -640,22 +640,22 @@ namespace ChocolArm64.Instruction
x = VectorInsertInt((ulong)yE3, x, (byte)0, 2); x = VectorInsertInt((ulong)yE3, x, (byte)0, 2);
} }
private static uint ShAhashSigma0(uint x) private static uint ShaHashSigma0(uint x)
{ {
return x.Ror(2) ^ x.Ror(13) ^ x.Ror(22); return x.Ror(2) ^ x.Ror(13) ^ x.Ror(22);
} }
private static uint ShAhashSigma1(uint x) private static uint ShaHashSigma1(uint x)
{ {
return x.Ror(6) ^ x.Ror(11) ^ x.Ror(25); return x.Ror(6) ^ x.Ror(11) ^ x.Ror(25);
} }
private static uint ShAmajority(uint x, uint y, uint z) private static uint ShaMajority(uint x, uint y, uint z)
{ {
return (x & y) | ((x | y) & z); return (x & y) | ((x | y) & z);
} }
private static uint ShAchoose(uint x, uint y, uint z) private static uint ShaChoose(uint x, uint y, uint z)
{ {
return ((y ^ z) & x) ^ z; return ((y ^ z) & x) ^ z;
} }

View file

@ -9,7 +9,7 @@ namespace ChocolArm64.Instruction
{ {
static class AVectorHelper static class AVectorHelper
{ {
private static readonly Vector128<float> Zero32128Mask; private static readonly Vector128<float> Zero32_128Mask;
static AVectorHelper() static AVectorHelper()
{ {
@ -18,7 +18,7 @@ namespace ChocolArm64.Instruction
throw new PlatformNotSupportedException(); throw new PlatformNotSupportedException();
} }
Zero32128Mask = Sse.StaticCast<uint, float>(Sse2.SetVector128(0, 0, 0, 0xffffffff)); Zero32_128Mask = Sse.StaticCast<uint, float>(Sse2.SetVector128(0, 0, 0, 0xffffffff));
} }
public static void EmitCall(AilEmitterCtx context, string name64, string name128) public static void EmitCall(AilEmitterCtx context, string name64, string name128)
@ -583,7 +583,7 @@ namespace ChocolArm64.Instruction
{ {
if (Sse.IsSupported) if (Sse.IsSupported)
{ {
return Sse.And(vector, Zero32128Mask); return Sse.And(vector, Zero32_128Mask);
} }
throw new PlatformNotSupportedException(); throw new PlatformNotSupportedException();

View file

@ -12,14 +12,14 @@ namespace ChocolArm64.Instruction32
{ {
case ACond.Eq: return state.Zero; case ACond.Eq: return state.Zero;
case ACond.Ne: return !state.Zero; case ACond.Ne: return !state.Zero;
case ACond.GeUn: return state.Carry; case ACond.GeUn: return state.Carry;
case ACond.LtUn: return !state.Carry; case ACond.LtUn: return !state.Carry;
case ACond.Mi: return state.Negative; case ACond.Mi: return state.Negative;
case ACond.Pl: return !state.Negative; case ACond.Pl: return !state.Negative;
case ACond.Vs: return state.Overflow; case ACond.Vs: return state.Overflow;
case ACond.Vc: return !state.Overflow; case ACond.Vc: return !state.Overflow;
case ACond.GtUn: return state.Carry && !state.Zero; case ACond.GtUn: return state.Carry && !state.Zero;
case ACond.LeUn: return !state.Carry && state.Zero; case ACond.LeUn: return !state.Carry && state.Zero;
case ACond.Ge: return state.Negative == state.Overflow; case ACond.Ge: return state.Negative == state.Overflow;
case ACond.Lt: return state.Negative != state.Overflow; case ACond.Lt: return state.Negative != state.Overflow;
case ACond.Gt: return state.Negative == state.Overflow && !state.Zero; case ACond.Gt: return state.Negative == state.Overflow && !state.Zero;

View file

@ -178,10 +178,10 @@ namespace ChocolArm64.Translation
{ {
{ ACond.Eq, OpCodes.Beq }, { ACond.Eq, OpCodes.Beq },
{ ACond.Ne, OpCodes.Bne_Un }, { ACond.Ne, OpCodes.Bne_Un },
{ ACond.GeUn, OpCodes.Bge_Un }, { ACond.GeUn, OpCodes.Bge_Un },
{ ACond.LtUn, OpCodes.Blt_Un }, { ACond.LtUn, OpCodes.Blt_Un },
{ ACond.GtUn, OpCodes.Bgt_Un }, { ACond.GtUn, OpCodes.Bgt_Un },
{ ACond.LeUn, OpCodes.Ble_Un }, { ACond.LeUn, OpCodes.Ble_Un },
{ ACond.Ge, OpCodes.Bge }, { ACond.Ge, OpCodes.Bge },
{ ACond.Lt, OpCodes.Blt }, { ACond.Lt, OpCodes.Blt },
{ ACond.Gt, OpCodes.Bgt }, { ACond.Gt, OpCodes.Bgt },

View file

@ -2,7 +2,7 @@
{ {
public struct ColorMaskRgba public struct ColorMaskRgba
{ {
public static ColorMaskRgba Default { get; } = new ColorMaskRgba() public static ColorMaskRgba Default { get; } = new ColorMaskRgba()
{ {
Red = true, Red = true,
Green = true, Green = true,
@ -11,8 +11,8 @@
}; };
public bool Red; public bool Red;
public bool Green; public bool Green;
public bool Blue; public bool Blue;
public bool Alpha; public bool Alpha;
} }

View file

@ -171,15 +171,15 @@ namespace Ryujinx.Graphics.Gal.OpenGL
} }
} }
private int RingDelta(int old, int New) private int RingDelta(int oldValue, int newValue)
{ {
if ((uint)New < (uint)old) if ((uint)newValue < (uint)oldValue)
{ {
return New + (~old + 1); return newValue + (~oldValue + 1);
} }
else else
{ {
return New - old; return newValue - oldValue;
} }
} }
} }

View file

@ -5,13 +5,13 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{ {
static class OglExtension static class OglExtension
{ {
private static Lazy<bool> _sEnhancedLayouts = new Lazy<bool>(() => HasExtension("GL_ARB_enhanced_layouts")); private static Lazy<bool> _EnhancedLayouts = new Lazy<bool>(() => HasExtension("GL_ARB_enhanced_layouts"));
private static Lazy<bool> _sTextureMirrorClamp = new Lazy<bool>(() => HasExtension("GL_EXT_texture_mirror_clamp")); private static Lazy<bool> _TextureMirrorClamp = new Lazy<bool>(() => HasExtension("GL_EXT_texture_mirror_clamp"));
private static Lazy<bool> _sViewportArray = new Lazy<bool>(() => HasExtension("GL_ARB_viewport_array")); private static Lazy<bool> _ViewportArray = new Lazy<bool>(() => HasExtension("GL_ARB_viewport_array"));
public static bool EnhancedLayouts => _sEnhancedLayouts.Value; public static bool EnhancedLayouts => _EnhancedLayouts.Value;
public static bool TextureMirrorClamp => _sTextureMirrorClamp.Value; public static bool TextureMirrorClamp => _TextureMirrorClamp.Value;
public static bool ViewportArray => _sViewportArray.Value; public static bool ViewportArray => _ViewportArray.Value;
private static bool HasExtension(string name) private static bool HasExtension(string name)
{ {

View file

@ -90,50 +90,51 @@ namespace Ryujinx.Graphics.Gal.OpenGL
_shader = shader; _shader = shader;
//These values match OpenGL's defaults //These values match OpenGL's defaults
_old = new GalPipelineState _old = new GalPipelineState
{ {
FrontFace = GalFrontFace.Ccw, FrontFace = GalFrontFace.Ccw,
CullFaceEnabled = false, CullFaceEnabled = false,
CullFace = GalCullFace.Back, CullFace = GalCullFace.Back,
DepthTestEnabled = false,
DepthWriteEnabled = true,
DepthFunc = GalComparisonOp.Less,
DepthTestEnabled = false,
DepthWriteEnabled = true,
DepthFunc = GalComparisonOp.Less,
DepthRangeNear = 0,
DepthRangeFar = 1,
StencilTestEnabled = false, StencilTestEnabled = false,
StencilBackFuncFunc = GalComparisonOp.Always, StencilBackFuncFunc = GalComparisonOp.Always,
StencilBackFuncRef = 0, StencilBackFuncRef = 0,
StencilBackFuncMask = UInt32.MaxValue, StencilBackFuncMask = UInt32.MaxValue,
StencilBackOpFail = GalStencilOp.Keep, StencilBackOpFail = GalStencilOp.Keep,
StencilBackOpZFail = GalStencilOp.Keep, StencilBackOpZFail = GalStencilOp.Keep,
StencilBackOpZPass = GalStencilOp.Keep, StencilBackOpZPass = GalStencilOp.Keep,
StencilBackMask = UInt32.MaxValue, StencilBackMask = UInt32.MaxValue,
StencilFrontFuncFunc = GalComparisonOp.Always, StencilFrontFuncFunc = GalComparisonOp.Always,
StencilFrontFuncRef = 0, StencilFrontFuncRef = 0,
StencilFrontFuncMask = UInt32.MaxValue, StencilFrontFuncMask = UInt32.MaxValue,
StencilFrontOpFail = GalStencilOp.Keep, StencilFrontOpFail = GalStencilOp.Keep,
StencilFrontOpZFail = GalStencilOp.Keep, StencilFrontOpZFail = GalStencilOp.Keep,
StencilFrontOpZPass = GalStencilOp.Keep, StencilFrontOpZPass = GalStencilOp.Keep,
StencilFrontMask = UInt32.MaxValue, StencilFrontMask = UInt32.MaxValue,
BlendEnabled = false, BlendEnabled = false,
BlendSeparateAlpha = false, BlendSeparateAlpha = false,
BlendEquationRgb = 0, BlendEquationRgb = 0,
BlendFuncSrcRgb = GalBlendFactor.One, BlendFuncSrcRgb = GalBlendFactor.One,
BlendFuncDstRgb = GalBlendFactor.Zero, BlendFuncDstRgb = GalBlendFactor.Zero,
BlendEquationAlpha = 0, BlendEquationAlpha = 0,
BlendFuncSrcAlpha = GalBlendFactor.One, BlendFuncSrcAlpha = GalBlendFactor.One,
BlendFuncDstAlpha = GalBlendFactor.Zero, BlendFuncDstAlpha = GalBlendFactor.Zero,
ColorMask = ColorMaskRgba.Default, ColorMask = ColorMaskRgba.Default,
PrimitiveRestartEnabled = false, PrimitiveRestartEnabled = false,
PrimitiveRestartIndex = 0 PrimitiveRestartIndex = 0
}; };
for (int index = 0; index < GalPipelineState.RenderTargetsCount; index++) for (int index = 0; index < GalPipelineState.RenderTargetsCount; index++)
{ {
@ -195,11 +196,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL
} }
} }
if (New.DepthRangeNear != _old.DepthRangeNear || if (New.DepthRangeNear != _old.DepthRangeNear ||
New.DepthRangeFar != _old.DepthRangeFar) New.DepthRangeFar != _old.DepthRangeFar)
{ {
GL.DepthRange(New.DepthRangeNear, New.DepthRangeFar); GL.DepthRange(New.DepthRangeNear, New.DepthRangeFar);
} }
if (New.StencilTestEnabled != _old.StencilTestEnabled) if (New.StencilTestEnabled != _old.StencilTestEnabled)
{ {

View file

@ -55,29 +55,29 @@ namespace Ryujinx.Graphics.Gal.Shader
private string _stagePrefix; private string _stagePrefix;
private Dictionary<ShaderIrOp, ShaderDeclInfo> _mCbTextures; private Dictionary<ShaderIrOp, ShaderDeclInfo> _cbTextures;
private Dictionary<int, ShaderDeclInfo> _mTextures; private Dictionary<int, ShaderDeclInfo> _Textures;
private Dictionary<int, ShaderDeclInfo> _mUniforms; private Dictionary<int, ShaderDeclInfo> _uniforms;
private Dictionary<int, ShaderDeclInfo> _mAttributes; private Dictionary<int, ShaderDeclInfo> _attributes;
private Dictionary<int, ShaderDeclInfo> _mInAttributes; private Dictionary<int, ShaderDeclInfo> _inAttributes;
private Dictionary<int, ShaderDeclInfo> _mOutAttributes; private Dictionary<int, ShaderDeclInfo> _outAttributes;
private Dictionary<int, ShaderDeclInfo> _mGprs; private Dictionary<int, ShaderDeclInfo> _gprs;
private Dictionary<int, ShaderDeclInfo> _mPreds; private Dictionary<int, ShaderDeclInfo> _preds;
public IReadOnlyDictionary<ShaderIrOp, ShaderDeclInfo> CbTextures => _mCbTextures; public IReadOnlyDictionary<ShaderIrOp, ShaderDeclInfo> CbTextures => _cbTextures;
public IReadOnlyDictionary<int, ShaderDeclInfo> Textures => _mTextures; public IReadOnlyDictionary<int, ShaderDeclInfo> Textures => _Textures;
public IReadOnlyDictionary<int, ShaderDeclInfo> Uniforms => _mUniforms; public IReadOnlyDictionary<int, ShaderDeclInfo> Uniforms => _uniforms;
public IReadOnlyDictionary<int, ShaderDeclInfo> Attributes => _mAttributes; public IReadOnlyDictionary<int, ShaderDeclInfo> Attributes => _attributes;
public IReadOnlyDictionary<int, ShaderDeclInfo> InAttributes => _mInAttributes; public IReadOnlyDictionary<int, ShaderDeclInfo> InAttributes => _inAttributes;
public IReadOnlyDictionary<int, ShaderDeclInfo> OutAttributes => _mOutAttributes; public IReadOnlyDictionary<int, ShaderDeclInfo> OutAttributes => _outAttributes;
public IReadOnlyDictionary<int, ShaderDeclInfo> Gprs => _mGprs; public IReadOnlyDictionary<int, ShaderDeclInfo> Gprs => _gprs;
public IReadOnlyDictionary<int, ShaderDeclInfo> Preds => _mPreds; public IReadOnlyDictionary<int, ShaderDeclInfo> Preds => _preds;
public GalShaderType ShaderType { get; private set; } public GalShaderType ShaderType { get; private set; }
@ -85,17 +85,17 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
ShaderType = shaderType; ShaderType = shaderType;
_mCbTextures = new Dictionary<ShaderIrOp, ShaderDeclInfo>(); _cbTextures = new Dictionary<ShaderIrOp, ShaderDeclInfo>();
_mTextures = new Dictionary<int, ShaderDeclInfo>(); _Textures = new Dictionary<int, ShaderDeclInfo>();
_mUniforms = new Dictionary<int, ShaderDeclInfo>(); _uniforms = new Dictionary<int, ShaderDeclInfo>();
_mAttributes = new Dictionary<int, ShaderDeclInfo>(); _attributes = new Dictionary<int, ShaderDeclInfo>();
_mInAttributes = new Dictionary<int, ShaderDeclInfo>(); _inAttributes = new Dictionary<int, ShaderDeclInfo>();
_mOutAttributes = new Dictionary<int, ShaderDeclInfo>(); _outAttributes = new Dictionary<int, ShaderDeclInfo>();
_mGprs = new Dictionary<int, ShaderDeclInfo>(); _gprs = new Dictionary<int, ShaderDeclInfo>();
_mPreds = new Dictionary<int, ShaderDeclInfo>(); _preds = new Dictionary<int, ShaderDeclInfo>();
} }
public GlslDecl(ShaderIrBlock[] blocks, GalShaderType shaderType, ShaderHeader header) public GlslDecl(ShaderIrBlock[] blocks, GalShaderType shaderType, ShaderHeader header)
@ -113,7 +113,7 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
if (header.OmapTargets[attachment].ComponentEnabled(component)) if (header.OmapTargets[attachment].ComponentEnabled(component))
{ {
_mGprs.TryAdd(index, new ShaderDeclInfo(GetGprName(index), index)); _gprs.TryAdd(index, new ShaderDeclInfo(GetGprName(index), index));
index++; index++;
} }
@ -124,7 +124,7 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
index = header.DepthRegister; index = header.DepthRegister;
_mGprs.TryAdd(index, new ShaderDeclInfo(GetGprName(index), index)); _gprs.TryAdd(index, new ShaderDeclInfo(GetGprName(index), index));
} }
} }
@ -143,31 +143,31 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
GlslDecl combined = new GlslDecl(GalShaderType.Vertex); GlslDecl combined = new GlslDecl(GalShaderType.Vertex);
Merge(combined._mTextures, vpA._mTextures, vpB._mTextures); Merge(combined._Textures, vpA._Textures, vpB._Textures);
Merge(combined._mUniforms, vpA._mUniforms, vpB._mUniforms); Merge(combined._uniforms, vpA._uniforms, vpB._uniforms);
Merge(combined._mAttributes, vpA._mAttributes, vpB._mAttributes); Merge(combined._attributes, vpA._attributes, vpB._attributes);
Merge(combined._mOutAttributes, vpA._mOutAttributes, vpB._mOutAttributes); Merge(combined._outAttributes, vpA._outAttributes, vpB._outAttributes);
Merge(combined._mGprs, vpA._mGprs, vpB._mGprs); Merge(combined._gprs, vpA._gprs, vpB._gprs);
Merge(combined._mPreds, vpA._mPreds, vpB._mPreds); Merge(combined._preds, vpA._preds, vpB._preds);
//Merge input attributes. //Merge input attributes.
foreach (KeyValuePair<int, ShaderDeclInfo> kv in vpA._mInAttributes) foreach (KeyValuePair<int, ShaderDeclInfo> kv in vpA._inAttributes)
{ {
combined._mInAttributes.TryAdd(kv.Key, kv.Value); combined._inAttributes.TryAdd(kv.Key, kv.Value);
} }
foreach (KeyValuePair<int, ShaderDeclInfo> kv in vpB._mInAttributes) foreach (KeyValuePair<int, ShaderDeclInfo> kv in vpB._inAttributes)
{ {
//If Vertex Program A already writes to this attribute, //If Vertex Program A already writes to this attribute,
//then we don't need to add it as an input attribute since //then we don't need to add it as an input attribute since
//Vertex Program A will already have written to it anyway, //Vertex Program A will already have written to it anyway,
//and there's no guarantee that there is an input attribute //and there's no guarantee that there is an input attribute
//for this slot. //for this slot.
if (!vpA._mOutAttributes.ContainsKey(kv.Key)) if (!vpA._outAttributes.ContainsKey(kv.Key))
{ {
combined._mInAttributes.TryAdd(kv.Key, kv.Value); combined._inAttributes.TryAdd(kv.Key, kv.Value);
} }
} }
@ -231,7 +231,7 @@ namespace Ryujinx.Graphics.Gal.Shader
string name = _stagePrefix + TextureName + index; string name = _stagePrefix + TextureName + index;
_mTextures.TryAdd(handle, new ShaderDeclInfo(name, handle)); _Textures.TryAdd(handle, new ShaderDeclInfo(name, handle));
} }
else if (op.Inst == ShaderIrInst.Texb) else if (op.Inst == ShaderIrInst.Texb)
{ {
@ -258,7 +258,7 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
string name = _stagePrefix + TextureName + "_cb" + cbuf.Index + "_" + cbuf.Pos; string name = _stagePrefix + TextureName + "_cb" + cbuf.Index + "_" + cbuf.Pos;
_mCbTextures.Add(op, new ShaderDeclInfo(name, cbuf.Pos, true, cbuf.Index)); _cbTextures.Add(op, new ShaderDeclInfo(name, cbuf.Pos, true, cbuf.Index));
} }
else else
{ {
@ -270,13 +270,13 @@ namespace Ryujinx.Graphics.Gal.Shader
case ShaderIrOperCbuf cbuf: case ShaderIrOperCbuf cbuf:
{ {
if (!_mUniforms.ContainsKey(cbuf.Index)) if (!_uniforms.ContainsKey(cbuf.Index))
{ {
string name = _stagePrefix + UniformName + cbuf.Index; string name = _stagePrefix + UniformName + cbuf.Index;
ShaderDeclInfo declInfo = new ShaderDeclInfo(name, cbuf.Pos, true, cbuf.Index); ShaderDeclInfo declInfo = new ShaderDeclInfo(name, cbuf.Pos, true, cbuf.Index);
_mUniforms.Add(cbuf.Index, declInfo); _uniforms.Add(cbuf.Index, declInfo);
} }
break; break;
} }
@ -309,30 +309,30 @@ namespace Ryujinx.Graphics.Gal.Shader
if (parent is ShaderIrAsg asg && asg.Dst == node) if (parent is ShaderIrAsg asg && asg.Dst == node)
{ {
if (!_mOutAttributes.TryGetValue(index, out declInfo)) if (!_outAttributes.TryGetValue(index, out declInfo))
{ {
declInfo = new ShaderDeclInfo(OutAttrName + glslIndex, glslIndex); declInfo = new ShaderDeclInfo(OutAttrName + glslIndex, glslIndex);
_mOutAttributes.Add(index, declInfo); _outAttributes.Add(index, declInfo);
} }
} }
else else
{ {
if (!_mInAttributes.TryGetValue(index, out declInfo)) if (!_inAttributes.TryGetValue(index, out declInfo))
{ {
declInfo = new ShaderDeclInfo(InAttrName + glslIndex, glslIndex); declInfo = new ShaderDeclInfo(InAttrName + glslIndex, glslIndex);
_mInAttributes.Add(index, declInfo); _inAttributes.Add(index, declInfo);
} }
} }
declInfo.Enlarge(elem + 1); declInfo.Enlarge(elem + 1);
if (!_mAttributes.ContainsKey(index)) if (!_attributes.ContainsKey(index))
{ {
declInfo = new ShaderDeclInfo(AttrName + glslIndex, glslIndex, false, 0, 4); declInfo = new ShaderDeclInfo(AttrName + glslIndex, glslIndex, false, 0, 4);
_mAttributes.Add(index, declInfo); _attributes.Add(index, declInfo);
} }
Traverse(nodes, abuf, abuf.Vertex); Traverse(nodes, abuf, abuf.Vertex);
@ -346,18 +346,18 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
string name = GetGprName(gpr.Index); string name = GetGprName(gpr.Index);
_mGprs.TryAdd(gpr.Index, new ShaderDeclInfo(name, gpr.Index)); _gprs.TryAdd(gpr.Index, new ShaderDeclInfo(name, gpr.Index));
} }
break; break;
} }
case ShaderIrOperPred pred: case ShaderIrOperPred pred:
{ {
if (!pred.IsConst && !HasName(_mPreds, pred.Index)) if (!pred.IsConst && !HasName(_preds, pred.Index))
{ {
string name = PredName + pred.Index; string name = PredName + pred.Index;
_mPreds.TryAdd(pred.Index, new ShaderDeclInfo(name, pred.Index)); _preds.TryAdd(pred.Index, new ShaderDeclInfo(name, pred.Index));
} }
break; break;
} }

View file

@ -312,13 +312,11 @@ namespace Ryujinx.Graphics.Gal.Shader
if (_decl.ShaderType == GalShaderType.Fragment) if (_decl.ShaderType == GalShaderType.Fragment)
{ {
int count = 0; int count = 0;
for (int attachment = 0; attachment < 8; attachment++) for (int attachment = 0; attachment < 8; attachment++)
{ {
if (_header.OmapTargets[attachment].Enabled) if (_header.OmapTargets[attachment].Enabled)
{ {
_sb.AppendLine("layout (location = " + attachment + ") out vec4 " + GlslDecl.FragmentOutputName + attachment + ";"); _sb.AppendLine("layout (location = " + attachment + ") out vec4 " + GlslDecl.FragmentOutputName + attachment + ";");
count++; count++;
} }
} }
@ -340,13 +338,11 @@ namespace Ryujinx.Graphics.Gal.Shader
private void PrintDeclAttributes(IEnumerable<ShaderDeclInfo> decls, string inOut) private void PrintDeclAttributes(IEnumerable<ShaderDeclInfo> decls, string inOut)
{ {
int count = 0; int count = 0;
foreach (ShaderDeclInfo declInfo in decls.OrderBy(DeclKeySelector)) foreach (ShaderDeclInfo declInfo in decls.OrderBy(DeclKeySelector))
{ {
if (declInfo.Index >= 0) if (declInfo.Index >= 0)
{ {
_sb.AppendLine("layout (location = " + declInfo.Index + ") " + inOut + " vec4 " + declInfo.Name + ";"); _sb.AppendLine("layout (location = " + declInfo.Index + ") " + inOut + " vec4 " + declInfo.Name + ";");
count++; count++;
} }
} }
@ -370,7 +366,6 @@ namespace Ryujinx.Graphics.Gal.Shader
private void PrintDeclSsy() private void PrintDeclSsy()
{ {
_sb.AppendLine("uint " + GlslDecl.SsyCursorName + " = 0;"); _sb.AppendLine("uint " + GlslDecl.SsyCursorName + " = 0;");
_sb.AppendLine("uint " + GlslDecl.SsyStackName + "[" + GlslDecl.SsyStackSize + "];" + Environment.NewLine); _sb.AppendLine("uint " + GlslDecl.SsyStackName + "[" + GlslDecl.SsyStackSize + "];" + Environment.NewLine);
} }
@ -574,29 +569,41 @@ namespace Ryujinx.Graphics.Gal.Shader
PrintNode(block, node, IdentationStr); PrintNode(block, node, IdentationStr);
} }
if (nodes.Length > 0) if (nodes.Length == 0)
{ {
ShaderIrNode last = nodes[nodes.Length - 1]; _sb.AppendLine(IdentationStr + "return 0u;");
bool unconditionalFlowChange = false; return;
}
if (last is ShaderIrOp op)
ShaderIrNode last = nodes[nodes.Length - 1];
bool unconditionalFlowChange = false;
if (last is ShaderIrOp op)
{
switch (op.Inst)
{ {
switch (op.Inst) case ShaderIrInst.Bra:
{ case ShaderIrInst.Exit:
case ShaderIrInst.Bra: case ShaderIrInst.Kil:
case ShaderIrInst.Exit: case ShaderIrInst.Sync:
case ShaderIrInst.Kil: unconditionalFlowChange = true;
case ShaderIrInst.Sync: break;
unconditionalFlowChange = true;
break;
}
} }
}
if (!unconditionalFlowChange) if (!unconditionalFlowChange)
{
if (block.Next != null)
{ {
_sb.AppendLine(IdentationStr + "return " + GetBlockPosition(block.Next) + ";"); _sb.AppendLine(IdentationStr + "return " + GetBlockPosition(block.Next) + ";");
} }
else
{
_sb.AppendLine(IdentationStr + "return 0u;");
}
} }
} }

View file

@ -9,15 +9,15 @@ namespace Ryujinx.Graphics.Memory
public int SubChannel { get; private set; } public int SubChannel { get; private set; }
private int[] _mArguments; private int[] _arguments;
public ReadOnlyCollection<int> Arguments => Array.AsReadOnly(_mArguments); public ReadOnlyCollection<int> Arguments => Array.AsReadOnly(_arguments);
public NvGpuPbEntry(int method, int subChannel, params int[] arguments) public NvGpuPbEntry(int method, int subChannel, params int[] arguments)
{ {
Method = method; Method = method;
SubChannel = subChannel; SubChannel = subChannel;
_mArguments = arguments; _arguments = arguments;
} }
} }
} }

View file

@ -37,7 +37,7 @@ namespace Ryujinx.Graphics
ZetaVert = 0x48b, ZetaVert = 0x48b,
ZetaArrayMode = 0x48c, ZetaArrayMode = 0x48c,
DepthTestEnable = 0x4b3, DepthTestEnable = 0x4b3,
BlendEnable = 0x4b9, IBlendEnable = 0x4b9,
DepthWriteEnable = 0x4ba, DepthWriteEnable = 0x4ba,
DepthTestFunction = 0x4c3, DepthTestFunction = 0x4c3,
BlendSeparateAlpha = 0x4cf, BlendSeparateAlpha = 0x4cf,
@ -48,7 +48,7 @@ namespace Ryujinx.Graphics
BlendFuncSrcAlpha = 0x4d4, BlendFuncSrcAlpha = 0x4d4,
BlendFuncDstAlpha = 0x4d6, BlendFuncDstAlpha = 0x4d6,
BlendEnableMaster = 0x4d7, BlendEnableMaster = 0x4d7,
BlendNEnable = 0x4d8, BlendNEnable = 0x4d8,
StencilEnable = 0x4e0, StencilEnable = 0x4e0,
StencilFrontOpFail = 0x4e1, StencilFrontOpFail = 0x4e1,
StencilFrontOpZFail = 0x4e2, StencilFrontOpZFail = 0x4e2,
@ -88,13 +88,13 @@ namespace Ryujinx.Graphics
VertexArrayNControl = 0x700, VertexArrayNControl = 0x700,
VertexArrayNAddress = 0x701, VertexArrayNAddress = 0x701,
VertexArrayNDivisor = 0x703, VertexArrayNDivisor = 0x703,
BlendNSeparateAlpha = 0x780, BlendNSeparateAlpha = 0x780,
BlendNEquationRgb = 0x781, BlendNEquationRgb = 0x781,
BlendNFuncSrcRgb = 0x782, BlendNFuncSrcRgb = 0x782,
BlendNFuncDstRgb = 0x783, BlendNFuncDstRgb = 0x783,
BlendNEquationAlpha = 0x784, BlendNEquationAlpha = 0x784,
BlendNFuncSrcAlpha = 0x785, BlendNFuncSrcAlpha = 0x785,
BlendNFuncDstAlpha = 0x786, BlendNFuncDstAlpha = 0x786,
VertexArrayNEndAddr = 0x7c0, VertexArrayNEndAddr = 0x7c0,
ShaderNControl = 0x800, ShaderNControl = 0x800,
ShaderNOffset = 0x801, ShaderNOffset = 0x801,

View file

@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Texture
private const GalImageFormat Float = GalImageFormat.Float; private const GalImageFormat Float = GalImageFormat.Float;
private const GalImageFormat Srgb = GalImageFormat.Srgb; private const GalImageFormat Srgb = GalImageFormat.Srgb;
private static readonly Dictionary<GalTextureFormat, GalImageFormat> STextureTable = private static readonly Dictionary<GalTextureFormat, GalImageFormat> TextureTable =
new Dictionary<GalTextureFormat, GalImageFormat>() new Dictionary<GalTextureFormat, GalImageFormat>()
{ {
{ GalTextureFormat.Rgba32, GalImageFormat.Rgba32 | Sint | Uint | Float }, { GalTextureFormat.Rgba32, GalImageFormat.Rgba32 | Sint | Uint | Float },
@ -89,7 +89,7 @@ namespace Ryujinx.Graphics.Texture
{ GalTextureFormat.Astc2D10X6, GalImageFormat.Astc2D10X6 | Unorm | Srgb } { GalTextureFormat.Astc2D10X6, GalImageFormat.Astc2D10X6 | Unorm | Srgb }
}; };
private static readonly Dictionary<GalImageFormat, ImageDescriptor> SImageTable = private static readonly Dictionary<GalImageFormat, ImageDescriptor> ImageTable =
new Dictionary<GalImageFormat, ImageDescriptor>() new Dictionary<GalImageFormat, ImageDescriptor>()
{ {
{ GalImageFormat.Rgba32, new ImageDescriptor(16, 1, 1, TargetBuffer.Color) }, { GalImageFormat.Rgba32, new ImageDescriptor(16, 1, 1, TargetBuffer.Color) },
@ -149,7 +149,7 @@ namespace Ryujinx.Graphics.Texture
throw new NotImplementedException("Per component types are not implemented!"); throw new NotImplementedException("Per component types are not implemented!");
} }
if (!STextureTable.TryGetValue(format, out GalImageFormat imageFormat)) if (!TextureTable.TryGetValue(format, out GalImageFormat imageFormat))
{ {
throw new NotImplementedException($"Format 0x{((int)format):x} not implemented!"); throw new NotImplementedException($"Format 0x{((int)format):x} not implemented!");
} }
@ -375,7 +375,7 @@ namespace Ryujinx.Graphics.Texture
{ {
GalImageFormat pixelFormat = format & GalImageFormat.FormatMask; GalImageFormat pixelFormat = format & GalImageFormat.FormatMask;
if (SImageTable.TryGetValue(pixelFormat, out ImageDescriptor descriptor)) if (ImageTable.TryGetValue(pixelFormat, out ImageDescriptor descriptor))
{ {
return descriptor; return descriptor;
} }

View file

@ -21,10 +21,10 @@ namespace Ryujinx.Graphics.Texture
public IntegerEncoded(EIntegerEncoding encoding, int numBits) public IntegerEncoded(EIntegerEncoding encoding, int numBits)
{ {
_encoding = encoding; _encoding = encoding;
NumberBits = numBits; NumberBits = numBits;
BitValue = 0; BitValue = 0;
TritValue = 0; TritValue = 0;
QuintValue = 0; QuintValue = 0;
} }
public bool MatchesEncoding(IntegerEncoded other) public bool MatchesEncoding(IntegerEncoded other)

View file

@ -8,18 +8,18 @@ namespace Ryujinx.HLE.HOS
Htcs = 4, Htcs = 4,
Ncm = 5, Ncm = 5,
Dd = 6, Dd = 6,
DebugMonitor = 7, DebugMonitor = 7,
Lr = 8, Lr = 8,
Loader = 9, Loader = 9,
IpcCommandInterface = 10, IpcCommandInterface = 10,
Ipc = 11, Ipc = 11,
Pm = 15, Pm = 15,
Ns = 16, Ns = 16,
Socket = 17, Socket = 17,
Htc = 18, Htc = 18,
NcmContent = 20, NcmContent = 20,
Sm = 21, Sm = 21,
RoUserland = 22, RoUserland = 22,
SdMmc = 24, SdMmc = 24,
Ovln = 25, Ovln = 25,
Spl = 26, Spl = 26,
@ -47,7 +47,7 @@ namespace Ryujinx.HLE.HOS
Mii = 126, Mii = 126,
Nfc = 127, Nfc = 127,
Am = 128, Am = 128,
PlayReport = 129, PlayReport = 129,
Ahid = 130, Ahid = 130,
Qlaunch = 132, Qlaunch = 132,
Pcv = 133, Pcv = 133,
@ -64,23 +64,23 @@ namespace Ryujinx.HLE.HOS
Ec = 144, Ec = 144,
ETicket = 145, ETicket = 145,
Ngc = 146, Ngc = 146,
ErrorReport = 147, ErrorReport = 147,
Apm = 148, Apm = 148,
Profiler = 150, Profiler = 150,
ErrorUpload = 151, ErrorUpload = 151,
Audio = 153, Audio = 153,
Npns = 154, Npns = 154,
NpnsHttpStream = 155, NpnsHttpStream = 155,
Arp = 157, Arp = 157,
Swkbd = 158, Swkbd = 158,
Boot = 159, Boot = 159,
NfcMifare = 161, NfcMifare = 161,
UserlandAssert = 162, UserlandAssert = 162,
Fatal = 163, Fatal = 163,
NimShop = 164, NimShop = 164,
Spsm = 165, Spsm = 165,
Bgtc = 167, Bgtc = 167,
UserlandCrash = 168, UserlandCrash = 168,
SRepo = 180, SRepo = 180,
Dauth = 181, Dauth = 181,
Hid = 202, Hid = 202,
@ -92,10 +92,10 @@ namespace Ryujinx.HLE.HOS
Web = 210, Web = 210,
Grc = 212, Grc = 212,
Migration = 216, Migration = 216,
MigrationLdcServer = 217, MigrationLdcServer = 217,
GeneralWebApplet = 800, GeneralWebApplet = 800,
WifiWebAuthApplet = 809, WifiWebAuthApplet = 809,
WhitelistedApplet = 810, WhitelistedApplet = 810,
ShopN = 811 ShopN = 811
} }
} }

View file

@ -75,9 +75,9 @@ namespace Ryujinx.HLE.HOS.Kernel
{ {
ThreadId = threadId; ThreadId = threadId;
Context = thread; Context = thread;
Owner = process; Owner = process;
PreferredCore = processorId; PreferredCore = processorId;
_scheduler = system.Scheduler; _scheduler = system.Scheduler;
_schedulingData = system.Scheduler.SchedulingData; _schedulingData = system.Scheduler.SchedulingData;