summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts260
1 files changed, 260 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts
index 154a4253ea..701ae46f3a 100644
--- a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts
+++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/diagnostic.spec.ts
@@ -199,3 +199,263 @@ g.test('conflicting_attribute_different_location')
const code = `${kNestedLocations[t.params.loc](d1, d2)}`;
t.expectCompileResult(true, code);
});
+
+g.test('after_other_directives')
+ .specURL('https://gpuweb.github.io/gpuweb/wgsl/#diagnostics')
+ .desc(`Tests other global directives before a diagnostic directive.`)
+ .params(u =>
+ u.combine('directive', ['enable f16', 'requires readonly_and_readwrite_storage_textures'])
+ )
+ .beforeAllSubcases(t => {
+ if (t.params.directive.startsWith('enable')) {
+ t.selectDeviceOrSkipTestCase('shader-f16');
+ }
+ })
+ .fn(t => {
+ if (t.params.directive.startsWith('requires')) {
+ t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures');
+ }
+
+ let code = `${t.params.directive};`;
+ code += generateDiagnostic('directive', 'info', 'derivative_uniformity') + ';';
+ t.expectCompileResult(true, code);
+ });
+
+interface ScopeCase {
+ code: string;
+ result: boolean | 'warn';
+}
+
+function scopeCode(body: string): string {
+ return `
+@group(0) @binding(0) var t : texture_1d<f32>;
+@group(0) @binding(1) var s : sampler;
+var<private> non_uniform_cond : bool;
+var<private> non_uniform_coord : f32;
+var<private> non_uniform_val : u32;
+@fragment fn main() {
+ ${body}
+}
+`;
+}
+
+const kScopeCases: Record<string, ScopeCase> = {
+ override_global_off: {
+ code: `
+ ${generateDiagnostic('directive', 'error', 'derivative_uniformity')};
+ ${scopeCode(`
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }`)};
+ `,
+ result: true,
+ },
+ override_global_on: {
+ code: `
+ ${generateDiagnostic('directive', 'off', 'derivative_uniformity')};
+ ${scopeCode(`
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }`)}
+ `,
+ result: false,
+ },
+ override_global_warn: {
+ code: `
+ ${generateDiagnostic('directive', 'error', 'derivative_uniformity')};
+ ${scopeCode(`
+ ${generateDiagnostic('', 'warning', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }`)}
+ `,
+ result: 'warn',
+ },
+ global_if_nothing_else_warn: {
+ code: `
+ ${generateDiagnostic('directive', 'warning', 'derivative_uniformity')};
+ ${scopeCode(`
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }`)}
+ `,
+ result: 'warn',
+ },
+ deepest_nesting_warn: {
+ code: scopeCode(`
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ if non_uniform_cond {
+ ${generateDiagnostic('', 'warning', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }
+ }`),
+ result: 'warn',
+ },
+ deepest_nesting_off: {
+ code: scopeCode(`
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ if non_uniform_cond {
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }
+ }`),
+ result: true,
+ },
+ deepest_nesting_error: {
+ code: scopeCode(`
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }
+ }`),
+ result: false,
+ },
+ other_nest_unaffected: {
+ code: `
+ ${generateDiagnostic('directive', 'warning', 'derivative_uniformity')};
+ ${scopeCode(`
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }
+ if non_uniform_cond {
+ _ = textureSample(t,s,0.0);
+ }`)}
+ `,
+ result: 'warn',
+ },
+ deeper_nest_no_effect: {
+ code: `
+ ${generateDiagnostic('directive', 'error', 'derivative_uniformity')};
+ ${scopeCode(`
+ if non_uniform_cond {
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ }
+ _ = textureSample(t,s,0.0);
+ }`)}
+ `,
+ result: false,
+ },
+ call_unaffected_error: {
+ code: `
+ ${generateDiagnostic('directive', 'error', 'derivative_uniformity')};
+ fn foo() { _ = textureSample(t,s,0.0); }
+ ${scopeCode(`
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ foo();
+ }`)}
+ `,
+ result: false,
+ },
+ call_unaffected_warn: {
+ code: `
+ ${generateDiagnostic('directive', 'warning', 'derivative_uniformity')};
+ fn foo() { _ = textureSample(t,s,0.0); }
+ ${scopeCode(`
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if non_uniform_cond {
+ foo();
+ }`)}
+ `,
+ result: 'warn',
+ },
+ call_unaffected_off: {
+ code: `
+ ${generateDiagnostic('directive', 'off', 'derivative_uniformity')};
+ fn foo() { _ = textureSample(t,s,0.0); }
+ ${scopeCode(`
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ if non_uniform_cond {
+ foo();
+ }`)}
+ `,
+ result: true,
+ },
+ if_condition_error: {
+ code: scopeCode(`
+ if (non_uniform_cond) {
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ if textureSample(t,s,non_uniform_coord).x > 0.0
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')} {
+ }
+ }`),
+ result: false,
+ },
+ if_condition_warn: {
+ code: scopeCode(`
+ if non_uniform_cond {
+ ${generateDiagnostic('', 'warning', 'derivative_uniformity')}
+ if textureSample(t,s,non_uniform_coord).x > 0.0
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')} {
+ }
+ }`),
+ result: 'warn',
+ },
+ if_condition_off: {
+ code: scopeCode(`
+ if non_uniform_cond {
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ if textureSample(t,s,non_uniform_coord).x > 0.0
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')} {
+ }
+ }`),
+ result: true,
+ },
+ switch_error: {
+ code: scopeCode(`
+ ${generateDiagnostic('', 'error', 'derivative_uniformity')}
+ switch non_uniform_val {
+ case 0 ${generateDiagnostic('', 'off', 'derivative_uniformity')} {
+ }
+ default {
+ _ = textureSample(t,s,0.0);
+ }
+ }`),
+ result: false,
+ },
+ switch_warn: {
+ code: scopeCode(`
+ ${generateDiagnostic('', 'warning', 'derivative_uniformity')}
+ switch non_uniform_val {
+ case 0 ${generateDiagnostic('', 'off', 'derivative_uniformity')} {
+ }
+ default {
+ _ = textureSample(t,s,0.0);
+ }
+ }`),
+ result: 'warn',
+ },
+ switch_off: {
+ code: scopeCode(`
+ ${generateDiagnostic('', 'off', 'derivative_uniformity')}
+ switch non_uniform_val {
+ case 0 ${generateDiagnostic('', 'error', 'derivative_uniformity')}{
+ }
+ default {
+ _ = textureSample(t,s,0.0);
+ }
+ }`),
+ result: true,
+ },
+};
+
+g.test('diagnostic_scoping')
+ .specURL('https://gpuweb.github.io/gpuweb/wgsl/#diagnostics')
+ .desc('Tests that innermost scope controls the diagnostic')
+ .params(u => u.combine('case', keysOf(kScopeCases)))
+ .fn(t => {
+ const testcase = kScopeCases[t.params.case];
+ if (testcase.result === 'warn') {
+ t.expectCompileWarning(true, testcase.code);
+ } else {
+ t.expectCompileResult(testcase.result as boolean, testcase.code);
+ }
+ });