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:
gdkchan 2022-04-04 14:43:58 -03:00 committed by GitHub
parent 5158cdb308
commit 04bd87ed5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 10 deletions

View File

@ -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++)

View File

@ -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;