From d52376a65f37fcbbb67428b917fd3819436b6dfb Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 2 May 2023 20:29:38 -0700 Subject: Various dxc/fxc compatibility fixes. (#2863) * Various dxc/fxc compatibility fixes. * Cleanup. * Fix test cases. * Fix comments. --------- Co-authored-by: Yong He --- source/slang/slang-check-modifier.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'source/slang/slang-check-modifier.cpp') diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index 61f3f1196..2d5f6aad7 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -918,6 +918,40 @@ namespace Slang // See SemanticsDeclHeaderVisitor::checkExtensionExternVarAttribute. } } + + if (auto packOffsetModifier = as(m)) + { + if (!packOffsetModifier->registerName.getContent().startsWith("c")) + { + getSink()->diagnose(packOffsetModifier, Diagnostics::unknownRegisterClass, packOffsetModifier->registerName); + return m; + } + auto uniformOffset = stringToInt(packOffsetModifier->registerName.getContent().tail(1)) * 16; + if (packOffsetModifier->componentMask.getContentLength()) + { + switch (packOffsetModifier->componentMask.getContent()[0]) + { + case 'x': + uniformOffset += 0; + break; + case 'y': + uniformOffset += 4; + break; + case 'z': + uniformOffset += 8; + break; + case 'w': + uniformOffset += 12; + break; + default: + getSink()->diagnose(packOffsetModifier, Diagnostics::invalidComponentMask, packOffsetModifier->componentMask); + break; + } + } + packOffsetModifier->uniformOffset = uniformOffset; + return packOffsetModifier; + } + // Default behavior is to leave things as they are, // and assume that modifiers are mostly already checked. // -- cgit v1.2.3