@@ -216,65 +216,67 @@ describeWebGPU('backend webgpu', () => {
216216 expect ( ( ) => c . dataSync ( ) ) . not . toThrow ( ) ;
217217 } ) ;
218218
219- it ( 'should reuse textures when fromPixels have same input size ' , async ( ) => {
219+ it ( 'should behave well if WEBGPU_USER_IMPORT is true or false ' , async ( ) => {
220220 const useImport = tf . env ( ) . getBool ( 'WEBGPU_USE_IMPORT' ) ;
221221 const backend = tf . backend ( ) as WebGPUBackend ;
222222 const textureManager = backend . getTextureManager ( ) ;
223+ textureManager . dispose ( ) ;
224+
225+ const video = document . createElement ( 'video' ) ;
226+ const source = document . createElement ( 'source' ) ;
227+ source . src =
228+ // tslint:disable-next-line:max-line-length
229+ 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw' ;
230+ source . type = 'video/mp4' ;
231+ video . appendChild ( source ) ;
232+ document . body . appendChild ( video ) ;
233+
234+ video . autoplay = true ;
235+ video . loop = true ;
236+ video . muted = true ;
237+ video . preload = 'auto' ;
238+ await video . play ( ) ;
239+
240+ // ensure video element to be loaded
241+ if ( 'requestVideoFrameCallback' in video ) {
242+ // tslint:disable-next-line:no-any
243+ await new Promise ( go => ( video as any ) . requestVideoFrameCallback ( go ) ) ;
244+ }
223245
224246 {
225- const video = document . createElement ( 'video' ) ;
226- const source = document . createElement ( 'source' ) ;
227- source . src =
228- // tslint:disable-next-line:max-line-length
229- 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAu1tZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1NSByMjkwMSA3ZDBmZjIyIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTMgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTI4LjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAAwZYiEAD//8m+P5OXfBeLGOfKE3xkODvFZuBflHv/+VwJIta6cbpIo4ABLoKBaYTkTAAAC7m1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAAAPoAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIYdHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAACgAAAAWgAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAD6AAAAAAAAQAAAAABkG1kaWEAAAAgbWRoZAAAAAAAAAAAAAAAAAAAQAAAAEAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAATttaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAD7c3RibAAAAJdzdHNkAAAAAAAAAAEAAACHYXZjMQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAACgAFoASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAADFhdmNDAWQACv/hABhnZAAKrNlCjfkhAAADAAEAAAMAAg8SJZYBAAZo6+JLIsAAAAAYc3R0cwAAAAAAAAABAAAAAQAAQAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAC5QAAAAEAAAAUc3RjbwAAAAAAAAABAAAAMAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTguMTIuMTAw' ;
230- source . type = 'video/mp4' ;
231- video . appendChild ( source ) ;
232- document . body . appendChild ( video ) ;
233-
234- video . autoplay = true ;
235- video . loop = true ;
236- video . muted = true ;
237- video . preload = 'auto' ;
238- await video . play ( ) ;
239-
240- // ensure video element to be loaded
241- if ( 'requestVideoFrameCallback' in video ) {
242- // tslint:disable-next-line:no-any
243- await new Promise ( go => ( video as any ) . requestVideoFrameCallback ( go ) ) ;
244- }
245-
246- {
247- textureManager . dispose ( ) ;
248- tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , true ) ;
249- const res = await tf . browser . fromPixelsAsync ( video ) ;
250- expect ( res . shape ) . toEqual ( [ 90 , 160 , 3 ] ) ;
251- const data = await res . data ( ) ;
252- expect ( data . length ) . toEqual ( 90 * 160 * 3 ) ;
253- const freeTexturesAfterFromPixels = textureManager . getNumFreeTextures ( ) ;
254- expect ( freeTexturesAfterFromPixels ) . toEqual ( 0 ) ;
255- const usedTexturesAfterFromPixels = textureManager . getNumUsedTextures ( ) ;
256- expect ( usedTexturesAfterFromPixels ) . toEqual ( 0 ) ;
257- }
258-
259- {
260- textureManager . dispose ( ) ;
261- tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , false ) ;
262- const res = await tf . browser . fromPixelsAsync ( video ) ;
263- expect ( res . shape ) . toEqual ( [ 90 , 160 , 3 ] ) ;
264- const data = await res . data ( ) ;
265- expect ( data . length ) . toEqual ( 90 * 160 * 3 ) ;
266- const freeTexturesAfterFromPixels = textureManager . getNumFreeTextures ( ) ;
267- expect ( freeTexturesAfterFromPixels ) . toEqual ( 1 ) ;
268- const usedTexturesAfterFromPixels = textureManager . getNumUsedTextures ( ) ;
269- expect ( usedTexturesAfterFromPixels ) . toEqual ( 0 ) ;
270- }
271-
272- document . body . removeChild ( video ) ;
273- tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , useImport ) ;
247+ tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , true ) ;
248+ const res = await tf . browser . fromPixelsAsync ( video ) ;
249+ expect ( res . shape ) . toEqual ( [ 90 , 160 , 3 ] ) ;
250+ const data = await res . data ( ) ;
251+ expect ( data . length ) . toEqual ( 90 * 160 * 3 ) ;
252+ const freeTexturesAfterFromPixels = textureManager . getNumFreeTextures ( ) ;
253+ expect ( freeTexturesAfterFromPixels ) . toEqual ( 0 ) ;
254+ const usedTexturesAfterFromPixels = textureManager . getNumUsedTextures ( ) ;
255+ expect ( usedTexturesAfterFromPixels ) . toEqual ( 0 ) ;
256+ }
257+
258+ {
259+ tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , false ) ;
260+ const res = await tf . browser . fromPixelsAsync ( video ) ;
261+ expect ( res . shape ) . toEqual ( [ 90 , 160 , 3 ] ) ;
262+ const data = await res . data ( ) ;
263+ expect ( data . length ) . toEqual ( 90 * 160 * 3 ) ;
264+ const freeTexturesAfterFromPixels = textureManager . getNumFreeTextures ( ) ;
265+ expect ( freeTexturesAfterFromPixels ) . toEqual ( 1 ) ;
266+ const usedTexturesAfterFromPixels = textureManager . getNumUsedTextures ( ) ;
267+ expect ( usedTexturesAfterFromPixels ) . toEqual ( 0 ) ;
274268 }
275269
270+ document . body . removeChild ( video ) ;
271+ tf . env ( ) . set ( 'WEBGPU_USE_IMPORT' , useImport ) ;
272+ } ) ;
273+
274+ it ( 'should reuse textures when fromPixels have same input size' , async ( ) => {
275+ const backend = tf . backend ( ) as WebGPUBackend ;
276+ const textureManager = backend . getTextureManager ( ) ;
277+ textureManager . dispose ( ) ;
278+
276279 {
277- textureManager . dispose ( ) ;
278280 const img = new Image ( 10 , 10 ) ;
279281 img . src = 'data:image/gif;base64' +
280282 ',R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==' ;
@@ -296,7 +298,6 @@ describeWebGPU('backend webgpu', () => {
296298 }
297299
298300 {
299- textureManager . dispose ( ) ;
300301 const img = new Image ( 10 , 10 ) ;
301302 img . src =
302303 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAABfSURBVChTY/gPBu8NLd/KqLxT1oZw4QAqDZSDoPeWDj9WrYUIAgG6NBAhm4FFGoIgxuCUBiKgMfikv1bW4pQGav334wdUGshBk/6SVQAUh0p/mzIDTQ6oFSGNHfz/DwAwi8mNzTi6rwAAAABJRU5ErkJggg==' ;
0 commit comments