Rolling 5 dependencies and fix test slow down

Roll third_party/SPIRV-Tools/ 2e1d208ed..c8590c18b (2 commits)

https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools/+log/2e1d208ed9de..c8590c18bd0c

$ git log 2e1d208ed..c8590c18b --date=short --no-merges --format='%ad %ae %s'
2020-05-06 jaebaek Preserve debug info for wrap-opkill (#3331)
2020-05-05 jbolz Validate ShaderCallKHR memory scope (#3332)

Roll third_party/glslang/ b5f003d7a..4fa68edd6 (3 commits)

https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang/+log/b5f003d7a3ec..4fa68edd6819

$ git log b5f003d7a..4fa68edd6 --date=short --no-merges --format='%ad %ae %s'
2020-05-12 cepheus Address #2211: Improve the copy constructor of TVarLivePair.
2020-05-11 xilefmai Fix Web build
2020-05-08 sebastian.neubauer Explicitly mark some enums as unsigned

Roll third_party/shaderc/ 15a66d72f..00ac5d821 (4 commits)

https://chromium.googlesource.com/external/github.com/google/shaderc/+log/15a66d72f33a..00ac5d82178c

$ git log 15a66d72f..00ac5d821 --date=short --no-merges --format='%ad %ae %s'
2020-05-11 rharrison Rolling 4 dependencies (#1062)
2020-05-11 chinmaygarde Only add -fPIC if supported by the compiler. (#1061)
2020-05-06 rharrison Remove Singleton pattern around access to glslang (#1059)
2020-05-05 rharrison Add .NET bindings to README.md (#1060)

Roll third_party/spirv-cross/ 92f7d36c7..d638d2df9 (4 commits)

https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross/+log/92f7d36c72bc..d638d2df9c8c

$ git log 92f7d36c7..d638d2df9 --date=short --no-merges --format='%ad %ae %s'
2020-05-08 post Support gl_InstanceID in RT shaders.
2020-05-06 post MSL: Avoid packed arrays in more cases.
2020-05-06 post Add missing reference files from PR merge.
2020-05-06 lehoangq Fix #1359: MSL: If the packed type is scalar, don't emit "pack_" prefix.

Roll third_party/tint/ 1f1f08f94..0bbf1e746 (6 commits)

https://dawn.googlesource.com/tint/+log/1f1f08f94a11..0bbf1e746093

$ git log 1f1f08f94..0bbf1e746 --date=short --no-merges --format='%ad %ae %s'
2020-05-11 rharrison Small fix for BUILD.gn
2020-05-08 dneto Rolling 6 dependencies
2020-05-07 dneto [spirv-reader] Find if-selection internal headers
2020-05-07 dneto [spirv-reader] Rename Edge::kToMerge to kIfBreak
2020-05-07 dneto [spirv-reader] Classify kSwitchBreak from deep in control flow
2020-05-07 dsinclair Rename brace and bracket to match spec

Created with:
  roll-dep third_party/SPIRV-Tools third_party/glslang third_party/shaderc third_party/spirv-cross third_party/spirv-headers third_party/tint

Change-Id: I8d9ca3e29b4fa8907147fffacb3905acd48a9c0b
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21603
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
diff --git a/DEPS b/DEPS
index fe70570..8df73e1 100644
--- a/DEPS
+++ b/DEPS
@@ -61,13 +61,13 @@
 
   # SPIRV-Cross
   'third_party/spirv-cross': {
-    'url': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@92f7d36c72bc3cdbcc4aeff3534d096866013c0c',
+    'url': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@d638d2df9c8c4a862e0af829cf49cc6dcbb235a2',
     'condition': 'dawn_standalone',
   },
 
   # SPIRV compiler dependencies: SPIRV-Tools, SPIRV-headers, glslang and shaderc
   'third_party/SPIRV-Tools': {
-    'url': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@2e1d208ed9deab9048a00e60bb891d5e12a8332e',
+    'url': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@c8590c18bd0c70dcd1caa7d43c5f2d020439b012',
     'condition': 'dawn_standalone',
   },
   'third_party/spirv-headers': {
@@ -75,17 +75,17 @@
     'condition': 'dawn_standalone',
   },
   'third_party/glslang': {
-    'url': '{chromium_git}/external/github.com/KhronosGroup/glslang@b5f003d7a3ece37db45578a8a3140b370036fc64',
+    'url': '{chromium_git}/external/github.com/KhronosGroup/glslang@4fa68edd68197a8c77779942b5d973f89c621752',
     'condition': 'dawn_standalone',
   },
   'third_party/shaderc': {
-    'url': '{chromium_git}/external/github.com/google/shaderc@15a66d72f33a099ec65e0fd37cf14548ed1d2bdb',
+    'url': '{chromium_git}/external/github.com/google/shaderc@00ac5d82178cfb5679fe19194d5794fdb01cdd00',
     'condition': 'dawn_standalone',
   },
 
   # WGSL support
   'third_party/tint': {
-    'url': '{dawn_git}/tint@1f1f08f94a11f470a4551896df9f610b71876924',
+    'url': '{dawn_git}/tint@0bbf1e7460936422db9207a73cf987d510a8ae15',
     'condition': 'dawn_standalone',
   },
 
diff --git a/src/utils/WGPUHelpers.cpp b/src/utils/WGPUHelpers.cpp
index ef8d977..0d9b1f9 100644
--- a/src/utils/WGPUHelpers.cpp
+++ b/src/utils/WGPUHelpers.cpp
@@ -61,6 +61,30 @@
             return device.CreateShaderModule(&descriptor);
         }
 
+        class CompilerSingleton {
+          public:
+            static shaderc::Compiler* Get() {
+                std::call_once(mInitFlag, &CompilerSingleton::Initialize);
+                return mCompiler;
+            }
+
+          private:
+            CompilerSingleton() = default;
+            ~CompilerSingleton() = default;
+            CompilerSingleton(const CompilerSingleton&) = delete;
+            CompilerSingleton& operator=(const CompilerSingleton&) = delete;
+
+            static shaderc::Compiler* mCompiler;
+            static std::once_flag mInitFlag;
+
+            static void Initialize() {
+                mCompiler = new shaderc::Compiler();
+            }
+        };
+
+        shaderc::Compiler* CompilerSingleton::mCompiler = nullptr;
+        std::once_flag CompilerSingleton::mInitFlag;
+
     }  // anonymous namespace
 
     wgpu::ShaderModule CreateShaderModule(const wgpu::Device& device,
@@ -68,8 +92,8 @@
                                           const char* source) {
         shaderc_shader_kind kind = ShadercShaderKind(stage);
 
-        shaderc::Compiler compiler;
-        auto result = compiler.CompileGlslToSpv(source, strlen(source), kind, "myshader?");
+        shaderc::Compiler* compiler = CompilerSingleton::Get();
+        auto result = compiler->CompileGlslToSpv(source, strlen(source), kind, "myshader?");
         if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
             dawn::ErrorLog() << result.GetErrorMessage();
             return {};
@@ -77,8 +101,8 @@
 #ifdef DUMP_SPIRV_ASSEMBLY
         {
             shaderc::CompileOptions options;
-            auto resultAsm = compiler.CompileGlslToSpvAssembly(source, strlen(source), kind,
-                                                               "myshader?", options);
+            auto resultAsm = compiler->CompileGlslToSpvAssembly(source, strlen(source), kind,
+                                                                "myshader?", options);
             size_t sizeAsm = (resultAsm.cend() - resultAsm.cbegin());
 
             char* buffer = reinterpret_cast<char*>(malloc(sizeAsm + 1));
@@ -107,8 +131,8 @@
     }
 
     wgpu::ShaderModule CreateShaderModuleFromASM(const wgpu::Device& device, const char* source) {
-        shaderc::Compiler compiler;
-        shaderc::SpvCompilationResult result = compiler.AssembleToSpv(source, strlen(source));
+        shaderc::Compiler* compiler = CompilerSingleton::Get();
+        shaderc::SpvCompilationResult result = compiler->AssembleToSpv(source, strlen(source));
         if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
             dawn::ErrorLog() << result.GetErrorMessage();
             return {};
@@ -120,8 +144,8 @@
     std::vector<uint32_t> CompileGLSLToSpirv(SingleShaderStage stage, const char* source) {
         shaderc_shader_kind kind = ShadercShaderKind(stage);
 
-        shaderc::Compiler compiler;
-        auto result = compiler.CompileGlslToSpv(source, strlen(source), kind, "myshader?");
+        shaderc::Compiler* compiler = CompilerSingleton::Get();
+        auto result = compiler->CompileGlslToSpv(source, strlen(source), kind, "myshader?");
         if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
             dawn::ErrorLog() << result.GetErrorMessage();
             return {};