summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-decl.cpp
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-04-03 14:19:15 -0400
committerGitHub <noreply@github.com>2024-04-03 11:19:15 -0700
commite0de98e9aabbe118f0eeca7821518c8fb4e1f6c4 (patch)
treea310629cd025372c6d554705ba7f42251f400ac5 /source/slang/slang-check-decl.cpp
parenta697b2c6707ee699cb734a03fa529dd214ac66cc (diff)
Refactor memory qualifier decorators to be a bit-flag set, resolves #3841 (#3881)
* Refactor memory qualifier decorators to be a bit-flag set. replace GloballyCoherent, ReadOnly, WriteOnly, Volatile, and Restrict memory modifiers and decorations with a bit flag set to more efficiently manage memory qualifiers. added `restrict` modifier to test to ensure the code works when dropping a `restrict` memory qualifier * Refine tests & add SSBO memory qualifer support add CHECK's to tests to ensure memory qualifiers emit as intended added tests and changed code to ensure memory qualifiers work on SSBO objects (SPIR-V & GLSL) * add memory qualifiers & fixes. Add to StructuredBuffer & ByteAddressBuffer `ReadOnly`/NonWritable qualifier. * Memory qualifiers must be decorated on a variable inst. Due to this the qualifier is added after `lowerStructuredBufferType` Fixed an error where ReadOnly->NonReadable & WriteOnly->NonWritable * Adjusted tests accordingly Added back the removed `globallycoherent` memory qualifier emit'ing code in hlsl-emit (was incorrectly removed). undo hlsl.meta changes cleanup
Diffstat (limited to 'source/slang/slang-check-decl.cpp')
-rw-r--r--source/slang/slang-check-decl.cpp24
1 files changed, 9 insertions, 15 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index aec3b463b..5190f8c0e 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -946,21 +946,15 @@ namespace Slang
// Ensures child of struct is set read-only or not
bool isWriteOnly = false;
+ if(auto collection = varDeclRef.getDecl()->findModifier<MemoryQualifierSetModifier>())
{
- for (auto mod : varDeclRef.getDecl()->modifiers)
+ if(collection->getMemoryQualifierBit() & MemoryQualifierSetModifier::Flags::kReadOnly)
{
- if (as<GLSLReadOnlyModifier>(mod))
- {
- isLValue = false;
- qualType.hasReadOnlyOnTarget = true;
- if (isLValue == false && isWriteOnly) break;
- }
- if (as<GLSLWriteOnlyModifier>(mod))
- {
- isWriteOnly = true;
- if (isLValue == false && isWriteOnly) break;
- }
+ isLValue = false;
+ qualType.hasReadOnlyOnTarget = true;
}
+ if(collection->getMemoryQualifierBit() & MemoryQualifierSetModifier::Flags::kWriteOnly)
+ isWriteOnly = true;
}
qualType.isLeftValue = isLValue;
@@ -7162,10 +7156,10 @@ namespace Slang
// Only texture types are allowed to have memory qualifiers on parameters
if(!paramDecl->type || paramDecl->type->astNodeType != ASTNodeType::TextureType)
{
- auto memoryQualifierCollection = paramDecl->findModifier<MemoryQualifierCollectionModifier>();
- if(!memoryQualifierCollection)
+ auto MemoryQualifierSet = paramDecl->findModifier<MemoryQualifierSetModifier>();
+ if(!MemoryQualifierSet)
return;
- for(auto mod : memoryQualifierCollection->getModifiers())
+ for(auto mod : MemoryQualifierSet->getModifiers())
getSink()->diagnose(paramDecl, Diagnostics::memoryQualifierNotAllowedOnANonImageTypeParameter, mod);
}
}