From 044b52c3195edf3282a0b530a21ad54b87135cd9 Mon Sep 17 00:00:00 2001 From: Anders Leino Date: Mon, 25 Nov 2024 15:40:47 +0200 Subject: Fix issue where inter-stage parameters without semantics don't get location attributes (#5670) * wgsl: Make sure each shader input field has a semantic This closes #5633. * Add test for inter-stage variables without semantics This verifies the fix of the second issue identified in https://github.com/shader-slang/slang/issues/5633 * format code --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- source/slang/slang-ir-wgsl-legalize.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/slang/slang-ir-wgsl-legalize.cpp b/source/slang/slang-ir-wgsl-legalize.cpp index 8eb820b4d..4d5f6e4ba 100644 --- a/source/slang/slang-ir-wgsl-legalize.cpp +++ b/source/slang/slang-ir-wgsl-legalize.cpp @@ -147,6 +147,9 @@ struct LegalizeWGSLEntryPointContext semanticInfoToRemove); // Validate/rearange all semantics which overlap in our flat struct. fixFieldSemanticsOfFlatStruct(flattenedStruct); + ensureStructHasUserSemantic( + flattenedStruct, + layout); if (flattenedStruct != structType) { // Replace the 'old IRParam type' with a 'new IRParam type' @@ -381,7 +384,8 @@ struct LegalizeWGSLEntryPointContext semanticName); } - void ensureResultStructHasUserSemantic(IRStructType* structType, IRVarLayout* varLayout) + template + void ensureStructHasUserSemantic(IRStructType* structType, IRVarLayout* varLayout) { // Ensure each field in an output struct type has either a system semantic or a user // semantic, so that signature matching can happen correctly. @@ -415,11 +419,10 @@ struct LegalizeWGSLEntryPointContext } typeLayout->getFieldLayout(index); auto fieldLayout = typeLayout->getFieldLayout(index); - if (auto offsetAttr = fieldLayout->findOffsetAttr(LayoutResourceKind::VaryingOutput)) + if (auto offsetAttr = fieldLayout->findOffsetAttr(K)) { UInt varOffset = 0; - if (auto varOffsetAttr = - varLayout->findOffsetAttr(LayoutResourceKind::VaryingOutput)) + if (auto varOffsetAttr = varLayout->findOffsetAttr(K)) varOffset = varOffsetAttr->getOffset(); varOffset += offsetAttr->getOffset(); builder.addSemanticDecoration(key, toSlice("_slang_attr"), (int)varOffset); @@ -1101,7 +1104,9 @@ struct LegalizeWGSLEntryPointContext } // Ensure non-overlapping semantics fixFieldSemanticsOfFlatStruct(flattenedStruct); - ensureResultStructHasUserSemantic(flattenedStruct, resultLayout); + ensureStructHasUserSemantic( + flattenedStruct, + resultLayout); return; } @@ -1121,7 +1126,7 @@ struct LegalizeWGSLEntryPointContext auto typeLayout = structTypeLayoutBuilder.build(); IRVarLayout::Builder varLayoutBuilder(&builder, typeLayout); auto varLayout = varLayoutBuilder.build(); - ensureResultStructHasUserSemantic(structType, varLayout); + ensureStructHasUserSemantic(structType, varLayout); _replaceAllReturnInst( builder, -- cgit v1.2.3