summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorPankaj Mistry <63069047+pmistryNV@users.noreply.github.com>2024-01-02 16:22:59 -0800
committerGitHub <noreply@github.com>2024-01-02 16:22:59 -0800
commitf33485c105b354a5a183732f47b9ca59c10ea08f (patch)
treee2c2501bd2aebb3f36d9fdd57287e8e98ac5c13c /source
parentf1f5e60ac541811b33172be78415474087b37571 (diff)
Update the GetDimension hlsl builtin for spirv path. In case of sampler, a combined sampled image needs an OpImage to be generated. (#3424)
Diffstat (limited to 'source')
-rw-r--r--source/slang/hlsl.meta.slang2
-rw-r--r--source/slang/slang-stdlib-textures.cpp62
-rw-r--r--source/slang/slang-stdlib-textures.h9
3 files changed, 53 insertions, 20 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index b88b861ed..144141b79 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -957,7 +957,7 @@ extension __TextureImpl<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
}
}
-// Texture.GetDimensions
+// Texture.GetDimensions and Sampler.GetDimensions
${{{{
const char* kTextureShapeTypeNames[] = {
"__Shape1D", "__Shape2D", "__Shape3D", "__ShapeCube"};
diff --git a/source/slang/slang-stdlib-textures.cpp b/source/slang/slang-stdlib-textures.cpp
index 9ebfc54d6..a6c955b36 100644
--- a/source/slang/slang-stdlib-textures.cpp
+++ b/source/slang/slang-stdlib-textures.cpp
@@ -66,7 +66,8 @@ void TextureTypeInfo::writeFuncBody(
const char* funcName,
const String& glsl,
const String& cuda,
- const String& spirv)
+ const String& spirvDefault,
+ const String& spirvCombined)
{
BraceScope funcScope{i, sb};
{
@@ -88,12 +89,25 @@ void TextureTypeInfo::writeFuncBody(
sb << i << "case cuda:\n";
sb << i << "__intrinsic_asm \"" << cuda << "\";\n";
}
- if(spirv.getLength())
+ if(spirvDefault.getLength() && spirvCombined.getLength())
{
sb << i << "case spirv:\n";
- sb << i << "return spirv_asm\n";
- BraceScope spirvScope{i, sb, ";\n"};
- sb << spirv << "\n";
+ sb << i << "if (isCombined != 0)\n";
+ sb << i << "{\n";
+ {
+ sb << i << "return spirv_asm\n";
+ BraceScope spirvCombinedScope{i, sb, ";\n"};
+ sb << spirvCombined << "\n";
+ }
+ sb << i << "}\n";
+ sb << i << "else\n";
+ sb << i << "{\n";
+ {
+ sb << i << "return spirv_asm\n";
+ BraceScope spirvDefaultScope{i, sb, ";\n"};
+ sb << spirvDefault << "\n";
+ }
+ sb << i << "}\n";
}
}
}
@@ -102,7 +116,8 @@ void TextureTypeInfo::writeFuncWithSig(
const char* funcName,
const String& sig,
const String& glsl,
- const String& spirv,
+ const String& spirvDefault,
+ const String& spirvCombined,
const String& cuda,
const ReadNoneMode readNoneMode)
{
@@ -111,7 +126,7 @@ void TextureTypeInfo::writeFuncWithSig(
sb << i << "[__readNone]\n";
sb << i << "[ForceInline]\n";
sb << i << sig << "\n";
- writeFuncBody(funcName, glsl, cuda, spirv);
+ writeFuncBody(funcName, glsl, cuda, spirvDefault, spirvCombined);
sb << "\n";
}
@@ -120,7 +135,8 @@ void TextureTypeInfo::writeFunc(
const char* funcName,
const String& params,
const String& glsl,
- const String& spirv,
+ const String& spirvDefault,
+ const String& spirvCombined,
const String& cuda,
const ReadNoneMode readNoneMode)
{
@@ -128,7 +144,8 @@ void TextureTypeInfo::writeFunc(
funcName,
cat(returnType, " ", funcName, "(", params, ")"),
glsl,
- spirv,
+ spirvDefault,
+ spirvCombined,
cuda,
readNoneMode
);
@@ -271,16 +288,17 @@ void TextureTypeInfo::writeGetDimensionFunctions()
glsl << "\";\n";
}
- StringBuilder spirv;
+ // SPIRV ASM generation
+ auto generateSpirvAsm = [&](StringBuilder& spirv, UnownedStringSlice imageVar)
{
- spirv << "OpCapability ImageQuery; ";
spirv << "%vecSize:$$uint";
if (sizeDimCount > 1) spirv << sizeDimCount;
spirv << " = ";
if (isMultisample)
- spirv << "OpImageQuerySize $this;";
+ spirv << "OpImageQuerySize " << imageVar << ";";
else
- spirv << "OpImageQuerySizeLod $this $0;";
+ spirv << "OpImageQuerySizeLod " << imageVar <<" $0;";
+
auto convertAndStore = [&](UnownedStringSlice uintSourceVal, const char* destParam)
{
if (UnownedStringSlice(rawT) == "uint")
@@ -343,17 +361,28 @@ void TextureTypeInfo::writeGetDimensionFunctions()
if (isMultisample)
{
- spirv << "%_sampleCount : $$uint = OpImageQuerySamples $this;";
+ spirv << "%_sampleCount : $$uint = OpImageQuerySamples" << imageVar << ";";
convertAndStore(UnownedStringSlice("_sampleCount"), "sampleCount");
}
if (includeMipInfo)
{
- spirv << "%_levelCount : $$uint = OpImageQueryLevels $this;";
+ spirv << "%_levelCount : $$uint = OpImageQueryLevels" << imageVar << ";";
convertAndStore(UnownedStringSlice("_levelCount"), "numberOfLevels");
}
+ };
+ StringBuilder spirvCombined;
+ {
+ spirvCombined << "OpCapability ImageQuery; ";
+ spirvCombined << "%image:__imageType(this) = OpImage $this; ";
+ generateSpirvAsm(spirvCombined, toSlice("%image"));
}
+ StringBuilder spirvDefault;
+ {
+ spirvDefault << "OpCapability ImageQuery; ";
+ generateSpirvAsm(spirvDefault, toSlice("$this"));
+ }
sb << " __glsl_version(450)\n";
sb << " __glsl_extension(GL_EXT_samplerless_texture_functions)\n";
writeFunc(
@@ -361,7 +390,8 @@ void TextureTypeInfo::writeGetDimensionFunctions()
"GetDimensions",
params,
glsl,
- spirv,
+ spirvDefault,
+ spirvCombined,
"",
ReadNoneMode::Always);
}
diff --git a/source/slang/slang-stdlib-textures.h b/source/slang/slang-stdlib-textures.h
index 35aed3e27..38ca41862 100644
--- a/source/slang/slang-stdlib-textures.h
+++ b/source/slang/slang-stdlib-textures.h
@@ -66,13 +66,15 @@ public:
const char* funcName,
const String& glsl,
const String& cuda,
- const String& spirv
+ const String& spirvDefault,
+ const String& spirvCombined
);
void writeFuncWithSig(
const char* funcName,
const String& sig,
const String& glsl = String{},
- const String& spirv = String{},
+ const String& spirvDefault = String{},
+ const String& spirvCombined = String{},
const String& cuda = String{},
const ReadNoneMode readNoneMode = ReadNoneMode::Never
);
@@ -81,7 +83,8 @@ public:
const char* funcName,
const String& params,
const String& glsl = String{},
- const String& spirv = String{},
+ const String& spirvDefault = String{},
+ const String& spirvCombined = String{},
const String& cuda = String{},
const ReadNoneMode readNoneMode = ReadNoneMode::Never
);