@@ -1174,48 +1174,57 @@ DeclResultIdMapper::createFileVar(const VarDecl *var,
11741174}
11751175
11761176SpirvInstruction *
1177- DeclResultIdMapper::createResourceHeap (const VarDecl *var,
1178- QualType ResourceType) {
1179- if (spirvOptions.useDescriptorHeap ) {
1180- SpirvUntypedVariableKHR *HeapVar = nullptr ;
1181-
1182- if (isResourceDescriptorHeap (var)) {
1183- if (!ResourceHeapVar) {
1184- const auto loc = var->getLocation ();
1185- const auto *type = spvContext.getUntypedPointerKHRType (
1186- spv::StorageClass::UniformConstant);
1187- ResourceHeapVar = spvBuilder.createUntypedVariableKHR (
1188- type, spv::StorageClass::UniformConstant, loc, " resource_heap" );
1189- spvBuilder.decorateWithLiterals (
1190- ResourceHeapVar, static_cast <uint32_t >(spv::Decoration::BuiltIn),
1191- {static_cast <uint32_t >(spv::BuiltIn::ResourceHeapEXT)}, loc);
1192- }
1193- HeapVar = ResourceHeapVar;
1194- } else if (isSamplerDescriptorHeap (var)) {
1195- if (!SamplerHeapVar) {
1196- const auto loc = var->getLocation ();
1197- const auto *type = spvContext.getUntypedPointerKHRType (
1198- spv::StorageClass::UniformConstant);
1199- SamplerHeapVar = spvBuilder.createUntypedVariableKHR (
1200- type, spv::StorageClass::UniformConstant, loc, " sampler_heap" );
1201- spvBuilder.decorateWithLiterals (
1202- SamplerHeapVar, static_cast <uint32_t >(spv::Decoration::BuiltIn),
1203- {static_cast <uint32_t >(spv::BuiltIn::SamplerHeapEXT)}, loc);
1204- }
1205- HeapVar = SamplerHeapVar;
1206- } else
1207- assert (0 && " Unsupported heap type" );
1177+ DeclResultIdMapper::createResourceDescriptorHeap (const VarDecl *var) {
1178+ SpirvUntypedVariableKHR *HeapVar = nullptr ;
1179+
1180+ if (isResourceDescriptorHeap (var)) {
1181+ if (!ResourceHeapVar) {
1182+ const auto loc = var->getLocation ();
1183+ const auto *type = spvContext.getUntypedPointerKHRType (
1184+ spv::StorageClass::UniformConstant);
1185+ ResourceHeapVar = spvBuilder.createUntypedVariableKHR (
1186+ type, spv::StorageClass::UniformConstant, " resource_heap" , loc);
1187+ spvBuilder.decorateWithLiterals (
1188+ ResourceHeapVar, static_cast <uint32_t >(spv::Decoration::BuiltIn),
1189+ {static_cast <uint32_t >(spv::BuiltIn::ResourceHeapEXT)}, loc);
1190+ }
1191+ HeapVar = ResourceHeapVar;
1192+ } else if (isSamplerDescriptorHeap (var)) {
1193+ if (!SamplerHeapVar) {
1194+ const auto loc = var->getLocation ();
1195+ const auto *type = spvContext.getUntypedPointerKHRType (
1196+ spv::StorageClass::UniformConstant);
1197+ SamplerHeapVar = spvBuilder.createUntypedVariableKHR (
1198+ type, spv::StorageClass::UniformConstant, " sampler_heap" , loc);
1199+ spvBuilder.decorateWithLiterals (
1200+ SamplerHeapVar, static_cast <uint32_t >(spv::Decoration::BuiltIn),
1201+ {static_cast <uint32_t >(spv::BuiltIn::SamplerHeapEXT)}, loc);
1202+ }
1203+ HeapVar = SamplerHeapVar;
1204+ } else
1205+ assert (0 && " Unsupported heap type" );
12081206
1209- // Decorate with BuiltIn
1210- astDecls[var] = createDeclSpirvInfo (HeapVar);
1211- return HeapVar;
1212- }
1207+ // Decorate with BuiltIn
1208+ astDecls[var] = createDeclSpirvInfo (HeapVar);
1209+ return HeapVar;
1210+ }
12131211
1212+ SpirvInstruction *
1213+ DeclResultIdMapper::createEmulatedDescriptorHeap (const VarDecl *var,
1214+ QualType resourceType) {
12141215 QualType ResourceArrayType = astContext.getIncompleteArrayType (
1215- ResourceType , clang::ArrayType::Normal, 0 );
1216+ resourceType , clang::ArrayType::Normal, 0 );
12161217 return createExternVar (var, ResourceArrayType);
12171218}
12181219
1220+ SpirvInstruction *
1221+ DeclResultIdMapper::createResourceHeap (const VarDecl *var,
1222+ QualType resourceType) {
1223+ if (spirvOptions.useDescriptorHeap )
1224+ return createResourceDescriptorHeap (var);
1225+ return createEmulatedDescriptorHeap (var, resourceType);
1226+ }
1227+
12191228SpirvVariable *DeclResultIdMapper::createExternVar (const VarDecl *var) {
12201229 return createExternVar (var, var->getType ());
12211230}
@@ -3933,13 +3942,15 @@ bool DeclResultIdMapper::createPayloadStageVars(
39333942 if (featureManager.isExtensionEnabled (Extension::EXT_mesh_shader)) {
39343943 for (SpirvInstruction *moduleInst :
39353944 spvBuilder.getModule ()->getVariables ()) {
3936- if (auto *moduleVar = dyn_cast<SpirvVariable>(moduleInst)) {
3937- if (moduleVar->getAstResultType () == type) {
3938- moduleVar->setStorageClass (
3939- spv::StorageClass::TaskPayloadWorkgroupEXT);
3940- varInstr = moduleVar;
3941- }
3942- }
3945+ auto *moduleVar = dyn_cast<SpirvVariable>(moduleInst);
3946+ if (!moduleVar)
3947+ continue ;
3948+
3949+ if (moduleVar->getAstResultType () != type)
3950+ continue ;
3951+
3952+ moduleVar->setStorageClass (spv::StorageClass::TaskPayloadWorkgroupEXT);
3953+ varInstr = moduleVar;
39433954 }
39443955 }
39453956
0 commit comments