Skip to content

Commit aabe8e8

Browse files
authored
Refactor copyExternalImageToTexture tested formats. (#4465)
Rather than have a list of allowed formats, the new spec allows all regular texture formats that are renderable and not compressed, not snorm, not integer. gpuweb/gpuweb#5289 gpuweb/gpuweb#5299 gpuweb/gpuweb#5323
1 parent e34f99a commit aabe8e8

File tree

5 files changed

+49
-73
lines changed

5 files changed

+49
-73
lines changed

src/webgpu/format_info.ts

Lines changed: 23 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,63 +1829,25 @@ export const kOptionalTextureFormats = kAllTextureFormats.filter(
18291829
t => kTextureFormatInfo[t].feature !== undefined
18301830
);
18311831

1832-
/** Formats added from 'texture-formats-tier1' to be usable with `copyExternalImageToTexture`.
1833-
* DO NOT EXPORT. Use kPossibleValidTextureFormatsForCopyE2T and
1834-
* filter with `isTextureFormatUsableWithCopyExternalImageToTexture`
1835-
* or `GPUTest.skipIfTextureFormatNotUsableWithCopyExternalImageToTexture`
1836-
*/
1837-
const kValidTextureFormatsForCopyE2TTier1 = [
1838-
'r16unorm',
1839-
'r16snorm',
1840-
'rg16unorm',
1841-
'rg16snorm',
1842-
'rgba16unorm',
1843-
'rgba16snorm',
1844-
'r8snorm',
1845-
'rg8snorm',
1846-
'rgba8snorm',
1847-
'rg11b10ufloat',
1848-
] as const;
1849-
1850-
/** Possibly Valid GPUTextureFormats for `copyExternalImageToTexture`, by spec. */
1851-
export const kPossibleValidTextureFormatsForCopyE2T = [
1852-
'r8unorm',
1853-
'r16float',
1854-
'r32float',
1855-
'rg8unorm',
1856-
'rg16float',
1857-
'rg32float',
1858-
'rgba8unorm',
1859-
'rgba8unorm-srgb',
1860-
'bgra8unorm',
1861-
'bgra8unorm-srgb',
1862-
'rgb10a2unorm',
1863-
'rgba16float',
1864-
'rgba32float',
1865-
...kValidTextureFormatsForCopyE2TTier1,
1866-
] as const;
1832+
function isSnormTextureFormat(format: GPUTextureFormat): boolean {
1833+
return format.endsWith('snorm');
1834+
}
18671835

18681836
/**
1869-
* Valid GPUTextureFormats for `copyExternalImageToTexture` for core and compat.
1870-
* DO NOT EXPORT. Use kPossibleValidTextureFormatsForCopyE2T and
1871-
* filter with `isTextureFormatUsableWithCopyExternalImageToTexture`
1872-
* or `GPUTest.skipIfTextureFormatNotUsableWithCopyExternalImageToTexture`
1837+
* Returns true if a texture can be possibly used with copyExternalImageToTexture.
1838+
* The texture may require certain features to be enabled.
18731839
*/
1874-
const kValidTextureFormatsForCopyE2T = [
1875-
'r8unorm',
1876-
'r16float',
1877-
'r32float',
1878-
'rg8unorm',
1879-
'rg16float',
1880-
'rg32float',
1881-
'rgba8unorm',
1882-
'rgba8unorm-srgb',
1883-
'bgra8unorm',
1884-
'bgra8unorm-srgb',
1885-
'rgb10a2unorm',
1886-
'rgba16float',
1887-
'rgba32float',
1888-
] as const;
1840+
export function isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(
1841+
format: GPUTextureFormat
1842+
): boolean {
1843+
return (
1844+
isColorTextureFormat(format) &&
1845+
!isSintOrUintFormat(format) &&
1846+
!isCompressedTextureFormat(format) &&
1847+
!isSnormTextureFormat(format) &&
1848+
isTextureFormatPossiblyUsableAsColorRenderAttachment(format)
1849+
);
1850+
}
18891851

18901852
/**
18911853
* Returns true if a texture can be used with copyExternalImageToTexture.
@@ -1894,12 +1856,13 @@ export function isTextureFormatUsableWithCopyExternalImageToTexture(
18941856
device: GPUDevice,
18951857
format: GPUTextureFormat
18961858
): boolean {
1897-
if (device.features.has('texture-formats-tier1')) {
1898-
if ((kValidTextureFormatsForCopyE2TTier1 as readonly string[]).includes(format)) {
1899-
return true;
1900-
}
1901-
}
1902-
return (kValidTextureFormatsForCopyE2T as readonly string[]).includes(format);
1859+
return (
1860+
isColorTextureFormat(format) &&
1861+
!isSintOrUintFormat(format) &&
1862+
!isCompressedTextureFormat(format) &&
1863+
!isSnormTextureFormat(format) &&
1864+
isTextureFormatColorRenderable(device, format)
1865+
);
19031866
}
19041867

19051868
//

src/webgpu/web_platform/copyToTexture/ImageBitmap.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ TODO: Test zero-sized copies from all sources (just make sure params cover it) (
1313
import { makeTestGroup } from '../../../common/framework/test_group.js';
1414
import {
1515
getBaseFormatForRegularTextureFormat,
16-
kPossibleValidTextureFormatsForCopyE2T,
16+
isTextureFormatPossiblyUsableWithCopyExternalImageToTexture,
17+
kRegularTextureFormats,
1718
} from '../../format_info.js';
1819
import { TextureUploadingUtils, kCopySubrectInfo } from '../../util/copy_to_texture.js';
1920

@@ -55,7 +56,8 @@ g.test('from_ImageData')
5556
.combine('orientation', ['none', 'flipY'] as const)
5657
.combine('colorSpaceConversion', ['none', 'default'] as const)
5758
.combine('srcFlipYInCopy', [true, false])
58-
.combine('dstFormat', kPossibleValidTextureFormatsForCopyE2T)
59+
.combine('dstFormat', kRegularTextureFormats)
60+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstFormat))
5961
.combine('dstPremultiplied', [true, false])
6062
.beginSubcases()
6163
.combine('width', [1, 2, 4, 15, 255, 256])
@@ -177,7 +179,8 @@ g.test('from_canvas')
177179
.combine('orientation', ['none', 'flipY'] as const)
178180
.combine('colorSpaceConversion', ['none', 'default'] as const)
179181
.combine('srcFlipYInCopy', [true, false])
180-
.combine('dstFormat', kPossibleValidTextureFormatsForCopyE2T)
182+
.combine('dstFormat', kRegularTextureFormats)
183+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstFormat))
181184
.combine('dstPremultiplied', [true, false])
182185
.beginSubcases()
183186
.combine('width', [1, 2, 4, 15, 255, 256])

src/webgpu/web_platform/copyToTexture/ImageData.spec.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ copyExternalImageToTexture from ImageData source.
55
import { makeTestGroup } from '../../../common/framework/test_group.js';
66
import {
77
getBaseFormatForRegularTextureFormat,
8-
kPossibleValidTextureFormatsForCopyE2T,
8+
isTextureFormatPossiblyUsableWithCopyExternalImageToTexture,
9+
kRegularTextureFormats,
910
} from '../../format_info.js';
1011
import { TextureUploadingUtils, kCopySubrectInfo } from '../../util/copy_to_texture.js';
1112

@@ -43,7 +44,8 @@ g.test('from_ImageData')
4344
.params(u =>
4445
u
4546
.combine('srcDoFlipYDuringCopy', [true, false])
46-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
47+
.combine('dstColorFormat', kRegularTextureFormats)
48+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
4749
.combine('dstPremultiplied', [true, false])
4850
.beginSubcases()
4951
.combine('width', [1, 2, 4, 15, 255, 256])

src/webgpu/web_platform/copyToTexture/canvas.spec.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import { skipTestCase } from '../../../common/util/util.js';
77
import { kCanvasAlphaModes } from '../../capability_info.js';
88
import {
99
getBaseFormatForRegularTextureFormat,
10-
kPossibleValidTextureFormatsForCopyE2T,
10+
isTextureFormatPossiblyUsableWithCopyExternalImageToTexture,
11+
kRegularTextureFormats,
1112
RegularTextureFormat,
1213
} from '../../format_info.js';
1314
import { TextureUploadingUtils } from '../../util/copy_to_texture.js';
@@ -486,7 +487,8 @@ g.test('copy_contents_from_2d_context_canvas')
486487
.params(u =>
487488
u
488489
.combine('canvasType', kAllCanvasTypes)
489-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
490+
.combine('dstColorFormat', kRegularTextureFormats)
491+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
490492
.combine('dstAlphaMode', kCanvasAlphaModes)
491493
.combine('srcDoFlipYDuringCopy', [true, false])
492494
.beginSubcases()
@@ -548,7 +550,8 @@ g.test('copy_contents_from_gl_context_canvas')
548550
u
549551
.combine('canvasType', kAllCanvasTypes)
550552
.combine('contextName', ['webgl', 'webgl2'] as const)
551-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
553+
.combine('dstColorFormat', kRegularTextureFormats)
554+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
552555
.combine('srcPremultiplied', [true, false])
553556
.combine('dstAlphaMode', kCanvasAlphaModes)
554557
.combine('srcDoFlipYDuringCopy', [true, false])
@@ -623,7 +626,8 @@ g.test('copy_contents_from_gpu_context_canvas')
623626
u
624627
.combine('canvasType', kAllCanvasTypes)
625628
.combine('srcAndDstInSameGPUDevice', [true, false])
626-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
629+
.combine('dstColorFormat', kRegularTextureFormats)
630+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
627631
// .combine('srcAlphaMode', kCanvasAlphaModes)
628632
.combine('srcAlphaMode', ['premultiplied'] as const)
629633
.combine('dstAlphaMode', kCanvasAlphaModes)
@@ -699,7 +703,8 @@ g.test('copy_contents_from_bitmaprenderer_context_canvas')
699703
.params(u =>
700704
u
701705
.combine('canvasType', kAllCanvasTypes)
702-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
706+
.combine('dstColorFormat', kRegularTextureFormats)
707+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
703708
.combine('dstAlphaMode', kCanvasAlphaModes)
704709
.combine('srcDoFlipYDuringCopy', [true, false])
705710
.beginSubcases()
@@ -774,7 +779,8 @@ g.test('color_space_conversion')
774779
u
775780
.combine('srcColorSpace', ['srgb', 'display-p3'] as const)
776781
.combine('dstColorSpace', ['srgb', 'display-p3'] as const)
777-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
782+
.combine('dstColorFormat', kRegularTextureFormats)
783+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
778784
.combine('dstPremultiplied', [true, false])
779785
.combine('srcDoFlipYDuringCopy', [true, false])
780786
.beginSubcases()

src/webgpu/web_platform/copyToTexture/image.spec.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { makeTestGroup } from '../../../common/framework/test_group.js';
66
import { raceWithRejectOnTimeout } from '../../../common/util/util.js';
77
import {
88
getBaseFormatForRegularTextureFormat,
9-
kPossibleValidTextureFormatsForCopyE2T,
9+
isTextureFormatPossiblyUsableWithCopyExternalImageToTexture,
10+
kRegularTextureFormats,
1011
} from '../../format_info.js';
1112
import * as ttu from '../../texture_test_utils.js';
1213
import { TextureUploadingUtils, kCopySubrectInfo } from '../../util/copy_to_texture.js';
@@ -58,7 +59,8 @@ g.test('from_image')
5859
.params(u =>
5960
u
6061
.combine('srcDoFlipYDuringCopy', [true, false])
61-
.combine('dstColorFormat', kPossibleValidTextureFormatsForCopyE2T)
62+
.combine('dstColorFormat', kRegularTextureFormats)
63+
.filter(t => isTextureFormatPossiblyUsableWithCopyExternalImageToTexture(t.dstColorFormat))
6264
.combine('dstPremultiplied', [true, false])
6365
.beginSubcases()
6466
.combine('width', [1, 2, 4, 15, 255, 256])

0 commit comments

Comments
 (0)