@@ -176,6 +176,8 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
176176 public readonly resourceType = 'buffer' ;
177177 public flags : GPUBufferUsageFlags = GPUBufferUsage . COPY_DST |
178178 GPUBufferUsage . COPY_SRC ;
179+
180+ readonly #device: GPUDevice ;
179181 private _buffer : GPUBuffer | null = null ;
180182 private _ownBuffer : boolean ;
181183 private _destroyed = false ;
@@ -189,12 +191,13 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
189191 usableAsIndex = false ;
190192
191193 constructor (
192- private readonly _group : ExperimentalTgpuRoot ,
194+ root : ExperimentalTgpuRoot ,
193195 public readonly dataType : TData ,
194196 public readonly initialOrBuffer ?: Infer < TData > | GPUBuffer | undefined ,
195197 private readonly _disallowedUsages ?:
196198 ( 'uniform' | 'storage' | 'vertex' | 'index' ) [ ] ,
197199 ) {
200+ this . #device = root . device ;
198201 if ( isGPUBuffer ( initialOrBuffer ) ) {
199202 this . _ownBuffer = false ;
200203 this . _buffer = initialOrBuffer ;
@@ -205,14 +208,12 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
205208 }
206209
207210 get buffer ( ) {
208- const device = this . _group . device ;
209-
210211 if ( this . _destroyed ) {
211212 throw new Error ( 'This buffer has been destroyed' ) ;
212213 }
213214
214215 if ( ! this . _buffer ) {
215- this . _buffer = device . createBuffer ( {
216+ this . _buffer = this . # device. createBuffer ( {
216217 size : sizeOf ( this . dataType ) ,
217218 usage : this . flags ,
218219 mappedAtCreation : ! ! this . initial ,
@@ -317,7 +318,6 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
317318
318319 write ( data : Infer < TData > ) : void {
319320 const gpuBuffer = this . buffer ;
320- const device = this . _group . device ;
321321
322322 if ( gpuBuffer . mapState === 'mapped' ) {
323323 const mapped = gpuBuffer . getMappedRange ( ) ;
@@ -330,16 +330,12 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
330330 this . _hostBuffer = new ArrayBuffer ( size ) ;
331331 }
332332
333- // Flushing any commands yet to be encoded.
334- this . _group . flush ( ) ;
335-
336333 this . _writeToTarget ( this . _hostBuffer , data ) ;
337- device . queue . writeBuffer ( gpuBuffer , 0 , this . _hostBuffer , 0 , size ) ;
334+ this . # device. queue . writeBuffer ( gpuBuffer , 0 , this . _hostBuffer , 0 , size ) ;
338335 }
339336
340337 public writePartial ( data : InferPartial < TData > ) : void {
341338 const gpuBuffer = this . buffer ;
342- const device = this . _group . device ;
343339
344340 const instructions = getWriteInstructions ( this . dataType , data ) ;
345341
@@ -352,7 +348,7 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
352348 }
353349 } else {
354350 for ( const instruction of instructions ) {
355- device . queue . writeBuffer (
351+ this . # device. queue . writeBuffer (
356352 gpuBuffer ,
357353 instruction . data . byteOffset ,
358354 instruction . data ,
@@ -365,19 +361,15 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
365361
366362 public clear ( ) : void {
367363 const gpuBuffer = this . buffer ;
368- const device = this . _group . device ;
369364
370365 if ( gpuBuffer . mapState === 'mapped' ) {
371366 new Uint8Array ( gpuBuffer . getMappedRange ( ) ) . fill ( 0 ) ;
372367 return ;
373368 }
374369
375- // Flushing any commands yet to be encoded.
376- this . _group . flush ( ) ;
377-
378- const encoder = device . createCommandEncoder ( ) ;
370+ const encoder = this . #device. createCommandEncoder ( ) ;
379371 encoder . clearBuffer ( gpuBuffer ) ;
380- device . queue . submit ( [ encoder . finish ( ) ] ) ;
372+ this . # device. queue . submit ( [ encoder . finish ( ) ] ) ;
381373 }
382374
383375 copyFrom ( srcBuffer : TgpuBuffer < MemIdentity < TData > > ) : void {
@@ -386,16 +378,13 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
386378 }
387379
388380 const size = sizeOf ( this . dataType ) ;
389- const encoder = this . _group . commandEncoder ;
381+ const encoder = this . #device . createCommandEncoder ( ) ;
390382 encoder . copyBufferToBuffer ( srcBuffer . buffer , 0 , this . buffer , 0 , size ) ;
383+ this . #device. queue . submit ( [ encoder . finish ( ) ] ) ;
391384 }
392385
393386 async read ( ) : Promise < Infer < TData > > {
394- // Flushing any commands yet to be encoded.
395- this . _group . flush ( ) ;
396-
397387 const gpuBuffer = this . buffer ;
398- const device = this . _group . device ;
399388
400389 if ( gpuBuffer . mapState === 'mapped' ) {
401390 const mapped = gpuBuffer . getMappedRange ( ) ;
@@ -410,12 +399,12 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
410399 return res ;
411400 }
412401
413- const stagingBuffer = device . createBuffer ( {
402+ const stagingBuffer = this . # device. createBuffer ( {
414403 size : sizeOf ( this . dataType ) ,
415404 usage : GPUBufferUsage . COPY_DST | GPUBufferUsage . MAP_READ ,
416405 } ) ;
417406
418- const commandEncoder = device . createCommandEncoder ( ) ;
407+ const commandEncoder = this . # device. createCommandEncoder ( ) ;
419408 commandEncoder . copyBufferToBuffer (
420409 gpuBuffer ,
421410 0 ,
@@ -424,8 +413,7 @@ class TgpuBufferImpl<TData extends AnyData> implements TgpuBuffer<TData> {
424413 sizeOf ( this . dataType ) ,
425414 ) ;
426415
427- device . queue . submit ( [ commandEncoder . finish ( ) ] ) ;
428- await device . queue . onSubmittedWorkDone ( ) ;
416+ this . #device. queue . submit ( [ commandEncoder . finish ( ) ] ) ;
429417 await stagingBuffer . mapAsync ( GPUMapMode . READ , 0 , sizeOf ( this . dataType ) ) ;
430418
431419 const res = readData (
0 commit comments