Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 12 additions & 9 deletions tools/clang/lib/SPIRV/DeclResultIdMapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1056,7 +1056,8 @@ SpirvInstruction *DeclResultIdMapper::getDeclEvalInfo(const ValueDecl *decl,

SpirvFunctionParameter *
DeclResultIdMapper::createFnParam(const ParmVarDecl *param,
uint32_t dbgArgNumber) {
uint32_t dbgArgNumber,
bool decorateIntrinsicAttrs) {
const auto type = getTypeOrFnRetType(param);
const auto loc = param->getLocation();
const auto range = param->getSourceRange();
Expand All @@ -1071,6 +1072,9 @@ DeclResultIdMapper::createFnParam(const ParmVarDecl *param,
if (isConstantTextureBuffer(type))
fnParamInstr->setLayoutRule(spirvOptions.cBufferLayoutRule);

if (decorateIntrinsicAttrs && param->hasAttrs())
decorateWithIntrinsicAttrs(param, fnParamInstr);

assert(astDecls[param].instr == nullptr);
registerVariableForDecl(param, fnParamInstr);

Expand Down Expand Up @@ -5021,18 +5025,17 @@ bool DeclResultIdMapper::tryToCreateConstantVar(const ValueDecl *decl) {
}

void DeclResultIdMapper::decorateWithIntrinsicAttrs(
const NamedDecl *decl, SpirvVariable *varInst,
const NamedDecl *decl, SpirvInstruction *targetInst,
llvm::function_ref<void(VKDecorateExtAttr *)> extraFunctionForDecoAttr) {
if (!decl->hasAttrs())
return;

// TODO: Handle member field in a struct and function parameter.
for (auto &attr : decl->getAttrs()) {
if (auto decoAttr = dyn_cast<VKDecorateExtAttr>(attr)) {
spvBuilder.decorateWithLiterals(
varInst, decoAttr->getDecorate(),
targetInst, decoAttr->getDecorate(),
{decoAttr->literals_begin(), decoAttr->literals_end()},
varInst->getSourceLocation());
targetInst->getSourceLocation());
extraFunctionForDecoAttr(decoAttr);
continue;
}
Expand All @@ -5041,15 +5044,15 @@ void DeclResultIdMapper::decorateWithIntrinsicAttrs(
for (Expr *arg : decoAttr->arguments()) {
args.push_back(theEmitter.doExpr(arg));
}
spvBuilder.decorateWithIds(varInst, decoAttr->getDecorate(), args,
varInst->getSourceLocation());
spvBuilder.decorateWithIds(targetInst, decoAttr->getDecorate(), args,
targetInst->getSourceLocation());
continue;
}
if (auto decoAttr = dyn_cast<VKDecorateStringExtAttr>(attr)) {
llvm::SmallVector<llvm::StringRef, 2> args(decoAttr->arguments_begin(),
decoAttr->arguments_end());
spvBuilder.decorateWithStrings(varInst, decoAttr->getDecorate(), args,
varInst->getSourceLocation());
spvBuilder.decorateWithStrings(targetInst, decoAttr->getDecorate(), args,
targetInst->getSourceLocation());
continue;
}
}
Expand Down
5 changes: 3 additions & 2 deletions tools/clang/lib/SPIRV/DeclResultIdMapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,8 @@ class DeclResultIdMapper {
/// parameter must have "1", not "0", which is what Clang generates for
/// LLVM debug metadata.
SpirvFunctionParameter *createFnParam(const ParmVarDecl *param,
uint32_t dbgArgNumber = 0);
uint32_t dbgArgNumber = 0,
bool decorateIntrinsicAttrs = true);

/// \brief Creates the counter variable associated with the given param.
/// This is meant to be used for forward-declared functions and this objects
Expand Down Expand Up @@ -577,7 +578,7 @@ class DeclResultIdMapper {
/// Decorate with spirv intrinsic attributes with lamda function variable
/// check
void decorateWithIntrinsicAttrs(
const NamedDecl *decl, SpirvVariable *varInst,
const NamedDecl *decl, SpirvInstruction *targetInst,
llvm::function_ref<void(VKDecorateExtAttr *)> extraFunctionForDecoAttr =
[](VKDecorateExtAttr *) {});

Expand Down
4 changes: 2 additions & 2 deletions tools/clang/lib/SPIRV/SpirvEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1704,8 +1704,8 @@ void SpirvEmitter::doFunctionDecl(const FunctionDecl *decl) {
for (uint32_t i = 0; i < decl->getNumParams(); ++i) {
const ParmVarDecl *paramDecl = decl->getParamDecl(i);
QualType paramType = paramDecl->getType();
auto *param =
declIdMapper.createFnParam(paramDecl, i + 1 + isNonStaticMemberFn);
auto *param = declIdMapper.createFnParam(
paramDecl, i + 1 + isNonStaticMemberFn, !isEntry);
if (isEntry) {
handleNodePayloadArrayType(paramDecl, param);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// RUN: %dxc -T ps_6_0 -E main -fcgl -Vd -spirv -fcgl %s -spirv | FileCheck %s

void SimpleAdd([[vk::ext_decorate(/* spv::DecorationAliased */ 20)]] inout float a,
[[vk::ext_decorate(/* spv::DecorationAliased */ 20)]] inout float b) {
a += 1.0;
b += 2.0;
}

// CHECK: OpDecorate %x Aliased
// CHECK: OpDecorate %a Aliased
// CHECK: OpDecorate %b Aliased
// CHECK: %SimpleAdd = OpFunction %void None {{%[a-zA-Z0-9_]+}}
// CHECK-NEXT: %a = OpFunctionParameter %_ptr_Function_float
// CHECK-NEXT: %b = OpFunctionParameter %_ptr_Function_float

float4 main() : SV_Target {
[[vk::ext_decorate(/*spv::DecorationAliased*/20)]] float x = 43.0;
SimpleAdd(x, x);
return float4(x, x, x, x);
}
Loading