summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/language-feature/descriptor-handle/byte-address-buffer-handle.slang38
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/language-feature/descriptor-handle/byte-address-buffer-handle.slang b/tests/language-feature/descriptor-handle/byte-address-buffer-handle.slang
new file mode 100644
index 000000000..eccba9723
--- /dev/null
+++ b/tests/language-feature/descriptor-handle/byte-address-buffer-handle.slang
@@ -0,0 +1,38 @@
+//TEST:SIMPLE(filecheck=CHECK): -target spirv
+
+// CHECK: OpAccessChain %_ptr_StorageBuffer_RWStructuredBuffer %resourceHandles
+
+[vk::binding(0, 0)]
+__DynamicResource<__DynamicResourceKind.General> resourceHandles[];
+
+[vk::binding(0, 1)]
+__DynamicResource<__DynamicResourceKind.Sampler> samplerHandles[];
+
+export T getDescriptorFromHandle<T>(DescriptorHandle<T> handle) where T : IOpaqueDescriptor
+{
+ __target_switch
+ {
+ case spirv:
+ if (T.kind == DescriptorKind.Sampler) {
+ return samplerHandles[((uint2)handle).x].asOpaqueDescriptor<T>();
+ }
+ else {
+ return resourceHandles[((uint2)handle).x].asOpaqueDescriptor<T>();
+ }
+ default:
+ return defaultGetDescriptorFromHandle(handle);
+ }
+}
+
+// test.slang
+struct PushConstant
+{
+ RWByteAddressBuffer.Handle test_buffer;
+};
+[[vk::push_constant]] PushConstant constant;
+
+[shader("fragment")]
+void main_test_fs(float2 fragment_coord: SV_Position, out float4 color: SV_Target)
+{
+ color = float4(constant.test_buffer.Load<uint3>(0), 1.0);
+}