Texture instructions related fixes

This commit is contained in:
gdkchan 2019-04-10 08:10:51 -03:00
commit c5faac2c00
2 changed files with 21 additions and 14 deletions

View file

@ -132,8 +132,8 @@ namespace Ryujinx.Graphics.Shader.Decoders
Set("110000xxxx111x", InstEmit.Tex, typeof(OpCodeTex)); Set("110000xxxx111x", InstEmit.Tex, typeof(OpCodeTex));
Set("1101111010111x", InstEmit.Tex_B, typeof(OpCodeTex)); Set("1101111010111x", InstEmit.Tex_B, typeof(OpCodeTex));
Set("1101x00xxxxxxx", InstEmit.Texs, typeof(OpCodeTexs)); Set("1101x00xxxxxxx", InstEmit.Texs, typeof(OpCodeTexs));
Set("1101101xxxxxxx", InstEmit.Texs, typeof(OpCodeTlds)); Set("1101x01xxxxxxx", InstEmit.Texs, typeof(OpCodeTlds));
Set("1101111100xxxx", InstEmit.Texs, typeof(OpCodeTld4s)); Set("1101x11100xxxx", InstEmit.Texs, typeof(OpCodeTld4s));
Set("1101110000111x", InstEmit.Tld, typeof(OpCodeTld)); Set("1101110000111x", InstEmit.Tld, typeof(OpCodeTld));
Set("1101110100111x", InstEmit.Tld_B, typeof(OpCodeTld)); Set("1101110100111x", InstEmit.Tld_B, typeof(OpCodeTld));
Set("110010xxxx111x", InstEmit.Tld4, typeof(OpCodeTld4)); Set("110010xxxx111x", InstEmit.Tld4, typeof(OpCodeTld4));

View file

@ -273,7 +273,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
{ {
case TldsType.Texture1DLodZero: case TldsType.Texture1DLodZero:
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(ConstF(0)); sourcesList.Add(Const(0));
break; break;
case TldsType.Texture1DLodLevel: case TldsType.Texture1DLodLevel:
@ -284,14 +284,14 @@ namespace Ryujinx.Graphics.Shader.Instructions
case TldsType.Texture2DLodZero: case TldsType.Texture2DLodZero:
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(Rb()); sourcesList.Add(Rb());
sourcesList.Add(ConstF(0)); sourcesList.Add(Const(0));
break; break;
case TldsType.Texture2DLodZeroOffset: case TldsType.Texture2DLodZeroOffset:
case TldsType.Texture2DLodZeroMultisample: case TldsType.Texture2DLodZeroMultisample:
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(ConstF(0)); sourcesList.Add(Const(0));
sourcesList.Add(Rb()); sourcesList.Add(Rb());
break; break;
@ -305,14 +305,14 @@ namespace Ryujinx.Graphics.Shader.Instructions
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(Rb()); sourcesList.Add(Rb());
sourcesList.Add(ConstF(0)); sourcesList.Add(Const(0));
break; break;
case TldsType.Texture2DArrayLodZero: case TldsType.Texture2DArrayLodZero:
sourcesList.Add(Rb()); sourcesList.Add(Rb());
sourcesList.Add(Rb()); sourcesList.Add(Rb());
sourcesList.Add(Ra()); sourcesList.Add(Ra());
sourcesList.Add(ConstF(0)); sourcesList.Add(Const(0));
break; break;
case TldsType.Texture2DLodLevelOffset: case TldsType.Texture2DLodLevelOffset:
@ -339,19 +339,26 @@ namespace Ryujinx.Graphics.Shader.Instructions
type = TextureType.Texture2D; type = TextureType.Texture2D;
flags = TextureFlags.Gather; flags = TextureFlags.Gather;
if (tld4sOp.HasOffset)
{
sourcesList.Add(Rb());
flags |= TextureFlags.Offset;
}
if (tld4sOp.HasDepthCompare) if (tld4sOp.HasDepthCompare)
{ {
sourcesList.Add(Rb()); sourcesList.Add(Rb());
type |= TextureType.Shadow; type |= TextureType.Shadow;
} }
if (tld4sOp.HasOffset)
{
Operand packedOffs = Rb();
for (int index = 0; index < type.GetCoordsCount(); index++)
{
sourcesList.Add(context.BitfieldExtractS32(packedOffs, Const(index * 8), Const(6)));
}
flags |= TextureFlags.Offset;
}
sourcesList.Add(Const(tld4sOp.GatherCompIndex));
} }
else else
{ {