Switch to worklist lambdas in spirv texture lowering.

In the `spirv/reader/lower/texture.cc` update to use a worklist of
lambdas instead of switching over the builtin type multiple times.

Change-Id: Iacdce86a998f57d9dc8247577f1c3a23c0b25546
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/310956
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/reader/lower/texture.cc b/src/tint/lang/spirv/reader/lower/texture.cc
index 45518d7..27a42a4 100644
--- a/src/tint/lang/spirv/reader/lower/texture.cc
+++ b/src/tint/lang/spirv/reader/lower/texture.cc
@@ -29,6 +29,7 @@
 
 #include <tuple>
 #include <utility>
+#include <vector>
 
 #include "src/tint/lang/core/ir/builder.h"
 #include "src/tint/lang/core/ir/clone_context.h"
@@ -125,7 +126,8 @@
             });
         }
 
-        Vector<spirv::ir::BuiltinCall*, 4> depth_worklist;
+        std::vector<std::function<void()>> worklist;
+        worklist.reserve(128);
         for (auto* inst : ir.Instructions()) {
             if (auto* builtin = inst->As<spirv::ir::BuiltinCall>()) {
                 switch (builtin->Func()) {
@@ -133,11 +135,15 @@
                         SampledImage(builtin);
                         break;
                     case spirv::BuiltinFn::kImageDrefGather:
+                        worklist.push_back(
+                            [this, builtin] { FindVarsForImageGatherDref(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageSampleDrefImplicitLod:
                     case spirv::BuiltinFn::kImageSampleDrefExplicitLod:
                     case spirv::BuiltinFn::kImageSampleProjDrefImplicitLod:
                     case spirv::BuiltinFn::kImageSampleProjDrefExplicitLod:
-                        depth_worklist.Push(builtin);
+                        worklist.push_back(
+                            [this, builtin] { FindVarsForImageSampleDref(builtin); });
                         break;
                     default:
                         break;
@@ -148,21 +154,10 @@
         // For each depth function, find the parameters which needed be converted. We don't convert
         // the actual calls yet, as we may need to parameters to have propagated through function
         // parameters.
-        for (auto* builtin : depth_worklist) {
-            switch (builtin->Func()) {
-                case spirv::BuiltinFn::kImageSampleDrefImplicitLod:
-                case spirv::BuiltinFn::kImageSampleDrefExplicitLod:
-                case spirv::BuiltinFn::kImageSampleProjDrefImplicitLod:
-                case spirv::BuiltinFn::kImageSampleProjDrefExplicitLod:
-                    FindVarsForImageSampleDref(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageDrefGather:
-                    FindVarsForImageGatherDref(builtin);
-                    break;
-                default:
-                    TINT_UNREACHABLE();
-            }
+        for (auto& cb : worklist) {
+            cb();
         }
+        worklist.clear();
 
         Hashset<core::ir::Value*, 4> converted{};
         while (!textures_to_convert_to_depth_.IsEmpty()) {
@@ -213,74 +208,54 @@
                         SampledImage(builtin);
                         break;
                     case spirv::BuiltinFn::kOpImage:
+                        worklist.push_back([this, builtin] { Image(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageRead:
                     case spirv::BuiltinFn::kImageFetch:
+                        worklist.push_back([this, builtin] { ImageFetch(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageGather:
+                        worklist.push_back([this, builtin] { ImageGather(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageQueryLevels:
+                        worklist.push_back([this, builtin] {
+                            ImageQuery(builtin, core::BuiltinFn::kTextureNumLevels);
+                        });
+                        break;
                     case spirv::BuiltinFn::kImageQuerySamples:
+                        worklist.push_back([this, builtin] {
+                            ImageQuery(builtin, core::BuiltinFn::kTextureNumSamples);
+                        });
+                        break;
                     case spirv::BuiltinFn::kImageQuerySize:
                     case spirv::BuiltinFn::kImageQuerySizeLod:
+                        worklist.push_back([this, builtin] { ImageQuerySize(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageSampleExplicitLod:
                     case spirv::BuiltinFn::kImageSampleImplicitLod:
                     case spirv::BuiltinFn::kImageSampleProjImplicitLod:
                     case spirv::BuiltinFn::kImageSampleProjExplicitLod:
+                        worklist.push_back([this, builtin] { ImageSample(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageWrite:
+                        worklist.push_back([this, builtin] { ImageWrite(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageSampleDrefImplicitLod:
                     case spirv::BuiltinFn::kImageSampleDrefExplicitLod:
                     case spirv::BuiltinFn::kImageSampleProjDrefImplicitLod:
                     case spirv::BuiltinFn::kImageSampleProjDrefExplicitLod:
+                        worklist.push_back([this, builtin] { ImageSampleDref(builtin); });
+                        break;
                     case spirv::BuiltinFn::kImageDrefGather:
-                        builtin_worklist.Push(builtin);
+                        worklist.push_back([this, builtin] { ImageGatherDref(builtin); });
                         break;
                     default:
                         TINT_UNREACHABLE() << "unknown spirv builtin: " << builtin->Func();
                 }
             }
         }
-
-        for (auto* builtin : builtin_worklist) {
-            switch (builtin->Func()) {
-                case spirv::BuiltinFn::kOpImage:
-                    Image(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageRead:
-                case spirv::BuiltinFn::kImageFetch:
-                    ImageFetch(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageGather:
-                    ImageGather(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageQueryLevels:
-                    ImageQuery(builtin, core::BuiltinFn::kTextureNumLevels);
-                    break;
-                case spirv::BuiltinFn::kImageQuerySamples:
-                    ImageQuery(builtin, core::BuiltinFn::kTextureNumSamples);
-                    break;
-                case spirv::BuiltinFn::kImageQuerySize:
-                case spirv::BuiltinFn::kImageQuerySizeLod:
-                    ImageQuerySize(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageSampleExplicitLod:
-                case spirv::BuiltinFn::kImageSampleImplicitLod:
-                case spirv::BuiltinFn::kImageSampleProjImplicitLod:
-                case spirv::BuiltinFn::kImageSampleProjExplicitLod:
-                    ImageSample(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageWrite:
-                    ImageWrite(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageSampleDrefImplicitLod:
-                case spirv::BuiltinFn::kImageSampleDrefExplicitLod:
-                case spirv::BuiltinFn::kImageSampleProjDrefImplicitLod:
-                case spirv::BuiltinFn::kImageSampleProjDrefExplicitLod:
-                    ImageSampleDref(builtin);
-                    break;
-                case spirv::BuiltinFn::kImageDrefGather:
-                    ImageGatherDref(builtin);
-                    break;
-                default:
-                    TINT_UNREACHABLE();
-            }
+        for (auto& cb : worklist) {
+            cb();
         }
 
         // Destroy all the OpSampledImage instructions.