[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;