Relax frontend 8- and 16-bit type check (#590)
* Allow clustered pod args in ssbo to work despite contradictory command
line options assuming type mangled push constants will succeed
* fix tests
diff --git a/lib/FrontendPlugin.cpp b/lib/FrontendPlugin.cpp
index 9a7cbb9..a2f7eb8 100644
--- a/lib/FrontendPlugin.cpp
+++ b/lib/FrontendPlugin.cpp
@@ -630,21 +630,28 @@
} else if (clspv::Option::PodArgsInPushConstants()) {
sc = clspv::Option::StorageClass::kPushConstant;
}
- if (contains_16bit &&
- !clspv::Option::Supports16BitStorageClass(sc)) {
- Instance.getDiagnostics().Report(
- P->getSourceRange().getBegin(),
- CustomDiagnosticsIDMap
- [CustomDiagnosticUnsupported16BitStorage])
- << static_cast<int>(sc);
- }
- if (contains_8bit &&
- !clspv::Option::Supports8BitStorageClass(sc)) {
- Instance.getDiagnostics().Report(
- P->getSourceRange().getBegin(),
- CustomDiagnosticsIDMap
- [CustomDiagnosticUnsupported8BitStorage])
- << static_cast<int>(sc);
+
+ if (type->isPointerType() ||
+ sc != clspv::Option::StorageClass::kSSBO ||
+ !clspv::Option::ClusterPodKernelArgs()) {
+ // For clustered pod args, assume we can fall back on
+ // type-mangling.
+ if (contains_16bit &&
+ !clspv::Option::Supports16BitStorageClass(sc)) {
+ Instance.getDiagnostics().Report(
+ P->getSourceRange().getBegin(),
+ CustomDiagnosticsIDMap
+ [CustomDiagnosticUnsupported16BitStorage])
+ << static_cast<int>(sc);
+ }
+ if (contains_8bit &&
+ !clspv::Option::Supports8BitStorageClass(sc)) {
+ Instance.getDiagnostics().Report(
+ P->getSourceRange().getBegin(),
+ CustomDiagnosticsIDMap
+ [CustomDiagnosticUnsupported8BitStorage])
+ << static_cast<int>(sc);
+ }
}
}