Fix shader compilation on shaders that uses rectangle textures (#2471)
This commit is contained in:
parent
40b21cc3c4
commit
9b08abc644
3 changed files with 28 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Reference in a new issue