[ir] Enable fuzzing of push_constant and pixel_local

Add preconditions to backend fuzzers that cannot support them, and
make sure we enable the corresponding WGSL extensions when we convert
from IR to AST.

Change-Id: I2f32aa692cb987710f53fda825b29ec191d0eaf0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/213895
Commit-Queue: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/glsl/writer/writer_fuzz.cc b/src/tint/lang/glsl/writer/writer_fuzz.cc
index bc27f5d..64ba65a 100644
--- a/src/tint/lang/glsl/writer/writer_fuzz.cc
+++ b/src/tint/lang/glsl/writer/writer_fuzz.cc
@@ -116,6 +116,11 @@
         }
         auto* ptr = var->Result(0)->Type()->As<core::type::Pointer>();
 
+        // The pixel_local extension is not supported by the GLSL backend.
+        if (ptr->AddressSpace() == core::AddressSpace::kPixelLocal) {
+            return false;
+        }
+
         if (ptr->StoreType()->Is<core::type::Texture>()) {
             bool found = false;
             auto binding_point = var->BindingPoint();
diff --git a/src/tint/lang/msl/writer/writer_fuzz.cc b/src/tint/lang/msl/writer/writer_fuzz.cc
index 332e364..31a0b44 100644
--- a/src/tint/lang/msl/writer/writer_fuzz.cc
+++ b/src/tint/lang/msl/writer/writer_fuzz.cc
@@ -37,13 +37,16 @@
 namespace {
 
 bool CanRun(const core::ir::Module& module) {
-    // Check for push constants and input attachments, which the MSL writer does not support.
+    // Check for unsupported module-scope variable address spaces and types.
     for (auto* inst : *module.root_block) {
         auto* var = inst->As<core::ir::Var>();
         auto* ptr = var->Result(0)->Type()->As<core::type::Pointer>();
         if (ptr->AddressSpace() == core::AddressSpace::kPushConstant) {
             return false;
         }
+        if (ptr->AddressSpace() == core::AddressSpace::kPixelLocal) {
+            return false;
+        }
         if (ptr->StoreType()->Is<core::type::InputAttachment>()) {
             return false;
         }
diff --git a/src/tint/lang/spirv/writer/writer_fuzz.cc b/src/tint/lang/spirv/writer/writer_fuzz.cc
index e5ace56..29a2f6d 100644
--- a/src/tint/lang/spirv/writer/writer_fuzz.cc
+++ b/src/tint/lang/spirv/writer/writer_fuzz.cc
@@ -29,13 +29,31 @@
 
 #include "src/tint/cmd/fuzz/ir/fuzz.h"
 #include "src/tint/lang/core/ir/disassembler.h"
+#include "src/tint/lang/core/ir/var.h"
+#include "src/tint/lang/core/type/pointer.h"
 #include "src/tint/lang/spirv/validate/validate.h"
 #include "src/tint/lang/spirv/writer/helpers/generate_bindings.h"
 
 namespace tint::spirv::writer {
 namespace {
 
+bool CanRun(const core::ir::Module& module) {
+    // Check for unsupported module-scope variable address spaces and types.
+    for (auto* inst : *module.root_block) {
+        auto* var = inst->As<core::ir::Var>();
+        auto* ptr = var->Result(0)->Type()->As<core::type::Pointer>();
+        if (ptr->AddressSpace() == core::AddressSpace::kPixelLocal) {
+            return false;
+        }
+    }
+    return true;
+}
+
 void IRFuzzer(core::ir::Module& module, Options options) {
+    if (!CanRun(module)) {
+        return;
+    }
+
     options.bindings = GenerateBindings(module);
     auto output = Generate(module, options);
     if (output != Success) {
diff --git a/src/tint/lang/wgsl/reader/reader.cc b/src/tint/lang/wgsl/reader/reader.cc
index 4cbaaf6..e9792ae 100644
--- a/src/tint/lang/wgsl/reader/reader.cc
+++ b/src/tint/lang/wgsl/reader/reader.cc
@@ -72,8 +72,6 @@
     for (auto ext : enable->extensions) {
         switch (ext->name) {
             case tint::wgsl::Extension::kChromiumExperimentalFramebufferFetch:
-            case tint::wgsl::Extension::kChromiumExperimentalPixelLocal:
-            case tint::wgsl::Extension::kChromiumExperimentalPushConstant:
             case tint::wgsl::Extension::kChromiumInternalRelaxedUniformLayout:
                 return true;
             default:
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index acea907..05a4711 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -595,6 +595,14 @@
             case core::AddressSpace::kHandle:
                 b.GlobalVar(name, ty, init, std::move(attrs));
                 return;
+            case core::AddressSpace::kPixelLocal:
+                Enable(wgsl::Extension::kChromiumExperimentalPixelLocal);
+                b.GlobalVar(name, ty, init, ref->AddressSpace(), std::move(attrs));
+                return;
+            case core::AddressSpace::kPushConstant:
+                Enable(wgsl::Extension::kChromiumExperimentalPushConstant);
+                b.GlobalVar(name, ty, init, ref->AddressSpace(), std::move(attrs));
+                return;
             default:
                 b.GlobalVar(name, ty, init, ref->AddressSpace(), std::move(attrs));
                 return;