dawn_native/vulkan: Use EmitVertexPointSize transform

Fixes validation errors when drawing with point topologies, and without explicitly writing to the PointSize builtin.

Fixed: tint:321
Change-Id: I3c00c5ee56966a82d9e3024cb277eae8921a9af2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/35800
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/ShaderModule.cpp b/src/dawn_native/ShaderModule.cpp
index df68e3c..909ecbb 100644
--- a/src/dawn_native/ShaderModule.cpp
+++ b/src/dawn_native/ShaderModule.cpp
@@ -837,12 +837,28 @@
                 } else {
                     tint::ast::Module module;
                     DAWN_TRY_ASSIGN(module, ParseWGSL(wgslDesc->source));
+
+                    {
+                        tint::transform::Manager transformManager;
+                        transformManager.append(
+                            std::make_unique<tint::transform::EmitVertexPointSize>());
+                        DAWN_TRY_ASSIGN(module, RunTransforms(&transformManager, &module));
+                    }
+
                     if (device->IsValidationEnabled()) {
                         DAWN_TRY(ValidateModule(&module));
                     }
+
+                    // Keep the Tint module around. The Metal backend will use it for vertex
+                    // pulling since we can't go WGSL->point size transform->spirv->Tint.
+                    // Tint's spirv reader doesn't understand point size. crbug.com/tint/412.
+                    auto tintModule = std::make_unique<tint::ast::Module>(module.Clone());
+
                     std::vector<uint32_t> spirv;
                     DAWN_TRY_ASSIGN(spirv, ModuleToSPIRV(std::move(module)));
                     DAWN_TRY(ValidateSpirv(spirv.data(), spirv.size()));
+
+                    parseResult.tintModule = std::move(tintModule);
                     parseResult.spirv = std::move(spirv);
                 }
                 break;
@@ -1026,6 +1042,7 @@
         tint::transform::Manager transformManager;
         transformManager.append(
             MakeVertexPullingTransform(vertexState, entryPoint, pullingBufferBindingSet));
+        transformManager.append(std::make_unique<tint::transform::EmitVertexPointSize>());
         if (GetDevice()->IsRobustnessEnabled()) {
             // TODO(enga): Run the Tint BoundArrayAccessors transform instead of the SPIRV Tools
             // one, but it appears to crash after running VertexPulling.
diff --git a/src/dawn_native/metal/ShaderModuleMTL.mm b/src/dawn_native/metal/ShaderModuleMTL.mm
index 74787fc..b0958ec 100644
--- a/src/dawn_native/metal/ShaderModuleMTL.mm
+++ b/src/dawn_native/metal/ShaderModuleMTL.mm
@@ -123,7 +123,7 @@
         std::vector<uint32_t> pullingSpirv;
         if (GetDevice()->IsToggleEnabled(Toggle::MetalEnableVertexPulling) &&
             stage == SingleShaderStage::Vertex) {
-            if (GetDevice()->IsToggleEnabled(Toggle::UseTintGenerator)) {
+            if (mTintModule) {
                 DAWN_TRY_ASSIGN(pullingSpirv,
                                 GeneratePullingSpirv(mTintModule.get(),
                                                      *renderPipeline->GetVertexStateDescriptor(),
diff --git a/src/dawn_native/opengl/ShaderModuleGL.cpp b/src/dawn_native/opengl/ShaderModuleGL.cpp
index b3bcfb2..ab8ae71 100644
--- a/src/dawn_native/opengl/ShaderModuleGL.cpp
+++ b/src/dawn_native/opengl/ShaderModuleGL.cpp
@@ -89,6 +89,7 @@
 
             tint::transform::Manager transformManager;
             transformManager.append(std::make_unique<tint::transform::BoundArrayAccessors>());
+            transformManager.append(std::make_unique<tint::transform::EmitVertexPointSize>());
 
             DAWN_TRY_ASSIGN(module, RunTransforms(&transformManager, &module));
 
diff --git a/src/dawn_native/vulkan/ShaderModuleVk.cpp b/src/dawn_native/vulkan/ShaderModuleVk.cpp
index 28aa115..b0edeb6 100644
--- a/src/dawn_native/vulkan/ShaderModuleVk.cpp
+++ b/src/dawn_native/vulkan/ShaderModuleVk.cpp
@@ -60,6 +60,7 @@
 
             tint::transform::Manager transformManager;
             transformManager.append(std::make_unique<tint::transform::BoundArrayAccessors>());
+            transformManager.append(std::make_unique<tint::transform::EmitVertexPointSize>());
 
             DAWN_TRY_ASSIGN(module, RunTransforms(&transformManager, &module));