Refactor SPIR-V binary optimization

optimizeSpirv() previously just forwarded the cache key fields to
preprocessSpirv(), so the two have been merged.

Also SpirvShaderKey was renamed to SpirvBinaryKey to reflect that we
no longer cache SpirvShader objects, but store optimized SpirvBinary
instead.

Bug: b/197982536
Change-Id: Id5a0f6f3e7092345d7376141bac2562b6a838066
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/57408
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkPipeline.cpp b/src/Vulkan/VkPipeline.cpp
index 0ff6777..7fad7b5 100644
--- a/src/Vulkan/VkPipeline.cpp
+++ b/src/Vulkan/VkPipeline.cpp
@@ -32,12 +32,13 @@
 
 namespace {
 
-// preprocessSpirv applies and freezes specializations into constants, and inlines all functions.
-sw::SpirvBinary preprocessSpirv(
-    sw::SpirvBinary const &code,
-    VkSpecializationInfo const *specializationInfo,
-    bool optimize)
+// optimizeSpirv() applies and freezes specializations into constants, and runs spirv-opt.
+sw::SpirvBinary optimizeSpirv(const vk::PipelineCache::SpirvBinaryKey &key)
 {
+	const sw::SpirvBinary &code = key.getInsns();
+	const VkSpecializationInfo *specializationInfo = key.getSpecializationInfo();
+	bool optimize = key.getOptimization();
+
 	spvtools::Optimizer opt{ vk::SPIRV_VERSION };
 
 	opt.SetMessageConsumer([](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) {
@@ -90,6 +91,7 @@
 
 	sw::SpirvBinary optimized;
 	opt.Run(code.data(), code.size(), &optimized, optimizerOptions);
+	ASSERT(optimized.size() > 0);
 
 	if(false)
 	{
@@ -105,14 +107,6 @@
 	return optimized;
 }
 
-sw::SpirvBinary optimizeSpirv(const vk::PipelineCache::SpirvShaderKey &key)
-{
-	auto code = preprocessSpirv(key.getInsns(), key.getSpecializationInfo(), key.getOptimization());
-	ASSERT(code.size() > 0);
-
-	return code;
-}
-
 std::shared_ptr<sw::ComputeProgram> createProgram(vk::Device *device, std::shared_ptr<sw::SpirvShader> shader, const vk::PipelineLayout *layout)
 {
 	MARL_SCOPED_EVENT("createProgram");
@@ -225,7 +219,7 @@
 		const bool optimize = !dbgctx;
 
 		const ShaderModule *module = vk::Cast(pStage->module);
-		const PipelineCache::SpirvShaderKey key(module->getCode(), pStage->pSpecializationInfo, optimize);
+		const PipelineCache::SpirvBinaryKey key(module->getCode(), pStage->pSpecializationInfo, optimize);
 
 		sw::SpirvBinary spirv;
 
@@ -282,7 +276,7 @@
 	// instructions.
 	const bool optimize = !dbgctx;
 
-	const PipelineCache::SpirvShaderKey shaderKey(module->getCode(), stage.pSpecializationInfo, optimize);
+	const PipelineCache::SpirvBinaryKey shaderKey(module->getCode(), stage.pSpecializationInfo, optimize);
 
 	sw::SpirvBinary spirv;
 
diff --git a/src/Vulkan/VkPipelineCache.cpp b/src/Vulkan/VkPipelineCache.cpp
index 506e670..817ee5c 100644
--- a/src/Vulkan/VkPipelineCache.cpp
+++ b/src/Vulkan/VkPipelineCache.cpp
@@ -18,7 +18,7 @@
 
 namespace vk {
 
-PipelineCache::SpirvShaderKey::SpirvShaderKey(const sw::SpirvBinary &insns,
+PipelineCache::SpirvBinaryKey::SpirvBinaryKey(const sw::SpirvBinary &insns,
                                               const vk::SpecializationInfo &specializationInfo,
                                               bool optimize)
     : insns(insns)
@@ -27,7 +27,7 @@
 {
 }
 
-bool PipelineCache::SpirvShaderKey::operator<(const SpirvShaderKey &other) const
+bool PipelineCache::SpirvBinaryKey::operator<(const SpirvBinaryKey &other) const
 {
 	if(insns.size() != other.insns.size())
 	{
diff --git a/src/Vulkan/VkPipelineCache.hpp b/src/Vulkan/VkPipelineCache.hpp
index 3b00cb6..195b284 100644
--- a/src/Vulkan/VkPipelineCache.hpp
+++ b/src/Vulkan/VkPipelineCache.hpp
@@ -53,13 +53,13 @@
 	VkResult getData(size_t *pDataSize, void *pData);
 	VkResult merge(uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches);
 
-	struct SpirvShaderKey
+	struct SpirvBinaryKey
 	{
-		SpirvShaderKey(const sw::SpirvBinary &insns,
+		SpirvBinaryKey(const sw::SpirvBinary &insns,
 		               const vk::SpecializationInfo &specializationInfo,
 		               bool optimize);
 
-		bool operator<(const SpirvShaderKey &other) const;
+		bool operator<(const SpirvBinaryKey &other) const;
 
 		const sw::SpirvBinary &getInsns() const { return insns; }
 		const VkSpecializationInfo *getSpecializationInfo() const { return specializationInfo.get(); }
@@ -77,7 +77,7 @@
 	// Function must be a function of the signature:
 	//     sw::ShaderBinary()
 	template<typename Function>
-	inline sw::SpirvBinary getOrOptimizeSpirv(const PipelineCache::SpirvShaderKey &key, Function &&create);
+	inline sw::SpirvBinary getOrOptimizeSpirv(const PipelineCache::SpirvBinaryKey &key, Function &&create);
 
 	struct ComputeProgramKey
 	{
@@ -113,7 +113,7 @@
 	uint8_t *data = nullptr;
 
 	marl::mutex spirvShadersMutex;
-	std::map<SpirvShaderKey, sw::SpirvBinary> spirvShaders GUARDED_BY(spirvShadersMutex);
+	std::map<SpirvBinaryKey, sw::SpirvBinary> spirvShaders GUARDED_BY(spirvShadersMutex);
 
 	marl::mutex computeProgramsMutex;
 	std::map<ComputeProgramKey, std::shared_ptr<sw::ComputeProgram>> computePrograms GUARDED_BY(computeProgramsMutex);
@@ -142,7 +142,7 @@
 }
 
 template<typename Function>
-sw::SpirvBinary PipelineCache::getOrOptimizeSpirv(const PipelineCache::SpirvShaderKey &key, Function &&create)
+sw::SpirvBinary PipelineCache::getOrOptimizeSpirv(const PipelineCache::SpirvBinaryKey &key, Function &&create)
 {
 	marl::lock lock(spirvShadersMutex);