summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-syntax.cpp11
-rw-r--r--tests/bindings/vk-image-format.slang6
2 files changed, 15 insertions, 2 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp
index 55ed224cb..bb5b574bb 100644
--- a/source/slang/slang-syntax.cpp
+++ b/source/slang/slang-syntax.cpp
@@ -1185,8 +1185,15 @@ bool findVkImageFormatByName(const UnownedStringSlice& name, ImageFormat* outFor
if (name.endsWith(kSNorm))
{
StringBuilder buf;
- // format names end with snormal after a '_', so replace with that
- buf << name.head(name.getLength() - kSNorm.getLength()) << "_" << kSNorm;
+ auto prefix = name.head(name.getLength() - kSNorm.getLength());
+ buf << prefix;
+ // format names end with snormal after a '_', so add an underscore
+ // if the prefix doesn't already end with one
+ if (prefix.getLength() == 0 || prefix[prefix.getLength() - 1] != '_')
+ {
+ buf << "_";
+ }
+ buf << kSNorm;
return findImageFormatByName(buf.getUnownedSlice(), outFormat);
}
diff --git a/tests/bindings/vk-image-format.slang b/tests/bindings/vk-image-format.slang
index 2f7bb53b5..ff0422d28 100644
--- a/tests/bindings/vk-image-format.slang
+++ b/tests/bindings/vk-image-format.slang
@@ -5,6 +5,7 @@
//CHECK: layout(r32f)
//CHECK: layout(r16_snorm)
//CHECK: layout(r11f_g11f_b10f)
+//CHECK: layout(rgba16_snorm)
// Something typical
[vk::image_format("r32f")]
@@ -18,6 +19,10 @@ RWTexture2D<float> snormTexture;
[vk::image_format("r11g11b10f")]
RWTexture2D<float4> specialTexture;
+// snorm with underscore in format name
+[vk::image_format("rgba16_snorm")]
+RWTexture2D<float4> snormTextureWithUnderscore;
+
cbuffer C
{
uint2 index;
@@ -30,6 +35,7 @@ float4 main(): SV_Target
result += typicalTexture[index];
result += snormTexture[index];
result += specialTexture[index];
+ result += snormTextureWithUnderscore[index];
return result;
}