Fix shader textureSize with multisample and buffer textures (#3240)
* Fix shader textureSize with multisample and buffer textures * Replace out param with tuple return value
This commit is contained in:
parent
5158cdb308
commit
04bd87ed5a
2 changed files with 36 additions and 10 deletions
|
@ -70,6 +70,25 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
||||||
AppendLine("}" + suffix);
|
AppendLine("}" + suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public (TextureDescriptor, int) FindTextureDescriptor(AstTextureOperation texOp)
|
||||||
|
{
|
||||||
|
TextureDescriptor[] descriptors = Config.GetTextureDescriptors();
|
||||||
|
|
||||||
|
for (int i = 0; i < descriptors.Length; i++)
|
||||||
|
{
|
||||||
|
var descriptor = descriptors[i];
|
||||||
|
|
||||||
|
if (descriptor.CbufSlot == texOp.CbufSlot &&
|
||||||
|
descriptor.HandleIndex == texOp.Handle &&
|
||||||
|
descriptor.Format == texOp.Format)
|
||||||
|
{
|
||||||
|
return (descriptor, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (default, -1);
|
||||||
|
}
|
||||||
|
|
||||||
private static int FindDescriptorIndex(TextureDescriptor[] array, AstTextureOperation texOp)
|
private static int FindDescriptorIndex(TextureDescriptor[] array, AstTextureOperation texOp)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < array.Length; i++)
|
for (int i = 0; i < array.Length; i++)
|
||||||
|
|
|
@ -756,27 +756,34 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
||||||
|
|
||||||
string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr);
|
string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr);
|
||||||
|
|
||||||
int lodSrcIndex = isBindless || isIndexed ? 1 : 0;
|
|
||||||
|
|
||||||
IAstNode lod = operation.GetSource(lodSrcIndex);
|
|
||||||
|
|
||||||
string lodExpr = GetSoureExpr(context, lod, GetSrcVarType(operation.Inst, lodSrcIndex));
|
|
||||||
|
|
||||||
if (texOp.Index == 3)
|
if (texOp.Index == 3)
|
||||||
{
|
{
|
||||||
return $"textureQueryLevels({samplerName})";
|
return $"textureQueryLevels({samplerName})";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string texCall = $"textureSize({samplerName}, {lodExpr}){GetMask(texOp.Index)}";
|
(TextureDescriptor descriptor, int descriptorIndex) = context.FindTextureDescriptor(texOp);
|
||||||
|
bool hasLod = !descriptor.Type.HasFlag(SamplerType.Multisample) && descriptor.Type != SamplerType.TextureBuffer;
|
||||||
|
string texCall;
|
||||||
|
|
||||||
|
if (hasLod)
|
||||||
|
{
|
||||||
|
int lodSrcIndex = isBindless || isIndexed ? 1 : 0;
|
||||||
|
IAstNode lod = operation.GetSource(lodSrcIndex);
|
||||||
|
string lodExpr = GetSoureExpr(context, lod, GetSrcVarType(operation.Inst, lodSrcIndex));
|
||||||
|
|
||||||
|
texCall = $"textureSize({samplerName}, {lodExpr}){GetMask(texOp.Index)}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
texCall = $"textureSize({samplerName}){GetMask(texOp.Index)}";
|
||||||
|
}
|
||||||
|
|
||||||
if (context.Config.Stage.SupportsRenderScale() &&
|
if (context.Config.Stage.SupportsRenderScale() &&
|
||||||
!isBindless &&
|
!isBindless &&
|
||||||
!isIndexed)
|
!isIndexed)
|
||||||
{
|
{
|
||||||
int index = context.FindTextureDescriptorIndex(texOp);
|
texCall = $"Helper_TextureSizeUnscale({texCall}, {descriptorIndex})";
|
||||||
|
|
||||||
texCall = "Helper_TextureSizeUnscale(" + texCall + ", " + index + ")";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return texCall;
|
return texCall;
|
||||||
|
|
Reference in a new issue