Fix shader compilation on shaders that uses rectangle textures (#2471)

This commit is contained in:
gdkchan 2021-07-12 16:20:33 -03:00 committed by GitHub
parent 40b21cc3c4
commit 9b08abc644
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 3 deletions

View File

@ -38,7 +38,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// <summary>
/// Version of the codegen (to be changed when codegen or guest format change).
/// </summary>
private const ulong ShaderCodeGenVersion = 2439;
private const ulong ShaderCodeGenVersion = 2469;
// Progress reporting helpers
private volatile int _shaderCount;

View File

@ -16,18 +16,31 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation
SamplerType type,
TextureFormat format,
TextureFlags flags,
int cbufSlot,
int handle,
int compIndex,
Operand dest,
params Operand[] sources) : base(inst, compIndex, dest, sources)
Operand[] sources) : base(inst, compIndex, dest, sources)
{
Type = type;
Format = format;
Flags = flags;
CbufSlot = DefaultCbufSlot;
CbufSlot = cbufSlot;
Handle = handle;
}
public TextureOperation(
Instruction inst,
SamplerType type,
TextureFormat format,
TextureFlags flags,
int handle,
int compIndex,
Operand dest,
Operand[] sources) : this(inst, type, format, flags, DefaultCbufSlot, handle, compIndex, dest, sources)
{
}
public void TurnIntoIndexed(int handle)
{
Type |= SamplerType.Indexed;

View File

@ -291,6 +291,8 @@ namespace Ryujinx.Graphics.Shader.Translation
// We normalize by dividing the coords by the texture size.
if (isRect && !intCoords)
{
config.SetUsedFeature(FeatureFlags.IntegerSampling);
for (int index = 0; index < coordsCount; index++)
{
Operand coordSize = Local();
@ -311,11 +313,14 @@ namespace Ryujinx.Graphics.Shader.Translation
texOp.Type,
texOp.Format,
texOp.Flags,
texOp.CbufSlot,
texOp.Handle,
index,
coordSize,
texSizeSources));
config.SetUsedTexture(Instruction.TextureSize, texOp.Type, texOp.Format, texOp.Flags, texOp.CbufSlot, texOp.Handle);
Operand source = sources[coordsIndex + index];
Operand coordNormalized = Local();
@ -352,6 +357,8 @@ namespace Ryujinx.Graphics.Shader.Translation
}
else
{
config.SetUsedFeature(FeatureFlags.IntegerSampling);
Operand lod = Local();
node.List.AddBefore(node, new TextureOperation(
@ -359,6 +366,7 @@ namespace Ryujinx.Graphics.Shader.Translation
texOp.Type,
texOp.Format,
texOp.Flags,
texOp.CbufSlot,
texOp.Handle,
0,
lod,
@ -384,11 +392,14 @@ namespace Ryujinx.Graphics.Shader.Translation
texOp.Type,
texOp.Format,
texOp.Flags,
texOp.CbufSlot,
texOp.Handle,
index,
coordSize,
texSizeSources));
config.SetUsedTexture(Instruction.TextureSize, texOp.Type, texOp.Format, texOp.Flags, texOp.CbufSlot, texOp.Handle);
Operand offset = Local();
Operand intOffset = offsets[index + (hasOffsets ? texOp.Index * coordsCount : 0)];
@ -420,6 +431,7 @@ namespace Ryujinx.Graphics.Shader.Translation
texOp.Type,
texOp.Format,
texOp.Flags & ~(TextureFlags.Offset | TextureFlags.Offsets),
texOp.CbufSlot,
texOp.Handle,
componentIndex,
texOp.Dest,