summaryrefslogtreecommitdiff
path: root/source/slang/slang-lower-to-ir.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-05-02 20:29:38 -0700
committerGitHub <noreply@github.com>2023-05-02 20:29:38 -0700
commitd52376a65f37fcbbb67428b917fd3819436b6dfb (patch)
treeda25b3c9a00bd003b1970b4a6c4eb38eccf62aa1 /source/slang/slang-lower-to-ir.cpp
parent55291b0bf6d729fcbaf75a01926da7da8975b8e9 (diff)
Various dxc/fxc compatibility fixes. (#2863)
* Various dxc/fxc compatibility fixes. * Cleanup. * Fix test cases. * Fix comments. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-lower-to-ir.cpp')
-rw-r--r--source/slang/slang-lower-to-ir.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp
index 1511615ed..de2d5aff2 100644
--- a/source/slang/slang-lower-to-ir.cpp
+++ b/source/slang/slang-lower-to-ir.cpp
@@ -7648,6 +7648,11 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo>
irAggType,
fieldKey,
fieldType);
+
+ if (auto packOffsetModifier = fieldDecl->findModifier<HLSLPackOffsetSemantic>())
+ {
+ lowerPackOffsetModifier(fieldKey, packOffsetModifier);
+ }
}
// There may be members not handled by the above logic (e.g.,
@@ -7663,6 +7668,36 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo>
return LoweredValInfo::simple(finishOuterGenerics(subBuilder, irAggType, outerGeneric));
}
+ void lowerPackOffsetModifier(IRInst* inst, HLSLPackOffsetSemantic* semantic)
+ {
+ auto builder = getBuilder();
+ int registerOffset = stringToInt(semantic->registerName.getName()->text.getUnownedSlice().tail(1));
+ int componentOffset = 0;
+ if (semantic->componentMask.getContentLength() != 0)
+ {
+ switch (semantic->componentMask.getContent()[0])
+ {
+ case 'x':
+ componentOffset = 0;
+ break;
+ case 'y':
+ componentOffset = 1;
+ break;
+ case 'z':
+ componentOffset = 2;
+ break;
+ case 'w':
+ componentOffset = 3;
+ break;
+ }
+ }
+ builder->addDecoration(
+ inst,
+ kIROp_PackOffsetDecoration,
+ builder->getIntValue(builder->getIntType(), registerOffset),
+ builder->getIntValue(builder->getIntType(), componentOffset));
+ }
+
void lowerRayPayloadAccessModifier(IRInst* inst, RayPayloadAccessSemantic* semantic, IROp op)
{
auto builder = getBuilder();