diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-08-08 00:19:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-08 00:19:36 +0800 |
| commit | dceb1a74fcaa6031148abd2130552c77fc800809 (patch) | |
| tree | 4c340950dc998965ad1c5c96f8d0cd575a74bdb4 | |
| parent | 547ea5cc936e13deada0d14a3a5afd92e9ad438f (diff) | |
Allow parsing some SPIR-V enums in intrinsics (#3062)
* Add TokenReader::AdvanceIf overlaod for TokenType
* Add some spirv defs to parser
* Add comment
| -rw-r--r-- | source/core/slang-token-reader.h | 9 | ||||
| -rw-r--r-- | source/slang/slang-ir-spirv-snippet.cpp | 44 |
2 files changed, 52 insertions, 1 deletions
diff --git a/source/core/slang-token-reader.h b/source/core/slang-token-reader.h index 264693c81..c4b552d29 100644 --- a/source/core/slang-token-reader.h +++ b/source/core/slang-token-reader.h @@ -262,6 +262,15 @@ namespace Misc { } return false; } + bool AdvanceIf(TokenType token) + { + if( LookAhead(token) ) + { + ReadToken(); + return true; + } + return false; + } bool IsEnd() { return tokenPtr == (int)tokens.getCount(); diff --git a/source/slang/slang-ir-spirv-snippet.cpp b/source/slang/slang-ir-spirv-snippet.cpp index 3d416a7e3..81e4d0bff 100644 --- a/source/slang/slang-ir-spirv-snippet.cpp +++ b/source/slang/slang-ir-spirv-snippet.cpp @@ -37,6 +37,48 @@ SpvSnippet::ASMType parseASMType(Slang::Misc::TokenReader& tokenReader) return SpvSnippet::ASMType::None; } +// Read an unsigned integer (a SPIR-V word) or a SPIR-V enum (currently those +// which are coded into this function). +// +// This also 'or's together a list of these words/enums separated by '|' +SpvWord readWordOrWordLiteral(Misc::TokenReader& reader) +{ + SpvWord ret = 0; + do + { + switch(reader.NextToken().Type) + { + case Slang::Misc::TokenType::IntLiteral: + ret = reader.ReadUInt(); + break; + case Slang::Misc::TokenType::Identifier: + { + const auto i = reader.ReadWord(); +#define GO(x) if(i == #x) ret |= Spv ## x + GO(ScopeWorkgroup); + else GO(ScopeDevice); + else GO(MemorySemanticsMaskNone); + else GO(MemorySemanticsAcquireReleaseMask); + else GO(MemorySemanticsUniformMemoryMask); + else GO(MemorySemanticsImageMemoryMask); + else GO(MemorySemanticsAtomicCounterMemoryMask); + else GO(MemorySemanticsWorkgroupMemoryMask); +#undef GO + else + { + reader.Back(1); + throw Misc::TextFormatException( + "Text parsing error: Unrecognized SPIR-V enum: " + i); + } + } + break; + default: + throw Misc::TextFormatException("Text parsing error: Expected int or SPIR-V enum"); + } + } while(reader.AdvanceIf(Misc::TokenType::OpBitOr)); + return ret; +} + RefPtr<SpvSnippet> SpvSnippet::parse(UnownedStringSlice definition) { RefPtr<SpvSnippet> snippet = new SpvSnippet(); @@ -226,7 +268,7 @@ RefPtr<SpvSnippet> SpvSnippet::parse(UnownedStringSlice definition) break; default: - constant.intValues[i] = tokenReader.ReadInt(); + constant.intValues[i] = readWordOrWordLiteral(tokenReader); ++i; break; } |
