From ea7690558bca71ce3a9453adff4e0135352a352f Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Mon, 30 Mar 2020 19:23:09 -0400 Subject: 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 --- source/slang/slang-parser.cpp | 49 ++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 15 deletions(-) (limited to 'source/slang/slang-parser.cpp') 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 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(); + return SLANG_FAIL; } } - + return SemanticVersion::parse(content, outVersion); + } + + static RefPtr 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(); + auto modifier = new RequiredSPIRVVersionModifier(); + modifier->version = version; + return modifier; } + parser->sink->diagnose(token, Diagnostics::invalidSPIRVVersion); + return RefPtr(); + } - return modifier; + static RefPtr 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(); } static RefPtr 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); -- cgit v1.2.3