Skip to content

Commit 9516ba1

Browse files
author
Yang Gu
committed
Add tests for WEBGPU_USE_IMPORT
1 parent 0e58f86 commit 9516ba1

File tree

2 files changed

+64
-60
lines changed

2 files changed

+64
-60
lines changed

tfjs-backend-webgpu/src/backend_webgpu.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ export class WebGPUBackend extends KernelBackend {
587587
if (info.texture instanceof GPUExternalTexture) {
588588
return info.texture;
589589
} else {
590-
return (info.texture as GPUTexture).createView();
590+
return info.texture.createView();
591591
}
592592
}
593593
return {

tfjs-backend-webgpu/src/backend_webgpu_test.ts

Lines changed: 63 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -222,26 +222,30 @@ describeWebGPU('backend webgpu', () => {
222222
const textureManager = backend.getTextureManager();
223223
textureManager.dispose();
224224

225-
for (let tmpUseImport of [false, true]) {
226-
{
227-
tf.env().set('WEBGPU_USE_IMPORT', tmpUseImport);
225+
{
226+
const video = document.createElement('video');
227+
const source = document.createElement('source');
228+
source.src =
229+
// tslint:disable-next-line:max-line-length
230+
'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw';
231+
source.type = 'video/mp4';
232+
video.appendChild(source);
233+
document.body.appendChild(video);
234+
235+
video.autoplay = true;
236+
video.loop = true;
237+
video.muted = true;
238+
video.preload = 'auto';
239+
await video.play();
240+
241+
// ensure video element to be loaded
242+
if ('requestVideoFrameCallback' in video) {
243+
// tslint:disable-next-line:no-any
244+
await new Promise(go => (video as any).requestVideoFrameCallback(go));
245+
}
228246

229-
const video = document.createElement('video');
230-
video.autoplay = true;
231-
const source = document.createElement('source');
232-
source.src =
233-
// tslint:disable-next-line:max-line-length
234-
'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw';
235-
source.type = 'video/mp4';
236-
video.appendChild(source);
237-
document.body.appendChild(video);
238-
239-
// On mobile safari the ready state is ready immediately.
240-
if (video.readyState < 2) {
241-
await new Promise(resolve => {
242-
video.addEventListener('loadeddata', () => resolve(video));
243-
});
244-
}
247+
for (const tmpUseImport of [false, true]) {
248+
tf.env().set('WEBGPU_USE_IMPORT', tmpUseImport);
245249
const res = await tf.browser.fromPixelsAsync(video);
246250
expect(res.shape).toEqual([90, 160, 3]);
247251
const data = await res.data();
@@ -250,51 +254,51 @@ describeWebGPU('backend webgpu', () => {
250254
const usedTexturesAfterFromPixel = textureManager.getNumUsedTextures();
251255
expect(freeTexturesAfterFromPixel).toEqual(1);
252256
expect(usedTexturesAfterFromPixel).toEqual(0);
253-
document.body.removeChild(video);
254257
}
255258

256-
{
257-
const img = new Image(10, 10);
258-
img.src = 'data:image/gif;base64' +
259-
',R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
260-
261-
await new Promise(resolve => {
262-
img.onload = () => resolve(img);
263-
});
264-
265-
const resImage = await tf.browser.fromPixelsAsync(img);
266-
expect(resImage.shape).toEqual([10, 10, 3]);
267-
268-
const dataImage = await resImage.data();
269-
expect(dataImage[0]).toEqual(0);
270-
expect(dataImage.length).toEqual(10 * 10 * 3);
271-
const freeTexturesAfterFromPixel = textureManager.getNumFreeTextures();
272-
const usedTexturesAfterFromPixel = textureManager.getNumUsedTextures();
273-
expect(freeTexturesAfterFromPixel).toEqual(2);
274-
expect(usedTexturesAfterFromPixel).toEqual(0);
275-
}
259+
document.body.removeChild(video);
260+
tf.env().set('WEBGPU_USE_IMPORT', useImport);
261+
}
276262

277-
{
278-
const img = new Image(10, 10);
279-
img.src =
280-
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABfSURBVChTY/gPBu8NLd/KqLxT1oZw4QAqDZSDoPeWDj9WrYUIAgG6NBAhm4FFGoIgxuCUBiKgMfikv1bW4pQGav334wdUGshBk/6SVQAUh0p/mzIDTQ6oFSGNHfz/DwAwi8mNzTi6rwAAAABJRU5ErkJggg==';
281-
await new Promise(resolve => {
282-
img.onload = () => resolve(img);
283-
});
284-
const resImage = await tf.browser.fromPixelsAsync(img);
285-
expect(resImage.shape).toEqual([10, 10, 3]);
286-
287-
const dataImage = await resImage.data();
288-
expect(dataImage[0]).toEqual(255);
289-
expect(dataImage.length).toEqual(10 * 10 * 3);
290-
const freeTexturesAfterFromPixel = textureManager.getNumFreeTextures();
291-
const usedTexturesAfterFromPixel = textureManager.getNumUsedTextures();
292-
expect(freeTexturesAfterFromPixel).toEqual(2);
293-
expect(usedTexturesAfterFromPixel).toEqual(0);
294-
}
263+
{
264+
const img = new Image(10, 10);
265+
img.src = 'data:image/gif;base64' +
266+
',R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==';
267+
268+
await new Promise(resolve => {
269+
img.onload = () => resolve(img);
270+
});
271+
272+
const resImage = await tf.browser.fromPixelsAsync(img);
273+
expect(resImage.shape).toEqual([10, 10, 3]);
274+
275+
const dataImage = await resImage.data();
276+
expect(dataImage[0]).toEqual(0);
277+
expect(dataImage.length).toEqual(10 * 10 * 3);
278+
const freeTexturesAfterFromPixel = textureManager.getNumFreeTextures();
279+
const usedTexturesAfterFromPixel = textureManager.getNumUsedTextures();
280+
expect(freeTexturesAfterFromPixel).toEqual(2);
281+
expect(usedTexturesAfterFromPixel).toEqual(0);
295282
}
296283

297-
tf.env().set('WEBGPU_USE_IMPORT', useImport);
284+
{
285+
const img = new Image(10, 10);
286+
img.src =
287+
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABfSURBVChTY/gPBu8NLd/KqLxT1oZw4QAqDZSDoPeWDj9WrYUIAgG6NBAhm4FFGoIgxuCUBiKgMfikv1bW4pQGav334wdUGshBk/6SVQAUh0p/mzIDTQ6oFSGNHfz/DwAwi8mNzTi6rwAAAABJRU5ErkJggg==';
288+
await new Promise(resolve => {
289+
img.onload = () => resolve(img);
290+
});
291+
const resImage = await tf.browser.fromPixelsAsync(img);
292+
expect(resImage.shape).toEqual([10, 10, 3]);
293+
294+
const dataImage = await resImage.data();
295+
expect(dataImage[0]).toEqual(255);
296+
expect(dataImage.length).toEqual(10 * 10 * 3);
297+
const freeTexturesAfterFromPixel = textureManager.getNumFreeTextures();
298+
const usedTexturesAfterFromPixel = textureManager.getNumUsedTextures();
299+
expect(freeTexturesAfterFromPixel).toEqual(2);
300+
expect(usedTexturesAfterFromPixel).toEqual(0);
301+
}
298302
});
299303
});
300304

0 commit comments

Comments
 (0)