diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-03-30 19:23:09 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-30 23:23:09 +0000 |
| commit | ea7690558bca71ce3a9453adff4e0135352a352f (patch) | |
| tree | 3eb983d3f8e6b1c215f6d2818a0f3e793ecb4485 /source/slang/slang-parser.cpp | |
| parent | ad5b60c8b5868c69a979779f201748fb7837fdc9 (diff) | |
CUDA version handling (#1301)
* render feature for CUDA compute model.
* Use SemanticVersion type.
* Enable CUDA wave tests that require CUDA SM 7.0.
Provide mechanism for DownstreamCompiler to specify version numbers.
* Enabled wave-equality.slang
* Make CUDA SM version major version not just a single digit.
* Fix assert.
* DownstreamCompiler::Version -> CapabilityVersion
Diffstat (limited to 'source/slang/slang-parser.cpp')
| -rw-r--r-- | source/slang/slang-parser.cpp | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 46dd617a1..5a99f6ffb 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -4819,17 +4819,17 @@ namespace Slang return modifier; } - static RefPtr<RefObject> parseSPIRVVersionModifier(Parser* parser, void* /*userData*/) - { - auto modifier = new RequiredSPIRVVersionModifier(); + + static SlangResult parseSemanticVersion(Parser* parser, Token& outToken, SemanticVersion& outVersion) + { parser->ReadToken(TokenType::LParent); - Token token = parser->ReadToken(); + outToken = parser->ReadToken(); parser->ReadToken(TokenType::RParent); - UnownedStringSlice content = token.Content; + UnownedStringSlice content = outToken.Content; // We allow specified as major.minor or as a string (in quotes) - switch (token.type) + switch (outToken.type) { case TokenType::FloatingPointLiteral: { @@ -4838,26 +4838,44 @@ namespace Slang case TokenType::StringLiteral: { // We need to trim quotes if needed - SLANG_ASSERT(content.getLength() >= 2 && content[0] == '"' && content[content.getLength() -1] == '"'); + SLANG_ASSERT(content.getLength() >= 2 && content[0] == '"' && content[content.getLength() - 1] == '"'); content = UnownedStringSlice(content.begin() + 1, content.end() - 1); break; } default: { - parser->sink->diagnose(token, Diagnostics::invalidSPIRVVersion); - return RefPtr<RefObject>(); + return SLANG_FAIL; } } - + return SemanticVersion::parse(content, outVersion); + } + + static RefPtr<RefObject> parseSPIRVVersionModifier(Parser* parser, void* /*userData*/) + { + Token token; SemanticVersion version; - if (SLANG_FAILED(SemanticVersion::parse(content, modifier->version))) + if (SLANG_SUCCEEDED(parseSemanticVersion(parser, token, version))) { - // Unable to parse the error so fail - parser->sink->diagnose(token, Diagnostics::invalidSPIRVVersion); - return RefPtr<RefObject>(); + auto modifier = new RequiredSPIRVVersionModifier(); + modifier->version = version; + return modifier; } + parser->sink->diagnose(token, Diagnostics::invalidSPIRVVersion); + return RefPtr<RefObject>(); + } - return modifier; + static RefPtr<RefObject> parseCUDASMVersionModifier(Parser* parser, void* /*userData*/) + { + Token token; + SemanticVersion version; + if (SLANG_SUCCEEDED(parseSemanticVersion(parser, token, version))) + { + auto modifier = new RequiredCUDASMVersionModifier(); + modifier->version = version; + return modifier; + } + parser->sink->diagnose(token, Diagnostics::invalidCUDASMVersion); + return RefPtr<RefObject>(); } static RefPtr<RefObject> parseLayoutModifier(Parser* parser, void* /*userData*/) @@ -5149,6 +5167,7 @@ namespace Slang MODIFIER(__glsl_extension, parseGLSLExtensionModifier); MODIFIER(__glsl_version, parseGLSLVersionModifier); MODIFIER(__spirv_version, parseSPIRVVersionModifier); + MODIFIER(__cuda_sm_version, parseCUDASMVersionModifier); MODIFIER(__builtin_type, parseBuiltinTypeModifier); MODIFIER(__magic_type, parseMagicTypeModifier); |
