@@ -77,39 +77,39 @@ class Bindings extends DataMap {
7777 */
7878 getForRender ( renderObject ) {
7979
80- const bindings = renderObject . getBindings ( ) ;
80+ return this . _getBindings ( renderObject , renderObject . getBindings ( ) ) ;
8181
82- for ( const bindGroup of bindings ) {
82+ }
8383
84- const groupData = this . get ( bindGroup ) ;
84+ /**
85+ * Returns the bind groups for the given compute node.
86+ *
87+ * @param {Node } computeNode - The compute node.
88+ * @return {Array<BindGroup> } The bind groups.
89+ */
90+ getForCompute ( computeNode ) {
8591
86- if ( groupData . bindGroup === undefined ) {
92+ return this . _getBindings ( computeNode , this . nodes . getForCompute ( computeNode ) . bindings ) ;
8793
88- // each object defines an array of bindings (ubos, textures, samplers etc.)
94+ }
8995
90- this . _init ( bindGroup ) ;
96+ _getBindings ( object , bindings ) {
9197
92- this . backend . createBindings ( bindGroup , bindings , 0 ) ;
98+ const data = this . get ( object ) ;
9399
94- groupData . bindGroup = bindGroup ;
100+ if ( data . bindings !== bindings ) {
95101
96- }
102+ if ( data . bindings !== undefined ) {
97103
98- }
104+ this . _updateBindingsUsage ( data . bindings , - 1 ) ;
99105
100- return bindings ;
106+ }
101107
102- }
108+ this . _updateBindingsUsage ( bindings , 1 ) ;
103109
104- /**
105- * Returns the bind groups for the given compute node.
106- *
107- * @param {Node } computeNode - The compute node.
108- * @return {Array<BindGroup> } The bind groups.
109- */
110- getForCompute ( computeNode ) {
110+ data . bindings = bindings ;
111111
112- const bindings = this . nodes . getForCompute ( computeNode ) . bindings ;
112+ }
113113
114114 for ( const bindGroup of bindings ) {
115115
@@ -160,14 +160,7 @@ class Bindings extends DataMap {
160160 */
161161 deleteForCompute ( computeNode ) {
162162
163- const bindings = this . nodes . getForCompute ( computeNode ) . bindings ;
164-
165- for ( const bindGroup of bindings ) {
166-
167- this . backend . deleteBindGroupData ( bindGroup ) ;
168- this . delete ( bindGroup ) ;
169-
170- }
163+ this . _deleteBindings ( computeNode ) ;
171164
172165 }
173166
@@ -178,12 +171,57 @@ class Bindings extends DataMap {
178171 */
179172 deleteForRender ( renderObject ) {
180173
181- const bindings = renderObject . getBindings ( ) ;
174+ this . _deleteBindings ( renderObject ) ;
175+
176+ }
177+
178+ _deleteBindings ( object ) {
179+
180+ const data = this . get ( object ) ;
181+
182+ if ( data . bindings !== undefined ) {
183+
184+ this . _updateBindingsUsage ( data . bindings , - 1 ) ;
185+
186+ data . bindings = undefined ;
187+
188+ }
189+
190+ }
191+
192+ _updateBindingsUsage ( bindings , delta ) {
182193
183194 for ( const bindGroup of bindings ) {
184195
185- this . backend . deleteBindGroupData ( bindGroup ) ;
186- this . delete ( bindGroup ) ;
196+ const groupData = this . get ( bindGroup ) ;
197+
198+ groupData . usedTimes = ( groupData . usedTimes || 0 ) + delta ;
199+
200+ for ( const binding of bindGroup . bindings ) {
201+
202+ if ( binding . isUniformBuffer ) {
203+
204+ const bindingData = this . get ( binding ) ;
205+
206+ bindingData . usedTimes = ( bindingData . usedTimes || 0 ) + delta ;
207+
208+ if ( bindingData . usedTimes === 0 ) {
209+
210+ this . backend . destroyUniformBuffer ( binding ) ;
211+ this . delete ( binding ) ;
212+
213+ }
214+
215+ }
216+
217+ }
218+
219+ if ( groupData . usedTimes === 0 ) {
220+
221+ this . backend . deleteBindGroupData ( bindGroup ) ;
222+ this . delete ( bindGroup ) ;
223+
224+ }
187225
188226 }
189227
@@ -213,7 +251,11 @@ class Bindings extends DataMap {
213251
214252 for ( const binding of bindGroup . bindings ) {
215253
216- if ( binding . isSampledTexture ) {
254+ if ( binding . isUniformBuffer ) {
255+
256+ this . backend . createUniformBuffer ( binding ) ;
257+
258+ } else if ( binding . isSampledTexture ) {
217259
218260 this . textures . updateTexture ( binding . texture ) ;
219261
0 commit comments