summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/emit.cpp22
-rw-r--r--tests/bugs/vk-structured-buffer-binding.hlsl12
-rw-r--r--tests/bugs/vk-structured-buffer-binding.hlsl.expected31
-rw-r--r--tests/vkray/closesthit.slang.glsl4
4 files changed, 66 insertions, 3 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 644725fa8..8038561d0 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -5951,8 +5951,28 @@ struct EmitVisitor
// TODO: we should require either the extension or the version...
requireGLSLVersion(430);
- emit("layout(std430) buffer ");
+ Emit("layout(std430");
+ auto layout = getVarLayout(ctx, varDecl);
+ if (layout)
+ {
+ LayoutResourceKind kind = LayoutResourceKind::DescriptorTableSlot;
+ EmitVarChain chain(layout);
+
+ const UInt index = getBindingOffset(&chain, kind);
+ const UInt space = getBindingSpace(&chain, kind);
+
+ Emit(", binding = ");
+ Emit(index);
+ if (space)
+ {
+ Emit(", set = ");
+ Emit(space);
+ }
+ }
+
+ emit(") buffer ");
+
// Generate a dummy name for the block
emit("_S");
Emit(ctx->shared->uniqueIDCounter++);
diff --git a/tests/bugs/vk-structured-buffer-binding.hlsl b/tests/bugs/vk-structured-buffer-binding.hlsl
new file mode 100644
index 000000000..cdfeb19ab
--- /dev/null
+++ b/tests/bugs/vk-structured-buffer-binding.hlsl
@@ -0,0 +1,12 @@
+//TEST:SIMPLE: -profile ps_4_0 -entry main -target glsl
+///////TEST:REFLECTION:-profile ps_4_0 -target spirv
+
+[[vk::binding(3, 4)]]
+RWStructuredBuffer<uint> gDoneGroups : register(u3);
+
+float4 main(
+ float3 uv : UV)
+ : SV_Target
+{
+ return gDoneGroups[int(uv.z)];
+} \ No newline at end of file
diff --git a/tests/bugs/vk-structured-buffer-binding.hlsl.expected b/tests/bugs/vk-structured-buffer-binding.hlsl.expected
new file mode 100644
index 000000000..fc1cb93ea
--- /dev/null
+++ b/tests/bugs/vk-structured-buffer-binding.hlsl.expected
@@ -0,0 +1,31 @@
+result code = 0
+standard error = {
+}
+standard output = {
+#version 450
+layout(row_major) uniform;
+layout(row_major) buffer;
+
+#line 5 0
+layout(std430, binding = 3, set = 4) buffer _S1 {
+ uint gDoneGroups_0[];
+};
+
+#line 7
+layout(location = 0)
+out vec4 _S2;
+
+
+#line 7
+layout(location = 0)
+in vec3 _S3;
+
+
+#line 7
+void main()
+{
+ _S2 = vec4(gDoneGroups_0[uint(int(_S3.z))]);
+ return;
+}
+
+}
diff --git a/tests/vkray/closesthit.slang.glsl b/tests/vkray/closesthit.slang.glsl
index d4b9e7a6a..ef969ee1c 100644
--- a/tests/vkray/closesthit.slang.glsl
+++ b/tests/vkray/closesthit.slang.glsl
@@ -2,11 +2,11 @@
#version 460
#extension GL_NV_ray_tracing : require
-layout(std430) buffer _S1
+layout(std430, binding = 0) buffer _S1
{
vec4 colors_0[];
};
-
+
struct BuiltInTriangleIntersectionAttributes_0
{
vec2 barycentrics_0;