export const description = ` Test validation of pushDebugGroup, popDebugGroup, and insertDebugMarker. `; import { AllFeaturesMaxLimitsGPUTest } from '../.././gpu_test.js'; import { makeTestGroup } from '../../../common/framework/test_group.js'; class F extends AllFeaturesMaxLimitsGPUTest { beginRenderPass(commandEncoder: GPUCommandEncoder): GPURenderPassEncoder { const attachmentTexture = this.createTextureTracked({ format: 'rgba8unorm', size: { width: 16, height: 16, depthOrArrayLayers: 1 }, usage: GPUTextureUsage.RENDER_ATTACHMENT, }); return commandEncoder.beginRenderPass({ colorAttachments: [ { view: attachmentTexture.createView(), clearValue: { r: 1.0, g: 0.0, b: 0.0, a: 1.0 }, loadOp: 'clear', storeOp: 'store', }, ], }); } } export const g = makeTestGroup(F); g.test('push_pop_call_count_unbalance,command_encoder') .desc( ` Test that a validation error is generated if {push,pop} debug group call count is not paired. ` ) .paramsSubcasesOnly(u => u // .combine('pushCount', [1, 2, 3]) .combine('popCount', [1, 2, 3]) ) .fn(t => { const { pushCount, popCount } = t.params; const encoder = t.device.createCommandEncoder(); for (let i = 0; i < pushCount; ++i) { encoder.pushDebugGroup('EventStart'); } encoder.insertDebugMarker('Marker'); for (let i = 0; i < popCount; ++i) { encoder.popDebugGroup(); } t.expectValidationError(() => { encoder.finish(); }, pushCount !== popCount); }); g.test('push_pop_call_count_unbalance,render_compute_pass') .desc( ` Test that a validation error is generated if {push,pop} debug group call count is not paired in ComputePassEncoder and RenderPassEncoder. ` ) .params(u => u // .combine('passType', ['compute', 'render']) .beginSubcases() .combine('pushCount', [1, 2, 3]) .combine('popCount', [1, 2, 3]) ) .fn(t => { const { passType, pushCount, popCount } = t.params; const encoder = t.device.createCommandEncoder(); const pass = passType === 'compute' ? encoder.beginComputePass() : t.beginRenderPass(encoder); for (let i = 0; i < pushCount; ++i) { pass.pushDebugGroup('EventStart'); } pass.insertDebugMarker('Marker'); for (let i = 0; i < popCount; ++i) { pass.popDebugGroup(); } t.expectValidationError(() => { pass.end(); encoder.finish(); }, pushCount !== popCount); });