@@ -1056,7 +1056,8 @@ SpirvInstruction *DeclResultIdMapper::getDeclEvalInfo(const ValueDecl *decl,
10561056
10571057SpirvFunctionParameter *
10581058DeclResultIdMapper::createFnParam (const ParmVarDecl *param,
1059- uint32_t dbgArgNumber) {
1059+ uint32_t dbgArgNumber,
1060+ bool decorateIntrinsicAttrs) {
10601061 const auto type = getTypeOrFnRetType (param);
10611062 const auto loc = param->getLocation ();
10621063 const auto range = param->getSourceRange ();
@@ -1073,6 +1074,9 @@ DeclResultIdMapper::createFnParam(const ParmVarDecl *param,
10731074 if (isTextureBuffer (type))
10741075 fnParamInstr->setLayoutRule (spirvOptions.tBufferLayoutRule );
10751076
1077+ if (decorateIntrinsicAttrs && param->hasAttrs ())
1078+ decorateWithIntrinsicAttrs (param, fnParamInstr);
1079+
10761080 assert (astDecls[param].instr == nullptr );
10771081 registerVariableForDecl (param, fnParamInstr);
10781082
@@ -5028,18 +5032,17 @@ bool DeclResultIdMapper::tryToCreateConstantVar(const ValueDecl *decl) {
50285032}
50295033
50305034void DeclResultIdMapper::decorateWithIntrinsicAttrs (
5031- const NamedDecl *decl, SpirvVariable *varInst ,
5035+ const NamedDecl *decl, SpirvInstruction *targetInst ,
50325036 llvm::function_ref<void (VKDecorateExtAttr *)> extraFunctionForDecoAttr) {
50335037 if (!decl->hasAttrs ())
50345038 return ;
50355039
5036- // TODO: Handle member field in a struct and function parameter.
50375040 for (auto &attr : decl->getAttrs ()) {
50385041 if (auto decoAttr = dyn_cast<VKDecorateExtAttr>(attr)) {
50395042 spvBuilder.decorateWithLiterals (
5040- varInst , decoAttr->getDecorate (),
5043+ targetInst , decoAttr->getDecorate (),
50415044 {decoAttr->literals_begin (), decoAttr->literals_end ()},
5042- varInst ->getSourceLocation ());
5045+ targetInst ->getSourceLocation ());
50435046 extraFunctionForDecoAttr (decoAttr);
50445047 continue ;
50455048 }
@@ -5048,15 +5051,15 @@ void DeclResultIdMapper::decorateWithIntrinsicAttrs(
50485051 for (Expr *arg : decoAttr->arguments ()) {
50495052 args.push_back (theEmitter.doExpr (arg));
50505053 }
5051- spvBuilder.decorateWithIds (varInst , decoAttr->getDecorate (), args,
5052- varInst ->getSourceLocation ());
5054+ spvBuilder.decorateWithIds (targetInst , decoAttr->getDecorate (), args,
5055+ targetInst ->getSourceLocation ());
50535056 continue ;
50545057 }
50555058 if (auto decoAttr = dyn_cast<VKDecorateStringExtAttr>(attr)) {
50565059 llvm::SmallVector<llvm::StringRef, 2 > args (decoAttr->arguments_begin (),
50575060 decoAttr->arguments_end ());
5058- spvBuilder.decorateWithStrings (varInst , decoAttr->getDecorate (), args,
5059- varInst ->getSourceLocation ());
5061+ spvBuilder.decorateWithStrings (targetInst , decoAttr->getDecorate (), args,
5062+ targetInst ->getSourceLocation ());
50605063 continue ;
50615064 }
50625065 }
0 commit comments