|
@@ -22,11 +22,8 @@ FeatureManager::FeatureManager(DiagnosticsEngine &de,
|
|
|
|
|
|
if (opts.allowedExtensions.empty()) {
|
|
|
// If no explicit extension control from command line, use the default mode:
|
|
|
- // allowing all extensions.
|
|
|
- // Special case : KHR_ray_tracing and NV_ray_tracing are mutually exclusive
|
|
|
- // so enable only KHR extension by default
|
|
|
+ // allowing all extensions that are enabled by default.
|
|
|
allowAllKnownExtensions();
|
|
|
- allowedExtensions.reset(static_cast<unsigned>(Extension::NV_ray_tracing));
|
|
|
} else {
|
|
|
for (auto ext : opts.allowedExtensions)
|
|
|
allowExtension(ext);
|
|
@@ -70,7 +67,13 @@ bool FeatureManager::allowExtension(llvm::StringRef name) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-void FeatureManager::allowAllKnownExtensions() { allowedExtensions.set(); }
|
|
|
+void FeatureManager::allowAllKnownExtensions() {
|
|
|
+ allowedExtensions.set();
|
|
|
+ const auto numExtensions = static_cast<uint32_t>(Extension::Unknown);
|
|
|
+ for (uint32_t ext = 0; ext < numExtensions; ++ext)
|
|
|
+ if (!enabledByDefault(static_cast<Extension>(ext)))
|
|
|
+ allowedExtensions.reset(ext);
|
|
|
+}
|
|
|
|
|
|
bool FeatureManager::requestExtension(Extension ext, llvm::StringRef target,
|
|
|
SourceLocation srcLoc) {
|
|
@@ -230,14 +233,29 @@ bool FeatureManager::isExtensionRequiredForTargetEnv(Extension ext) {
|
|
|
return required;
|
|
|
}
|
|
|
|
|
|
-bool FeatureManager::isExtensionEnabled(llvm::StringRef name) {
|
|
|
+bool FeatureManager::isExtensionEnabled(Extension ext) {
|
|
|
bool allowed = false;
|
|
|
- Extension ext = getExtensionSymbol(name);
|
|
|
if (ext != Extension::Unknown &&
|
|
|
allowedExtensions.test(static_cast<unsigned>(ext)))
|
|
|
allowed = true;
|
|
|
return allowed;
|
|
|
}
|
|
|
|
|
|
+bool FeatureManager::enabledByDefault(Extension ext) {
|
|
|
+ switch (ext) {
|
|
|
+ // KHR_ray_tracing and NV_ray_tracing are mutually exclusive so enable only
|
|
|
+ // KHR extension by default
|
|
|
+ case Extension::NV_ray_tracing:
|
|
|
+ return false;
|
|
|
+ // Enabling EXT_demote_to_helper_invocation changes the code generation
|
|
|
+ // behavior for the 'discard' statement. Therefore we will only enable it if
|
|
|
+ // the user explicitly asks for it.
|
|
|
+ case Extension::EXT_demote_to_helper_invocation:
|
|
|
+ return false;
|
|
|
+ default:
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
} // end namespace spirv
|
|
|
} // end namespace clang
|