Fix ComputeProgramKey not strict weak ordering

Example:
ComputeProgramKey a, b;
a.shader = 1;
b.shader = 2;

a.layout = 2;
b.layout = 1;

// This assertion will fail because a < b since a.shader < b.shader,
// but also b < a because b.layout < a.layout.
assert( (a < b) && !(b < a) );

Change-Id: I1061f517cee60a28a1f4239704655e9d320ade46
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36348
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkPipelineCache.hpp b/src/Vulkan/VkPipelineCache.hpp
index 533b56f..7e701ed 100644
--- a/src/Vulkan/VkPipelineCache.hpp
+++ b/src/Vulkan/VkPipelineCache.hpp
@@ -105,7 +105,7 @@
 
 		bool operator<(const ComputeProgramKey &other) const
 		{
-			return (shader < other.shader) || (layout < other.layout);
+			return std::tie(shader, layout) < std::tie(other.shader, other.layout);
 		}
 
 		const sw::SpirvShader* getShader() const { return shader; }