@@ -9,6 +9,32 @@ class WebGPUBindingUtils {
99
1010 this . backend = backend ;
1111
12+ this . lowwaterMark = Infinity ;
13+ this . highwaterMark = 0 ;
14+
15+ this . commonBufferGPU = null ;
16+
17+ }
18+
19+ getCommonBuffer ( commonUniformBuffer ) {
20+
21+ let bufferGPU = this . commonBufferGPU ;
22+
23+ if ( bufferGPU === null ) {
24+
25+ bufferGPU = this . backend . device . createBuffer ( {
26+ label : 'bindingBuffer_common' ,
27+ size : commonUniformBuffer . byteLength ,
28+ usage : GPUBufferUsage . UNIFORM | GPUBufferUsage . COPY_DST
29+ } ) ;
30+
31+ this . commonBufferGPU = bufferGPU ;
32+ this . commonUniformBuffer = commonUniformBuffer ;
33+
34+ }
35+
36+ return bufferGPU
37+
1238 }
1339
1440 createBindingsLayout ( bindings ) {
@@ -142,10 +168,18 @@ class WebGPUBindingUtils {
142168 const backend = this . backend ;
143169 const device = backend . device ;
144170
145- const buffer = binding . buffer ;
146- const bufferGPU = backend . get ( binding ) . buffer ;
171+ if ( binding . isNodeUniformsGroup && binding . allocateCommon ( ) ) {
172+
173+ const buffer = binding . buffer ;
147174
148- device . queue . writeBuffer ( bufferGPU , 0 , buffer , 0 ) ;
175+ this . lowwaterMark = Math . min ( this . lowwaterMark , buffer . byteOffset ) ;
176+ this . highwaterMark = Math . max ( this . highwaterMark , buffer . byteOffset + buffer . byteLength ) ;
177+
178+ } else {
179+
180+ const bufferGPU = backend . get ( binding ) . buffer ;
181+ device . queue . writeBuffer ( bufferGPU , 0 , binding . buffer , 0 ) ;
182+ }
149183
150184 }
151185
@@ -163,23 +197,42 @@ class WebGPUBindingUtils {
163197
164198 const bindingData = backend . get ( binding ) ;
165199
166- if ( bindingData . buffer === undefined ) {
200+ let resource ;
167201
168- const byteLength = binding . byteLength ;
202+ if ( binding . isNodeUniformsGroup && binding . allocateCommon ( ) ) {
169203
170- const usage = GPUBufferUsage . UNIFORM | GPUBufferUsage . COPY_DST ;
204+ const buffer = binding . buffer ;
171205
172- const bufferGPU = device . createBuffer ( {
173- label : 'bindingBuffer_' + binding . name ,
174- size : byteLength ,
175- usage : usage
176- } ) ;
206+ resource = {
207+ label : 'bindingBufferCommon_' + binding . name ,
208+ buffer : this . getCommonBuffer ( binding . commonUniformBuffer ) ,
209+ offset : buffer . byteOffset ,
210+ size : buffer . byteLength
211+ } ;
177212
178- bindingData . buffer = bufferGPU ;
213+ } else {
214+
215+ if ( bindingData . buffer === undefined ) {
216+
217+ const byteLength = binding . byteLength ;
218+
219+ const usage = GPUBufferUsage . UNIFORM | GPUBufferUsage . COPY_DST ;
220+
221+ const bufferGPU = device . createBuffer ( {
222+ label : 'bindingBuffer_' + binding . name ,
223+ size : byteLength ,
224+ usage : usage
225+ } ) ;
226+
227+ bindingData . buffer = bufferGPU ;
228+
229+ }
230+
231+ resource = { buffer : bindingData . buffer } ;
179232
180233 }
181234
182- entriesGPU . push ( { binding : bindingPoint , resource : { buffer : bindingData . buffer } } ) ;
235+ entriesGPU . push ( { binding : bindingPoint , resource } ) ;
183236
184237 } else if ( binding . isStorageBuffer ) {
185238
@@ -253,6 +306,19 @@ class WebGPUBindingUtils {
253306
254307 }
255308
309+ endPass ( ) {
310+
311+ if ( this . commonBufferGPU === null || this . lowwaterMark === Infinity ) return ;
312+
313+ const device = this . backend . device ;
314+
315+ device . queue . writeBuffer ( this . commonBufferGPU , this . lowwaterMark , this . commonUniformBuffer . arrayBuffer , this . lowwaterMark , this . highwaterMark - this . lowwaterMark ) ;
316+
317+ this . lowwaterMark = Infinity ;
318+ this . highwaterMark = 0 ;
319+
320+ }
321+
256322}
257323
258324export default WebGPUBindingUtils ;
0 commit comments