summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-parser.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-03-30 19:23:09 -0400
committerGitHub <noreply@github.com>2020-03-30 23:23:09 +0000
commitea7690558bca71ce3a9453adff4e0135352a352f (patch)
tree3eb983d3f8e6b1c215f6d2818a0f3e793ecb4485 /source/slang/slang-parser.cpp
parentad5b60c8b5868c69a979779f201748fb7837fdc9 (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.cpp49
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);