export const description = ` Tests that you can not use bgra8unorm-srgb in compat mode. Tests that textureBindingViewDimension must compatible with texture dimension `; import { makeTestGroup } from '../../../../../common/framework/test_group.js'; import { kTextureDimensions, kTextureViewDimensions } from '../../../../capability_info.js'; import { kCompatModeUnsupportedStorageTextureFormats, kDifferentBaseFormatTextureFormats, getBlockInfoForTextureFormat, getBaseFormatForTextureFormat, } from '../../../../format_info.js'; import { getTextureDimensionFromView } from '../../../../util/texture/base.js'; import { CompatibilityTest } from '../../../compatibility_test.js'; export const g = makeTestGroup(CompatibilityTest); g.test('unsupportedTextureFormats') .desc(`Tests that you can not create a bgra8unorm-srgb texture in compat mode.`) .fn(t => { t.expectGPUErrorInCompatibilityMode( 'validation', () => t.createTextureTracked({ size: [1, 1, 1], format: 'bgra8unorm-srgb', usage: GPUTextureUsage.TEXTURE_BINDING, }), true ); }); g.test('unsupportedTextureViewFormats') .desc( `Tests that you can not create a bgra8unorm texture with a bgra8unorm-srgb viewFormat in compat mode.` ) .fn(t => { t.expectGPUErrorInCompatibilityMode( 'validation', () => t.createTextureTracked({ size: [1, 1, 1], format: 'bgra8unorm', viewFormats: ['bgra8unorm-srgb'], usage: GPUTextureUsage.TEXTURE_BINDING, }), true ); }); g.test('invalidTextureBindingViewDimension') .desc( `Tests that you can not specify a textureBindingViewDimension that is incompatible with the texture's dimension.` ) .params(u => u // .combine('dimension', kTextureDimensions) .combine('textureBindingViewDimension', kTextureViewDimensions) ) .fn(t => { const { dimension, textureBindingViewDimension } = t.params; const depthOrArrayLayers = dimension === '1d' || textureBindingViewDimension === '1d' || textureBindingViewDimension === '2d' ? 1 : 6; const shouldError = getTextureDimensionFromView(textureBindingViewDimension) !== dimension || textureBindingViewDimension === 'cube-array'; t.expectGPUErrorInCompatibilityMode( 'validation', () => { t.createTextureTracked({ size: [1, 1, depthOrArrayLayers], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING, dimension, textureBindingViewDimension, }); }, shouldError ); }); g.test('depthOrArrayLayers_incompatible_with_textureBindingViewDimension') .desc( `Tests * if textureBindingViewDimension is '2d' then depthOrArrayLayers must be 1 * if textureBindingViewDimension is 'cube' then depthOrArrayLayers must be 6 ` ) .params(u => u // .combine('textureBindingViewDimension', ['2d', 'cube'] as const) .combine('depthOrArrayLayers', [1, 3, 6, 12]) ) .fn(t => { const { textureBindingViewDimension, depthOrArrayLayers } = t.params; const shouldError = (textureBindingViewDimension === '2d' && depthOrArrayLayers !== 1) || (textureBindingViewDimension === 'cube' && depthOrArrayLayers !== 6); t.expectGPUErrorInCompatibilityMode( 'validation', () => { t.createTextureTracked({ size: [1, 1, depthOrArrayLayers], format: 'rgba8unorm', usage: GPUTextureUsage.TEXTURE_BINDING, textureBindingViewDimension, }); }, shouldError ); }); g.test('format_reinterpretation') .desc( ` Tests that you can not request different view formats when creating a texture. For example, rgba8unorm can not be viewed as rgba8unorm-srgb ` ) .params(u => u // .combine('format', kDifferentBaseFormatTextureFormats) ) .fn(t => { const { format } = t.params; t.skipIfTextureFormatNotSupported(format); const info = getBlockInfoForTextureFormat(format); const baseFormat = getBaseFormatForTextureFormat(format); const formatPairs = [ { format, viewFormats: [baseFormat] }, { format: baseFormat, viewFormats: [format] }, { format, viewFormats: [format, baseFormat] }, { format: baseFormat, viewFormats: [format, baseFormat] }, ]; for (const { format, viewFormats } of formatPairs) { t.expectGPUErrorInCompatibilityMode( 'validation', () => { t.createTextureTracked({ size: [info.blockWidth, info.blockHeight], format, viewFormats, usage: GPUTextureUsage.TEXTURE_BINDING, }); }, true ); } }); g.test('unsupportedStorageTextureFormats') .desc(`Tests that you can not create unsupported storage texture formats in compat mode.`) .params(u => u.combine('format', kCompatModeUnsupportedStorageTextureFormats)) .fn(t => { const { format } = t.params; t.expectGPUErrorInCompatibilityMode( 'validation', () => t.createTextureTracked({ size: [1, 1, 1], format, usage: GPUTextureUsage.STORAGE_BINDING, }), true ); });