From e0de98e9aabbe118f0eeca7821518c8fb4e1f6c4 Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Wed, 3 Apr 2024 14:19:15 -0400 Subject: 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 --- source/slang/slang-check-decl.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'source/slang/slang-check-decl.cpp') 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()) { - for (auto mod : varDeclRef.getDecl()->modifiers) + if(collection->getMemoryQualifierBit() & MemoryQualifierSetModifier::Flags::kReadOnly) { - if (as(mod)) - { - isLValue = false; - qualType.hasReadOnlyOnTarget = true; - if (isLValue == false && isWriteOnly) break; - } - if (as(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(); - if(!memoryQualifierCollection) + auto MemoryQualifierSet = paramDecl->findModifier(); + if(!MemoryQualifierSet) return; - for(auto mod : memoryQualifierCollection->getModifiers()) + for(auto mod : MemoryQualifierSet->getModifiers()) getSink()->diagnose(paramDecl, Diagnostics::memoryQualifierNotAllowedOnANonImageTypeParameter, mod); } } -- cgit v1.2.3