aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2024-04-22 15:05:55 -0300
committerGitHub <noreply@github.com>2024-04-22 15:05:55 -0300
commitc6f8bfed904e30f7c5d890a2f0ef531eb9e298e5 (patch)
treee1c048d390867e8c9403904498184e3a64277e49 /src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
parent9b94662b4bb2ebf846e1baf45ba8097fcd7da684 (diff)
Add support for bindless textures from shader input (vertex buffer) on Vulkan (#6577)
* Add support for bindless textures from shader input (vertex buffer) * Shader cache version bump * Format whitespace * Remove cache entries on pool removal, disable for OpenGL * PR feedback
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs86
1 files changed, 46 insertions, 40 deletions
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
index 409e466c..34f8532a 100644
--- a/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
+++ b/src/Ryujinx.Graphics.Shader/CodeGen/Spirv/Instructions.cs
@@ -838,16 +838,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
}
SamplerDeclaration declaration = context.Samplers[texOp.Binding];
- SpvInstruction image = declaration.Image;
-
- if (declaration.IsIndexed)
- {
- SpvInstruction textureIndex = Src(AggregateType.S32);
-
- image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex);
- }
-
- image = context.Load(declaration.SampledImageType, image);
+ SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex);
int pCount = texOp.Type.GetDimensions();
@@ -1171,16 +1162,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
}
SamplerDeclaration declaration = context.Samplers[texOp.Binding];
- SpvInstruction image = declaration.Image;
-
- if (declaration.IsIndexed)
- {
- SpvInstruction textureIndex = Src(AggregateType.S32);
-
- image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex);
- }
-
- image = context.Load(declaration.SampledImageType, image);
+ SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex);
int coordsCount = texOp.Type.GetDimensions();
@@ -1449,17 +1431,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
{
AstTextureOperation texOp = (AstTextureOperation)operation;
- SamplerDeclaration declaration = context.Samplers[texOp.Binding];
- SpvInstruction image = declaration.Image;
-
- if (declaration.IsIndexed)
- {
- SpvInstruction textureIndex = context.GetS32(texOp.GetSource(0));
+ int srcIndex = 0;
- image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex);
- }
+ SamplerDeclaration declaration = context.Samplers[texOp.Binding];
+ SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex);
- image = context.Load(declaration.SampledImageType, image);
image = context.Image(declaration.ImageType, image);
SpvInstruction result = context.ImageQuerySamples(context.TypeS32(), image);
@@ -1471,17 +1447,11 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
{
AstTextureOperation texOp = (AstTextureOperation)operation;
- SamplerDeclaration declaration = context.Samplers[texOp.Binding];
- SpvInstruction image = declaration.Image;
-
- if (declaration.IsIndexed)
- {
- SpvInstruction textureIndex = context.GetS32(texOp.GetSource(0));
+ int srcIndex = 0;
- image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex);
- }
+ SamplerDeclaration declaration = context.Samplers[texOp.Binding];
+ SpvInstruction image = GenerateSampledImageLoad(context, texOp, declaration, ref srcIndex);
- image = context.Load(declaration.SampledImageType, image);
image = context.Image(declaration.ImageType, image);
if (texOp.Index == 3)
@@ -1506,8 +1476,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
if (hasLod)
{
- int lodSrcIndex = declaration.IsIndexed ? 1 : 0;
- var lod = context.GetS32(operation.GetSource(lodSrcIndex));
+ var lod = context.GetS32(operation.GetSource(srcIndex));
result = context.ImageQuerySizeLod(resultType, image, lod);
}
else
@@ -1905,6 +1874,43 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
}
}
+ private static SpvInstruction GenerateSampledImageLoad(CodeGenContext context, AstTextureOperation texOp, SamplerDeclaration declaration, ref int srcIndex)
+ {
+ SpvInstruction image = declaration.Image;
+
+ if (declaration.IsIndexed)
+ {
+ SpvInstruction textureIndex = context.Get(AggregateType.S32, texOp.GetSource(srcIndex++));
+
+ image = context.AccessChain(declaration.SampledImagePointerType, image, textureIndex);
+ }
+
+ if (texOp.IsSeparate)
+ {
+ image = context.Load(declaration.ImageType, image);
+
+ SamplerDeclaration samplerDeclaration = context.Samplers[texOp.SamplerBinding];
+
+ SpvInstruction sampler = samplerDeclaration.Image;
+
+ if (samplerDeclaration.IsIndexed)
+ {
+ SpvInstruction samplerIndex = context.Get(AggregateType.S32, texOp.GetSource(srcIndex++));
+
+ sampler = context.AccessChain(samplerDeclaration.SampledImagePointerType, sampler, samplerIndex);
+ }
+
+ sampler = context.Load(samplerDeclaration.ImageType, sampler);
+ image = context.SampledImage(declaration.SampledImageType, image, sampler);
+ }
+ else
+ {
+ image = context.Load(declaration.SampledImageType, image);
+ }
+
+ return image;
+ }
+
private static OperationResult GenerateUnary(
CodeGenContext context,
AstOperation operation,