diff options
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.ts')
-rw-r--r-- | dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.ts | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.ts new file mode 100644 index 0000000000..6536ec9d01 --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/render_pipeline/fragment_state.spec.ts @@ -0,0 +1,128 @@ +export const description = ` +Tests that you can not create a render pipeline with different per target blend state or write mask in compat mode. +`; + +import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../../common/util/data_tables.js'; +import { CompatibilityTest } from '../../../compatibility_test.js'; + +export const g = makeTestGroup(CompatibilityTest); + +type ThreeColorTargets = [GPUColorTargetState, GPUColorTargetState | null, GPUColorTargetState]; + +const cases = { + default(_targets: ThreeColorTargets) { + return true; + }, + noBlendTarget0(targets: ThreeColorTargets) { + delete targets[0].blend; + return false; + }, + noBlendTarget1(targets: ThreeColorTargets) { + delete targets[2].blend; + return false; + }, + colorOperation(targets: ThreeColorTargets) { + targets[2].blend!.color.operation = 'subtract'; + return false; + }, + colorSrcFactor(targets: ThreeColorTargets) { + targets[2].blend!.color.srcFactor = 'src-alpha'; + return false; + }, + colorDstFactor(targets: ThreeColorTargets) { + targets[2].blend!.color.dstFactor = 'dst-alpha'; + return false; + }, + alphaOperation(targets: ThreeColorTargets) { + targets[2].blend!.alpha.operation = 'subtract'; + return false; + }, + alphaSrcFactor(targets: ThreeColorTargets) { + targets[2].blend!.alpha.srcFactor = 'src-alpha'; + return false; + }, + alphaDstFactor(targets: ThreeColorTargets) { + targets[2].blend!.alpha.dstFactor = 'dst-alpha'; + return false; + }, + writeMask(targets: ThreeColorTargets) { + targets[2].writeMask = GPUColorWrite.GREEN; + return false; + }, +}; +const caseNames = keysOf(cases); + +g.test('colorState') + .desc( + ` +Tests that you can not create a render pipeline with different per target blend state or write mask in compat mode. + +- Test no blend state vs some blend state +- Test different operation, srcFactor, dstFactor for color and alpha +- Test different writeMask + ` + ) + .params(u => u.combine('caseName', caseNames)) + .fn(t => { + const { caseName } = t.params; + + const module = t.device.createShaderModule({ + code: ` + @vertex fn vs() -> @builtin(position) vec4f { + return vec4f(0); + } + + struct FragmentOut { + @location(0) fragColor0 : vec4f, + @location(1) fragColor1 : vec4f, + @location(2) fragColor2 : vec4f, + } + + @fragment fn fs() -> FragmentOut { + var output : FragmentOut; + output.fragColor0 = vec4f(0); + output.fragColor1 = vec4f(0); + output.fragColor2 = vec4f(0); + return output; + } + `, + }); + + const targets: ThreeColorTargets = [ + { + format: 'rgba8unorm', + blend: { + color: {}, + alpha: {}, + }, + }, + null, + { + format: 'rgba8unorm', + blend: { + color: {}, + alpha: {}, + }, + }, + ]; + + const pipelineDescriptor: GPURenderPipelineDescriptor = { + layout: 'auto', + vertex: { + module, + entryPoint: 'vs', + }, + fragment: { + module, + entryPoint: 'fs', + targets, + }, + }; + const isValid = cases[caseName](targets); + t.expectGPUError( + 'validation', + () => t.device.createRenderPipeline(pipelineDescriptor), + !isValid + ); + }); |