tint/hlsl+glsl: fix workgroupUniformLoad polyfills

The BuiltinPolyfill transform expects the DirectVariableAccess transform
to run after it, but this regressed as part of
https://dawn-review.googlesource.com/c/dawn/+/122203

Add unit test along with e2e 1926.wgsl test.

Bug: tint:1926
Change-Id: I5107453ce152b12e6f2f36930846e1fffa775708
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/131020
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
Antonio Maiorano
2023-05-03 15:30:54 +00:00
committed by Dawn LUCI CQ
parent e903396ff2
commit fa00fe9d41
63 changed files with 590 additions and 247 deletions

View File

@@ -16,6 +16,7 @@
#include <utility>
#include "src/tint/transform/direct_variable_access.h"
#include "src/tint/transform/test_helper.h"
namespace tint::transform {
@@ -3673,8 +3674,23 @@ fn f() {
DataMap polyfillWorkgroupUniformLoad() {
BuiltinPolyfill::Builtins builtins;
builtins.workgroup_uniform_load = true;
DataMap data;
data.Add<BuiltinPolyfill::Config>(builtins);
return data;
}
DataMap polyfillWorkgroupUniformLoadWithDirectVariableAccess() {
DataMap data;
BuiltinPolyfill::Builtins builtins;
builtins.workgroup_uniform_load = true;
data.Add<BuiltinPolyfill::Config>(builtins);
DirectVariableAccess::Options options;
data.Add<DirectVariableAccess::Config>(options);
return data;
}
@@ -3830,6 +3846,50 @@ fn f() {
EXPECT_EQ(expect, str(got));
}
TEST_F(BuiltinPolyfillTest, WorkgroupUniformLoad_DirectVariableAccess) {
auto* src = R"(
var<workgroup> v : i32;
var<workgroup> v2 : i32;
fn f() {
let r = workgroupUniformLoad(&v);
let s = workgroupUniformLoad(&v2);
}
)";
auto* expect = R"(
enable chromium_experimental_full_ptr_parameters;
fn tint_workgroupUniformLoad_v() -> i32 {
workgroupBarrier();
let result = v;
workgroupBarrier();
return result;
}
fn tint_workgroupUniformLoad_v2() -> i32 {
workgroupBarrier();
let result = v2;
workgroupBarrier();
return result;
}
var<workgroup> v : i32;
var<workgroup> v2 : i32;
fn f() {
let r = tint_workgroupUniformLoad_v();
let s = tint_workgroupUniformLoad_v2();
}
)";
auto got = Run<BuiltinPolyfill, DirectVariableAccess>(
src, polyfillWorkgroupUniformLoadWithDirectVariableAccess());
EXPECT_EQ(expect, str(got));
}
////////////////////////////////////////////////////////////////////////////////
// quantizeToF16
////////////////////////////////////////////////////////////////////////////////

View File

@@ -170,7 +170,6 @@ SanitizedResult Sanitize(const Program* in,
manager.Add<transform::PreservePadding>(); // Must come before DirectVariableAccess
manager.Add<transform::Unshadow>(); // Must come before DirectVariableAccess
manager.Add<transform::DirectVariableAccess>();
manager.Add<transform::PromoteSideEffectsToDecl>();
@@ -203,9 +202,11 @@ SanitizedResult Sanitize(const Program* in,
polyfills.texture_sample_base_clamp_to_edge_2d_f32 = true;
polyfills.workgroup_uniform_load = true;
data.Add<transform::BuiltinPolyfill::Config>(polyfills);
manager.Add<transform::BuiltinPolyfill>();
manager.Add<transform::BuiltinPolyfill>(); // Must come before DirectVariableAccess
}
manager.Add<transform::DirectVariableAccess>();
if (!options.disable_workgroup_init) {
// ZeroInitWorkgroupMemory must come before CanonicalizeEntryPointIO as
// ZeroInitWorkgroupMemory may inject new builtin parameters.

View File

@@ -176,8 +176,6 @@ SanitizedResult Sanitize(const Program* in, const Options& options) {
manager.Add<transform::Unshadow>(); // Must come before DirectVariableAccess
manager.Add<transform::DirectVariableAccess>();
// LocalizeStructArrayAssignment must come after:
// * SimplifyPointers, because it assumes assignment to arrays in structs are
// done directly, not indirectly.
@@ -229,9 +227,11 @@ SanitizedResult Sanitize(const Program* in, const Options& options) {
polyfills.texture_sample_base_clamp_to_edge_2d_f32 = true;
polyfills.workgroup_uniform_load = true;
data.Add<transform::BuiltinPolyfill::Config>(polyfills);
manager.Add<transform::BuiltinPolyfill>();
manager.Add<transform::BuiltinPolyfill>(); // Must come before DirectVariableAccess
}
manager.Add<transform::DirectVariableAccess>();
if (!options.disable_workgroup_init) {
// ZeroInitWorkgroupMemory must come before CanonicalizeEntryPointIO as
// ZeroInitWorkgroupMemory may inject new builtin parameters.

View File

@@ -119,7 +119,7 @@ SanitizedResult Sanitize(const Program* in, const Options& options) {
polyfills.quantize_to_vec_f16 = true; // crbug.com/tint/1741
polyfills.workgroup_uniform_load = true;
data.Add<transform::BuiltinPolyfill::Config>(polyfills);
manager.Add<transform::BuiltinPolyfill>();
manager.Add<transform::BuiltinPolyfill>(); // Must come before DirectVariableAccess
}
bool disable_workgroup_init_in_sanitizer =