Skip to content

Commit 1c45822

Browse files
WebGPURenderer: Fix texture view caching and dispose event stacking (#30647)
* WebGPURenderer: Fix texture view caching and dispose event stacking * cleanup log * cleanup * cleanup
1 parent b124221 commit 1c45822

File tree

2 files changed

+71
-50
lines changed

2 files changed

+71
-50
lines changed

Diff for: src/renderers/common/Renderer.js

+2
Original file line numberDiff line numberDiff line change
@@ -1932,6 +1932,8 @@ class Renderer {
19321932
renderContext.stencil = renderTarget.stencilBuffer;
19331933
// #30329
19341934
renderContext.clearColorValue = this.backend.getClearColor();
1935+
renderContext.activeCubeFace = this.getActiveCubeFace();
1936+
renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
19351937

19361938
}
19371939

Diff for: src/renderers/webgpu/WebGPUBackend.js

+69-50
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,9 @@ class WebGPUBackend extends Backend {
369369
renderTargetData.width !== renderTarget.width ||
370370
renderTargetData.height !== renderTarget.height ||
371371
renderTargetData.dimensions !== renderTarget.dimensions ||
372-
renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
372+
renderTargetData.activeMipmapLevel !== renderContext.activeMipmapLevel ||
373373
renderTargetData.activeCubeFace !== renderContext.activeCubeFace ||
374-
renderTargetData.samples !== renderTarget.samples ||
375-
renderTargetData.loadOp !== colorAttachmentsConfig.loadOp
374+
renderTargetData.samples !== renderTarget.samples
376375
) {
377376

378377
descriptors = {};
@@ -384,23 +383,25 @@ class WebGPUBackend extends Backend {
384383
const onDispose = () => {
385384

386385
renderTarget.removeEventListener( 'dispose', onDispose );
387-
388386
this.delete( renderTarget );
389387

390388
};
391389

392-
renderTarget.addEventListener( 'dispose', onDispose );
390+
if ( renderTarget.hasEventListener( 'dispose', onDispose ) === false ) {
391+
392+
renderTarget.addEventListener( 'dispose', onDispose );
393+
394+
}
393395

394396
}
395397

396398
const cacheKey = renderContext.getCacheKey();
399+
let descriptorBase = descriptors[ cacheKey ];
397400

398-
let descriptor = descriptors[ cacheKey ];
399-
400-
if ( descriptor === undefined ) {
401+
if ( descriptorBase === undefined ) {
401402

402403
const textures = renderContext.textures;
403-
const colorAttachments = [];
404+
const textureViews = [];
404405

405406
let sliceIndex;
406407

@@ -448,53 +449,66 @@ class WebGPUBackend extends Backend {
448449

449450
}
450451

451-
// only apply the user-defined clearValue to the first color attachment like in beginRender()
452-
453-
let clearValue = { r: 0, g: 0, b: 0, a: 1 };
454-
455-
if ( i === 0 && colorAttachmentsConfig.clearValue ) {
456-
457-
clearValue = colorAttachmentsConfig.clearValue;
458-
459-
}
460-
461-
colorAttachments.push( {
452+
textureViews.push( {
462453
view,
463-
depthSlice: sliceIndex,
464454
resolveTarget,
465-
loadOp: colorAttachmentsConfig.loadOP || GPULoadOp.Load,
466-
storeOp: colorAttachmentsConfig.storeOP || GPUStoreOp.Store,
467-
clearValue: clearValue
455+
depthSlice: sliceIndex
468456
} );
469457

470458
}
471459

472-
473-
descriptor = {
474-
colorAttachments,
475-
};
460+
descriptorBase = { textureViews };
476461

477462
if ( renderContext.depth ) {
478463

479464
const depthTextureData = this.get( renderContext.depthTexture );
480-
481-
const depthStencilAttachment = {
482-
view: depthTextureData.texture.createView()
483-
};
484-
descriptor.depthStencilAttachment = depthStencilAttachment;
465+
descriptorBase.depthStencilView = depthTextureData.texture.createView();
485466

486467
}
487468

488-
descriptors[ cacheKey ] = descriptor;
469+
descriptors[ cacheKey ] = descriptorBase;
489470

490471
renderTargetData.width = renderTarget.width;
491472
renderTargetData.height = renderTarget.height;
492473
renderTargetData.samples = renderTarget.samples;
493474
renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;
494475
renderTargetData.activeCubeFace = renderContext.activeCubeFace;
495476
renderTargetData.dimensions = renderTarget.dimensions;
496-
renderTargetData.depthSlice = sliceIndex;
497-
renderTargetData.loadOp = colorAttachments[ 0 ].loadOp;
477+
478+
}
479+
480+
const descriptor = {
481+
colorAttachments: []
482+
};
483+
484+
// Apply dynamic properties to cached views
485+
for ( let i = 0; i < descriptorBase.textureViews.length; i ++ ) {
486+
487+
const viewInfo = descriptorBase.textureViews[ i ];
488+
489+
let clearValue = { r: 0, g: 0, b: 0, a: 1 };
490+
if ( i === 0 && colorAttachmentsConfig.clearValue ) {
491+
492+
clearValue = colorAttachmentsConfig.clearValue;
493+
494+
}
495+
496+
descriptor.colorAttachments.push( {
497+
view: viewInfo.view,
498+
depthSlice: viewInfo.depthSlice,
499+
resolveTarget: viewInfo.resolveTarget,
500+
loadOp: colorAttachmentsConfig.loadOp || GPULoadOp.Load,
501+
storeOp: colorAttachmentsConfig.storeOp || GPUStoreOp.Store,
502+
clearValue: clearValue
503+
} );
504+
505+
}
506+
507+
if ( descriptorBase.depthStencilView ) {
508+
509+
descriptor.depthStencilAttachment = {
510+
view: descriptorBase.depthStencilView
511+
};
498512

499513
}
500514

@@ -873,7 +887,6 @@ class WebGPUBackend extends Backend {
873887
const renderer = this.renderer;
874888

875889
let colorAttachments = [];
876-
877890
let depthStencilAttachment;
878891
let clearValue;
879892

@@ -917,29 +930,35 @@ class WebGPUBackend extends Backend {
917930
supportsDepth = renderTargetContext.depth;
918931
supportsStencil = renderTargetContext.stencil;
919932

920-
if ( color ) {
933+
const clearConfig = {
934+
loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,
935+
clearValue: color ? clearValue : undefined
936+
};
921937

922-
const descriptor = this._getRenderPassDescriptor( renderTargetContext, { loadOp: GPULoadOp.Clear, clearValue } );
938+
if ( supportsDepth ) {
923939

924-
colorAttachments = descriptor.colorAttachments;
940+
clearConfig.depthLoadOp = depth ? GPULoadOp.Clear : GPULoadOp.Load;
941+
clearConfig.depthClearValue = depth ? renderer.getClearDepth() : undefined;
942+
clearConfig.depthStoreOp = GPUStoreOp.Store;
925943

926944
}
927945

928-
if ( supportsDepth || supportsStencil ) {
946+
if ( supportsStencil ) {
929947

930-
const depthTextureData = this.get( renderTargetContext.depthTexture );
931-
932-
depthStencilAttachment = {
933-
view: depthTextureData.texture.createView()
934-
};
948+
clearConfig.stencilLoadOp = stencil ? GPULoadOp.Clear : GPULoadOp.Load;
949+
clearConfig.stencilClearValue = stencil ? renderer.getClearStencil() : undefined;
950+
clearConfig.stencilStoreOp = GPUStoreOp.Store;
935951

936952
}
937953

938-
}
954+
const descriptor = this._getRenderPassDescriptor( renderTargetContext, clearConfig );
939955

940-
//
956+
colorAttachments = descriptor.colorAttachments;
957+
depthStencilAttachment = descriptor.depthStencilAttachment;
958+
959+
}
941960

942-
if ( supportsDepth ) {
961+
if ( supportsDepth && depthStencilAttachment && depthStencilAttachment.depthLoadOp === undefined ) {
943962

944963
if ( depth ) {
945964

@@ -958,7 +977,7 @@ class WebGPUBackend extends Backend {
958977

959978
//
960979

961-
if ( supportsStencil ) {
980+
if ( supportsStencil && depthStencilAttachment && depthStencilAttachment.stencilLoadOp === undefined ) {
962981

963982
if ( stencil ) {
964983

0 commit comments

Comments
 (0)