From ee5842a01cdb2bd6cd4acee7214666f180b95d84 Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 20 Nov 2020 08:34:14 -0800 Subject: Make witness and RTTI handles lower to `uint2`. (#1613) * Make witness and RTTI handles lower to `uint2`. And enable some dynamic dispatch tests on D3D/VK. * Bug fixes. --- source/slang/slang-ir-lower-generics.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'source/slang/slang-ir-lower-generics.cpp') diff --git a/source/slang/slang-ir-lower-generics.cpp b/source/slang/slang-ir-lower-generics.cpp index 5f466c70c..9c852a3c1 100644 --- a/source/slang/slang-ir-lower-generics.cpp +++ b/source/slang/slang-ir-lower-generics.cpp @@ -17,6 +17,8 @@ namespace Slang { // Replace all uses of RTTI objects with its sequential ID. + // Currently we don't use RTTI objects at all, so all of them + // are 0. void specializeRTTIObjectReferences(SharedGenericsLoweringContext* sharedContext) { uint32_t id = 0; @@ -26,7 +28,12 @@ namespace Slang builder.sharedBuilder = &sharedContext->sharedBuilderStorage; builder.setInsertBefore(rtti.Value); IRUse* nextUse = nullptr; - auto idOperand = builder.getIntValue(builder.getUInt64Type(), id); + auto uint2Type = builder.getVectorType( + builder.getUIntType(), builder.getIntValue(builder.getIntType(), 2)); + IRInst* uint2Args[] = { + builder.getIntValue(builder.getUIntType(), id), + builder.getIntValue(builder.getUIntType(), 0)}; + auto idOperand = builder.emitMakeVector(uint2Type, 2, uint2Args); for (auto use = rtti.Value->firstUse; use; use = nextUse) { nextUse = use->nextUse; @@ -38,7 +45,7 @@ namespace Slang } } - // Replace all WitnessTableID type or RTTIHandleType with uint64. + // Replace all WitnessTableID type or RTTIHandleType with `uint2`. void cleanUpRTTIHandleTypes(SharedGenericsLoweringContext* sharedContext) { List instsToRemove; @@ -52,7 +59,9 @@ namespace Slang IRBuilder builder; builder.sharedBuilder = &sharedContext->sharedBuilderStorage; builder.setInsertBefore(inst); - inst->replaceUsesWith(builder.getUInt64Type()); + auto uint2Type = builder.getVectorType( + builder.getUIntType(), builder.getIntValue(builder.getIntType(), 2)); + inst->replaceUsesWith(uint2Type); instsToRemove.add(inst); } break; @@ -99,6 +108,8 @@ namespace Slang if (sink->getErrorCount() != 0) return; + sharedContext->sharedBuilderStorage.deduplicateAndRebuildGlobalNumberingMap(); + specializeRTTIObjectReferences(sharedContext); cleanUpRTTIHandleTypes(sharedContext); -- cgit v1.2.3