From 3d60cc0ca818556b78f38a59eb5521044b8a6b71 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Fri, 30 Nov 2018 17:52:52 -0800 Subject: Add support for Vulkan raytraicng "shader record" (#735) The syntax for this is a placeholder for now, since we will probably want to migrate to whatever gets decided on for dxc. To declare that some data should be part of the "shader record" use `layout(shaderRecordNV)` to mirror the GLSL raytracing extension: ```hlsl layout(shaderRecordNV) cbuffer MyShaderRecord { float4 someColor; uint someValue; } ``` The intention (not enforced) is that an application would map `MyShaderRecord` to "root constants" in the "local root signature" when compiling for DXR, while the output code in GLSL will always map to the shader record in Vulkan raytracing: ```glsl layout(shaderRecordNV) buffer MyShaderRecord { float4 someColor; uint someValue; }; ``` This change does *not* support declaring a global value of `struct` type with `layout(shaderRecordNV)` (or a `ParameterBlock` with the modifiers, although that would be a nice-to-have feature) and it does *not* support having the contents of the shader record be mutable (even if GLSL/Vulkan allows it). Those can/should be added in future changes. In terms of implementation, this closely mirrors the way that `layout(push_constant)` buffers were being handled, where the data inside the `ConstantBuffer` (the value of type `X`) gets laid out using ordinary rules (and consuming ordinary `UNIFORM` storage, while the buffer itself is given a different layout resource to reflect that fact that it does not consume a VK `binding` any more, but a different conceptual resource. Note: an alternative design here (that might actually be preferrable) would be to have both push-constant and shader-record buffers be handled as alternative aliases for `ConstantBuffer` (or maybe `ParameterBlock`) so that you have, e.g.: ```hlsl PushConstantBuffer myPushConstants; ShaderRecord myShaderRecord; ``` This alternative design avoids API-specific decorations on the declarations, and reflects the intent of the programmer very directly, even when they are compiling for a target like D3D that doesn't reflect these choices at the IL level (it could still be exposed through the Slang reflection API). --- slang.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'slang.h') diff --git a/slang.h b/slang.h index 20ecfe3b4..ed0fb32a4 100644 --- a/slang.h +++ b/slang.h @@ -1394,6 +1394,7 @@ extern "C" SLANG_PARAMETER_CATEGORY_RAY_PAYLOAD, SLANG_PARAMETER_CATEGORY_HIT_ATTRIBUTES, SLANG_PARAMETER_CATEGORY_CALLABLE_PAYLOAD, + SLANG_PARAMETER_CATEGORY_SHADER_RECORD, // SLANG_PARAMETER_CATEGORY_COUNT, @@ -1712,6 +1713,8 @@ namespace slang HitAttributes = SLANG_PARAMETER_CATEGORY_HIT_ATTRIBUTES, CallablePayload = SLANG_PARAMETER_CATEGORY_CALLABLE_PAYLOAD, + ShaderRecord = SLANG_PARAMETER_CATEGORY_SHADER_RECORD, + // DEPRECATED: VertexInput = SLANG_PARAMETER_CATEGORY_VERTEX_INPUT, FragmentOutput = SLANG_PARAMETER_CATEGORY_FRAGMENT_OUTPUT, -- cgit v1.2.3