@@ -56,6 +56,8 @@ function rendererWebGPU(p5, fn) {
5656 this . uniformBufferPool = [ ] ;
5757 this . resettingUniformBuffers = [ ] ;
5858
59+ this . dynamicEntryOffsets = new Uint32Array ( 64 ) ;
60+
5961 // Cache for current frame's canvas texture view
6062 this . currentCanvasColorTexture = null ;
6163 this . currentCanvasColorTextureView = null ;
@@ -664,12 +666,14 @@ function rendererWebGPU(p5, fn) {
664666 }
665667
666668 // Create layouts and bind groups
669+ const groupEntriesArr = [ ] ;
667670 for ( const [ group , entries ] of groupEntries ) {
668671 const layout = this . device . createBindGroupLayout ( { entries } ) ;
669672 bindGroupLayouts . set ( group , layout ) ;
673+ groupEntriesArr . push ( [ group , entries ] ) ;
670674 }
671675
672- shader . _groupEntries = groupEntries ;
676+ shader . _groupEntries = groupEntriesArr ;
673677 shader . _bindGroupLayouts = [ ...bindGroupLayouts . values ( ) ] ;
674678 // Reuse bind groups if they don't change
675679 shader . _cachedBindGroup = { } ;
@@ -1463,9 +1467,6 @@ function rendererWebGPU(p5, fn) {
14631467 passEncoder . setVertexBuffer ( location , gpuBuffer , 0 ) ;
14641468 }
14651469
1466- const uniformBuffersForBinding = { } ;
1467- const uniformBufferOffsets = { } ;
1468-
14691470 for ( const bufferGroup of currentShader . _uniformBufferGroups ) {
14701471 if ( bufferGroup . dynamic ) {
14711472 // Bind uniforms into a part of a big dynamic memory block because
@@ -1480,8 +1481,8 @@ function rendererWebGPU(p5, fn) {
14801481 uniformBufferInfo . offset += Math . ceil ( bufferGroup . size / this . uniformBufferAlignment ) * this . uniformBufferAlignment ;
14811482
14821483 // Make a shallow copy so that we keep track of the last offset for this uniform
1483- uniformBuffersForBinding [ bufferGroup . cacheKey ] = uniformBufferInfo ;
1484- uniformBufferOffsets [ bufferGroup . cacheKey ] = uniformBufferInfo . lastOffset ;
1484+ bufferGroup . currentDynamicBuffer = uniformBufferInfo ;
1485+ bufferGroup . lastOffset = uniformBufferInfo . lastOffset ;
14851486 } else {
14861487 // Bind uniforms to a binding-specific buffer, which may be cached for performance
14871488 let bufferInfo ;
@@ -1510,8 +1511,6 @@ function rendererWebGPU(p5, fn) {
15101511 // Cache this buffer and data for next frame
15111512 bufferGroup . currentBuffer = bufferInfo ;
15121513 }
1513-
1514- uniformBuffersForBinding [ bufferGroup . cacheKey ] = bufferInfo ;
15151514 }
15161515 }
15171516 for ( const sampler of currentShader . samplers ) {
@@ -1523,26 +1522,29 @@ function rendererWebGPU(p5, fn) {
15231522 }
15241523
15251524 // Bind sampler/texture uniforms and uniform buffers
1526- for ( const [ group , entries ] of currentShader . _groupEntries ) {
1527- const dynamicEntryOffsets = [ ] ;
1525+ for ( const iter of currentShader . _groupEntries ) {
1526+ const group = iter [ 0 ] ;
1527+ const entries = iter [ 1 ] ;
1528+ let dynamicOffsetIdx = 0 ;
15281529 const bgEntries = [ ] ;
15291530 let bindGroup = currentShader . _cachedBindGroup [ group ] ;
15301531 for ( const entry of entries ) {
1532+ const bufferGroup = entry . bufferGroup ;
15311533 // Check if this is a uniform buffer binding
1532- const uniformBufferInfo = entry . bufferGroup &&
1533- uniformBuffersForBinding [ entry . bufferGroup . cacheKey ] ;
1534- if ( uniformBufferInfo && entry . bufferGroup ) {
1535- if ( entry . bufferGroup . dynamic ) {
1536- dynamicEntryOffsets . push ( uniformBufferOffsets [ entry . bufferGroup . cacheKey ] ) ;
1534+ const uniformBufferInfo =
1535+ bufferGroup ?. currentBuffer || bufferGroup ?. currentDynamicBuffer ;
1536+ if ( uniformBufferInfo ) {
1537+ if ( bufferGroup . dynamic ) {
1538+ this . dynamicEntryOffsets [ dynamicOffsetIdx ++ ] = bufferGroup . lastOffset ;
15371539 }
15381540 if ( ! bindGroup ) {
15391541 bgEntries . push ( {
15401542 binding : entry . binding ,
1541- resource : entry . bufferGroup . dynamic
1543+ resource : bufferGroup . dynamic
15421544 ? {
15431545 buffer : uniformBufferInfo . uniformBuffer ,
15441546 offset : 0 ,
1545- size : Math . ceil ( entry . bufferGroup . size / this . uniformBufferAlignment ) * this . uniformBufferAlignment ,
1547+ size : Math . ceil ( bufferGroup . size / this . uniformBufferAlignment ) * this . uniformBufferAlignment ,
15461548 }
15471549 : { buffer : uniformBufferInfo . buffer } ,
15481550 } ) ;
@@ -1565,11 +1567,20 @@ function rendererWebGPU(p5, fn) {
15651567 } ) ;
15661568 }
15671569 currentShader . _cachedBindGroup [ group ] = bindGroup ;
1568- passEncoder . setBindGroup (
1569- group ,
1570- bindGroup ,
1571- dynamicEntryOffsets ,
1572- ) ;
1570+ if ( dynamicOffsetIdx === 0 ) {
1571+ passEncoder . setBindGroup (
1572+ group ,
1573+ bindGroup ,
1574+ ) ;
1575+ } else {
1576+ passEncoder . setBindGroup (
1577+ group ,
1578+ bindGroup ,
1579+ this . dynamicEntryOffsets ,
1580+ 0 ,
1581+ dynamicOffsetIdx
1582+ ) ;
1583+ }
15731584 }
15741585
15751586 if ( currentShader . shaderType === "fill" ) {
0 commit comments