SpirvShader: 2-way imported extensions lookup
The `extensions` map of ID -> extension has been renamed to `extensionsByID`.
The `extensionsImported` is a new set containing the list of extension names that have been imported. This set can be efficiently queried to determine whether a particular extension is in use.
Bug: b/145351270
Change-Id: I74bbfb2e5b95862c5381037f259262a9d45b6624
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/40092
Tested-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 0df1cfd..2257017 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -442,7 +442,8 @@
UNSUPPORTED("SPIR-V Extension: %s", name);
break;
}
- extensions.emplace(id, ext);
+ extensionsByID.emplace(id, ext);
+ extensionsImported.emplace(ext.name);
break;
}
case spv::OpName:
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index d46f760..1274909 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -748,7 +748,8 @@
HandleMap<Object> defs;
HandleMap<Function> functions;
std::unordered_map<StringID, String> strings;
- HandleMap<Extension> extensions;
+ HandleMap<Extension> extensionsByID;
+ std::unordered_set<Extension::Name> extensionsImported;
Function::ID entryPoint;
const bool robustBufferAccess = true;
@@ -1031,8 +1032,8 @@
Extension const &getExtension(Extension::ID id) const
{
- auto it = extensions.find(id);
- ASSERT_MSG(it != extensions.end(), "Unknown extension %d", id.value());
+ auto it = extensionsByID.find(id);
+ ASSERT_MSG(it != extensionsByID.end(), "Unknown extension %d", id.value());
return it->second;
}