SpirvShader: Use an atomic instead of a volatile int for serialCounter

Using 'volatile' does not make anything thread safe.

Shuts up a bunch of TSAN errors.

Bug: b/133127573
Change-Id: I90b708ac53824de91c316f61f137ecca34087047
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31830
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index cb70299..3fa6ab3 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -367,7 +367,7 @@
 
 	} // namespace SIMD
 
-	volatile int SpirvShader::serialCounter = 1;    // Start at 1, 0 is invalid shader.
+	std::atomic<int> SpirvShader::serialCounter(1);    // Start at 1, 0 is invalid shader.
 
 	SpirvShader::SpirvShader(
 			VkPipelineShaderStageCreateInfo const *createInfo,
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 3f5997d..c8b9f93 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -29,16 +29,17 @@
 #include <spirv/unified1/spirv.hpp>
 
 #include <array>
+#include <atomic>
+#include <cstdint>
 #include <cstring>
 #include <functional>
-#include <string>
-#include <vector>
-#include <unordered_set>
-#include <unordered_map>
-#include <cstdint>
-#include <type_traits>
 #include <memory>
 #include <queue>
+#include <string>
+#include <type_traits>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
 
 namespace vk
 {
@@ -730,7 +731,7 @@
 
 	private:
 		const int serialID;
-		static volatile int serialCounter;
+		static std::atomic<int> serialCounter;
 		Modes modes;
 		HandleMap<Type> types;
 		HandleMap<Object> defs;