From e49419b0637a357d2e713a0435f0c5ad0c102487 Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Fri, 28 Jun 2024 04:07:12 -0400 Subject: Implement HLSL resource bindings and default type `float4` to `SubpassInput` (#4462) * Add case to `emitVectorReshape` for `vector<>` type, `scalar` value 1. Add new case 2. Add test * fix warning * fix warning * Implement HLSL resource bindings and default type `float4` to `SubpassInput` fixes: #4440 1. Removed GLSLInputAttachmentIndexLayout modifier and the somewhat 'hacky' binding model 'Input Attachment' previously relied upon. This was changed to work with the slang-type-layout rules system. This change allows Slang automatic bindings, HLSL bindings, GLSL bindings, and translation of GLSL to and from HLSL bindings to work. 2. Added default argument `float4` to SubpassInput. 3. Merged glsl.meta and hlsl.meta SubpassInput logic. * fix InputAttachment attribute checks fix InputAttachment attribute checks for HLSL and GLSL syntax * remove unused var * validate attribute correctly Attributes do not have type information. We must check the type expression to validate attribute usage. * remove hacky validation type based validation before types are fully resolved is quite hacky and unstable to changes and wrapped types * fix warning * remove redundant `!= nullptr` * remove extra `!= nullptr` * fix some warnings/errors * subpass capability to limit to dxc & remove default values in some functions * revert logic to previous logic revert logic to return if we have a binding regardless of if a VarDecl is given the binding --- source/slang/slang-type-layout.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'source/slang/slang-type-layout.cpp') diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp index 22aa3f304..293dce7c6 100644 --- a/source/slang/slang-type-layout.cpp +++ b/source/slang/slang-type-layout.cpp @@ -722,6 +722,9 @@ static LayoutResourceKind _getHLSLLayoutResourceKind(ShaderParameterKind kind) { switch (kind) { + case ShaderParameterKind::SubpassInput: + return LayoutResourceKind::InputAttachmentIndex; + case ShaderParameterKind::ConstantBuffer: return LayoutResourceKind::ConstantBuffer; @@ -778,6 +781,13 @@ struct GLSLObjectLayoutRulesImpl : ObjectLayoutRulesImpl } } + switch (kind) + { + case ShaderParameterKind::SubpassInput: + return SimpleLayoutInfo(LayoutResourceKind::InputAttachmentIndex, slotCount); + default: + break; + } return SimpleLayoutInfo(LayoutResourceKind::DescriptorTableSlot, slotCount); } }; @@ -4089,6 +4099,17 @@ static TypeLayoutResult _createTypeLayout( type, rules); } + else if (as(type)) + { + // SubpassInputType fills 2 slots, 'shader resource' and 'input_attachment_index' + auto objLayout1 = rules->GetObjectLayout(ShaderParameterKind::Texture, context.objectLayoutOptions); + auto objLayout2 = rules->GetObjectLayout(ShaderParameterKind::SubpassInput, context.objectLayoutOptions); + objLayout1.layoutInfos.add(objLayout2.layoutInfos.getFirst()); + return createSimpleTypeLayout( + objLayout1, + type, + rules); + } else if (auto textureType = as(type)) { // TODO: the logic here should really be defined by the rules, -- cgit v1.2.3