Skip to content

Commit

Permalink
Fix DxilPayloadFieldAnnotation::GetPayloadFieldQualifier (#6942)
Browse files Browse the repository at this point in the history
Fixes #6941
  • Loading branch information
jenatali authored Oct 4, 2024
1 parent 775a6b8 commit d6d3f02
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 25 deletions.
26 changes: 4 additions & 22 deletions lib/DXIL/DxilTypeSystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,31 +175,13 @@ void DxilPayloadFieldAnnotation::AddPayloadFieldQualifier(
DXIL::PayloadAccessQualifier
DxilPayloadFieldAnnotation::GetPayloadFieldQualifier(
DXIL::PayloadAccessShaderStage shaderStage) const {
if (!HasAnnotations())
return DXIL::PayloadAccessQualifier::ReadWrite;

int bitOffset = GetBitOffsetForShaderStage(shaderStage);

// default type is always ReadWrite
DXIL::PayloadAccessQualifier accessType =
DXIL::PayloadAccessQualifier::ReadWrite;

const unsigned readBit =
static_cast<unsigned>(DXIL::PayloadAccessQualifier::Read);
const unsigned writeBit =
static_cast<unsigned>(DXIL::PayloadAccessQualifier::Write);

unsigned accessBits = m_bitmask >> bitOffset;
if (accessBits & readBit) {
// set Read if the first bit is set
accessType = DXIL::PayloadAccessQualifier::Read;
}
if (accessBits & writeBit) {

// set Write only if the second bit set, if both are set set to ReadWrite
accessType = accessType == DXIL::PayloadAccessQualifier::ReadWrite
? DXIL::PayloadAccessQualifier::Write
: DXIL::PayloadAccessQualifier::ReadWrite;
}
return accessType;
return (DXIL::PayloadAccessQualifier)(
accessBits & DXIL::PayloadAccessQualifierValidMaskPerStage);
}

bool DxilPayloadFieldAnnotation::HasAnnotations() const {
Expand Down
25 changes: 22 additions & 3 deletions tools/clang/unittests/HLSL/DxilModuleTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -571,9 +571,11 @@ TEST_F(DxilModuleTest, PayloadQualifier) {
"{\n"
" double a : read(caller, closesthit, anyhit) : "
"write(caller, miss, closesthit);\n"
" int b : read(caller) : write(miss);\n"
"};\n\n"
"[shader(\"miss\")]\n"
"void Miss( inout Payload payload ) { payload.a = 4.2; }\n";
"void Miss( inout Payload payload ) { payload.a = 4.2; "
"payload.b = 1; }\n";

c.Compile(shader, L"lib_6_6", arguments, {});

Expand All @@ -582,9 +584,9 @@ TEST_F(DxilModuleTest, PayloadQualifier) {

for (auto &p : DTS.GetPayloadAnnotationMap()) {
const DxilPayloadAnnotation &plAnnotation = *p.second;
for (unsigned i = 0; i < plAnnotation.GetNumFields(); ++i) {
{
const DxilPayloadFieldAnnotation &fieldAnnotation =
plAnnotation.GetFieldAnnotation(i);
plAnnotation.GetFieldAnnotation(0);
VERIFY_IS_TRUE(fieldAnnotation.HasAnnotations());
VERIFY_ARE_EQUAL(DXIL::PayloadAccessQualifier::ReadWrite,
fieldAnnotation.GetPayloadFieldQualifier(
Expand All @@ -599,6 +601,23 @@ TEST_F(DxilModuleTest, PayloadQualifier) {
fieldAnnotation.GetPayloadFieldQualifier(
DXIL::PayloadAccessShaderStage::Anyhit));
}
{
const DxilPayloadFieldAnnotation &fieldAnnotation =
plAnnotation.GetFieldAnnotation(1);
VERIFY_IS_TRUE(fieldAnnotation.HasAnnotations());
VERIFY_ARE_EQUAL(DXIL::PayloadAccessQualifier::Read,
fieldAnnotation.GetPayloadFieldQualifier(
DXIL::PayloadAccessShaderStage::Caller));
VERIFY_ARE_EQUAL(DXIL::PayloadAccessQualifier::NoAccess,
fieldAnnotation.GetPayloadFieldQualifier(
DXIL::PayloadAccessShaderStage::Closesthit));
VERIFY_ARE_EQUAL(DXIL::PayloadAccessQualifier::Write,
fieldAnnotation.GetPayloadFieldQualifier(
DXIL::PayloadAccessShaderStage::Miss));
VERIFY_ARE_EQUAL(DXIL::PayloadAccessQualifier::NoAccess,
fieldAnnotation.GetPayloadFieldQualifier(
DXIL::PayloadAccessShaderStage::Anyhit));
}
}
}

Expand Down

0 comments on commit d6d3f02

Please sign in to comment.