Simplify logic for bindless texture handling (#1667)
* Simplify logic for bindless texture handling * Nits
This commit is contained in:
parent
eda6b78894
commit
934a78005e
16 changed files with 131 additions and 191 deletions
|
@ -86,18 +86,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
|
||||
private int FindDescriptorIndex(List<TextureDescriptor> list, AstTextureOperation texOp)
|
||||
{
|
||||
AstOperand operand = texOp.GetSource(0) as AstOperand;
|
||||
bool bindless = (texOp.Flags & TextureFlags.Bindless) > 0;
|
||||
|
||||
int cBufSlot = bindless ? operand.CbufSlot : 0;
|
||||
int cBufOffset = bindless ? operand.CbufOffset : 0;
|
||||
|
||||
return list.FindIndex(descriptor =>
|
||||
descriptor.Type == texOp.Type &&
|
||||
descriptor.CbufSlot == texOp.CbufSlot &&
|
||||
descriptor.HandleIndex == texOp.Handle &&
|
||||
descriptor.Format == texOp.Format &&
|
||||
descriptor.CbufSlot == cBufSlot &&
|
||||
descriptor.CbufOffset == cBufOffset);
|
||||
descriptor.Format == texOp.Format);
|
||||
}
|
||||
|
||||
public int FindTextureDescriptorIndex(AstTextureOperation texOp)
|
||||
|
|
|
@ -305,24 +305,14 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
|
||||
string samplerName = OperandManager.GetSamplerName(context.Config.Stage, texOp, indexExpr);
|
||||
|
||||
if (!samplers.Add(samplerName))
|
||||
if ((texOp.Flags & TextureFlags.Bindless) != 0 || !samplers.Add(samplerName))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int firstBinding = -1;
|
||||
|
||||
if ((texOp.Flags & TextureFlags.Bindless) != 0)
|
||||
{
|
||||
AstOperand operand = texOp.GetSource(0) as AstOperand;
|
||||
|
||||
firstBinding = context.Config.Counts.IncrementTexturesCount();
|
||||
|
||||
var desc = new TextureDescriptor(firstBinding, texOp.Type, operand.CbufSlot, operand.CbufOffset);
|
||||
|
||||
context.TextureDescriptors.Add(desc);
|
||||
}
|
||||
else if ((texOp.Type & SamplerType.Indexed) != 0)
|
||||
if ((texOp.Type & SamplerType.Indexed) != 0)
|
||||
{
|
||||
for (int index = 0; index < texOp.ArraySize; index++)
|
||||
{
|
||||
|
@ -333,7 +323,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
firstBinding = binding;
|
||||
}
|
||||
|
||||
var desc = new TextureDescriptor(binding, texOp.Type, texOp.Format, texOp.Handle + index * 2);
|
||||
var desc = new TextureDescriptor(binding, texOp.Type, texOp.Format, texOp.CbufSlot, texOp.Handle + index * 2);
|
||||
|
||||
context.TextureDescriptors.Add(desc);
|
||||
}
|
||||
|
@ -342,7 +332,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
{
|
||||
firstBinding = context.Config.Counts.IncrementTexturesCount();
|
||||
|
||||
var desc = new TextureDescriptor(firstBinding, texOp.Type, texOp.Format, texOp.Handle);
|
||||
var desc = new TextureDescriptor(firstBinding, texOp.Type, texOp.Format, texOp.CbufSlot, texOp.Handle);
|
||||
|
||||
context.TextureDescriptors.Add(desc);
|
||||
}
|
||||
|
@ -363,7 +353,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
|
||||
string imageName = OperandManager.GetImageName(context.Config.Stage, texOp, indexExpr);
|
||||
|
||||
if (!images.Add(imageName))
|
||||
if ((texOp.Flags & TextureFlags.Bindless) != 0 || !images.Add(imageName))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -381,7 +371,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
firstBinding = binding;
|
||||
}
|
||||
|
||||
var desc = new TextureDescriptor(binding, texOp.Type, texOp.Format, texOp.Handle + index * 2);
|
||||
var desc = new TextureDescriptor(binding, texOp.Type, texOp.Format, texOp.CbufSlot, texOp.Handle + index * 2);
|
||||
|
||||
context.ImageDescriptors.Add(desc);
|
||||
}
|
||||
|
@ -390,7 +380,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
{
|
||||
firstBinding = context.Config.Counts.IncrementImagesCount();
|
||||
|
||||
var desc = new TextureDescriptor(firstBinding, texOp.Type, texOp.Format, texOp.Handle);
|
||||
var desc = new TextureDescriptor(firstBinding, texOp.Type, texOp.Format, texOp.CbufSlot, texOp.Handle);
|
||||
|
||||
context.ImageDescriptors.Add(desc);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||
|
||||
bool isBindless = (texOp.Flags & TextureFlags.Bindless) != 0;
|
||||
|
||||
bool isArray = (texOp.Type & SamplerType.Array) != 0;
|
||||
// TODO: Bindless texture support. For now we just return 0/do nothing.
|
||||
if (isBindless)
|
||||
{
|
||||
return texOp.Inst == Instruction.ImageLoad ? NumberFormatter.FormatFloat(0) : "// imageStore(bindless)";
|
||||
}
|
||||
|
||||
bool isArray = (texOp.Type & SamplerType.Array) != 0;
|
||||
bool isIndexed = (texOp.Type & SamplerType.Indexed) != 0;
|
||||
|
||||
string texCall = texOp.Inst == Instruction.ImageLoad ? "imageLoad" : "imageStore";
|
||||
|
@ -79,7 +85,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||
flags |= TextureUsageFlags.ResScaleUnsupported;
|
||||
}
|
||||
|
||||
context.ImageDescriptors[index] = context.ImageDescriptors[index].SetFlag(flags);
|
||||
if (!isBindless)
|
||||
{
|
||||
context.ImageDescriptors[index] = context.ImageDescriptors[index].SetFlag(flags);
|
||||
}
|
||||
|
||||
return vector;
|
||||
}
|
||||
|
@ -212,6 +221,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||
|
||||
bool isBindless = (texOp.Flags & TextureFlags.Bindless) != 0;
|
||||
|
||||
// TODO: Bindless texture support. For now we just return 0.
|
||||
if (isBindless)
|
||||
{
|
||||
return NumberFormatter.FormatFloat(0);
|
||||
}
|
||||
|
||||
bool isIndexed = (texOp.Type & SamplerType.Indexed) != 0;
|
||||
|
||||
string indexExpr = null;
|
||||
|
@ -306,6 +321,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||
bool isMultisample = (texOp.Type & SamplerType.Multisample) != 0;
|
||||
bool isShadow = (texOp.Type & SamplerType.Shadow) != 0;
|
||||
|
||||
// TODO: Bindless texture support. For now we just return 0.
|
||||
if (isBindless)
|
||||
{
|
||||
return NumberFormatter.FormatFloat(0);
|
||||
}
|
||||
|
||||
// This combination is valid, but not available on GLSL.
|
||||
// For now, ignore the LOD level and do a normal sample.
|
||||
// TODO: How to implement it properly?
|
||||
|
@ -469,7 +490,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||
flags |= TextureUsageFlags.ResScaleUnsupported;
|
||||
}
|
||||
|
||||
context.TextureDescriptors[index] = context.TextureDescriptors[index].SetFlag(flags);
|
||||
if (!isBindless)
|
||||
{
|
||||
context.TextureDescriptors[index] = context.TextureDescriptors[index].SetFlag(flags);
|
||||
}
|
||||
}
|
||||
|
||||
return vector;
|
||||
|
@ -572,6 +596,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
|
|||
|
||||
bool isBindless = (texOp.Flags & TextureFlags.Bindless) != 0;
|
||||
|
||||
// TODO: Bindless texture support. For now we just return 0.
|
||||
if (isBindless)
|
||||
{
|
||||
return NumberFormatter.FormatInt(0);
|
||||
}
|
||||
|
||||
bool isIndexed = (texOp.Type & SamplerType.Indexed) != 0;
|
||||
|
||||
string indexExpr = null;
|
||||
|
|
|
@ -241,22 +241,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
|
||||
public static string GetSamplerName(ShaderStage stage, AstTextureOperation texOp, string indexExpr)
|
||||
{
|
||||
string suffix;
|
||||
string suffix = texOp.CbufSlot < 0 ? $"_tcb_{texOp.Handle:X}" : $"_cb{texOp.CbufSlot}_{texOp.Handle:X}";
|
||||
|
||||
if ((texOp.Flags & TextureFlags.Bindless) != 0)
|
||||
if ((texOp.Type & SamplerType.Indexed) != 0)
|
||||
{
|
||||
AstOperand operand = texOp.GetSource(0) as AstOperand;
|
||||
|
||||
suffix = $"_{texOp.Type.ToGlslSamplerType()}_cb{operand.CbufSlot}_{operand.CbufOffset}";
|
||||
}
|
||||
else
|
||||
{
|
||||
suffix = texOp.Handle.ToString("X");
|
||||
|
||||
if ((texOp.Type & SamplerType.Indexed) != 0)
|
||||
{
|
||||
suffix += $"a[{indexExpr}]";
|
||||
}
|
||||
suffix += $"a[{indexExpr}]";
|
||||
}
|
||||
|
||||
return GetShaderStagePrefix(stage) + "_" + DefaultNames.SamplerNamePrefix + suffix;
|
||||
|
@ -264,7 +253,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
|||
|
||||
public static string GetImageName(ShaderStage stage, AstTextureOperation texOp, string indexExpr)
|
||||
{
|
||||
string suffix = texOp.Handle.ToString("X") + "_" + texOp.Format.ToGlslFormat();
|
||||
string suffix = texOp.CbufSlot < 0 ? $"_tcb_{texOp.Handle:X}_{texOp.Format.ToGlslFormat()}" : $"_cb{texOp.CbufSlot}_{texOp.Handle:X}_{texOp.Format.ToGlslFormat()}";
|
||||
|
||||
if ((texOp.Type & SamplerType.Indexed) != 0)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue