diff options
| -rw-r--r-- | source/slang/emit.cpp | 22 | ||||
| -rw-r--r-- | tests/bugs/vk-structured-buffer-binding.hlsl | 12 | ||||
| -rw-r--r-- | tests/bugs/vk-structured-buffer-binding.hlsl.expected | 31 | ||||
| -rw-r--r-- | tests/vkray/closesthit.slang.glsl | 4 |
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; |
