Skip to content

Commit 756fc8f

Browse files
WebGPU: cache bind group in the swap chain present command
1 parent c725429 commit 756fc8f

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

Graphics/GraphicsEngineWebGPU/src/SwapChainWebGPUImpl.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -288,16 +288,19 @@ class SwapChainWebGPUImpl::PresentCommand
288288
return WGPUSurfaceGetCurrentTextureStatus_Error;
289289
}
290290

291-
WGPUBindGroupEntry wgpuBindGroupEntries[1]{};
292-
wgpuBindGroupEntries[0].binding = 0;
293-
wgpuBindGroupEntries[0].textureView = pTexture->GetWebGPUTextureView();
291+
if (!m_wgpuBindGroup)
292+
{
293+
WGPUBindGroupEntry wgpuBindGroupEntries[1]{};
294+
wgpuBindGroupEntries[0].binding = 0;
295+
wgpuBindGroupEntries[0].textureView = pTexture->GetWebGPUTextureView();
294296

295-
WGPUBindGroupDescriptor wgpuBindGroupDesc{};
296-
wgpuBindGroupDesc.entries = wgpuBindGroupEntries;
297-
wgpuBindGroupDesc.entryCount = _countof(wgpuBindGroupEntries);
298-
wgpuBindGroupDesc.layout = m_wgpuBindGroupLayout;
297+
WGPUBindGroupDescriptor wgpuBindGroupDesc{};
298+
wgpuBindGroupDesc.entries = wgpuBindGroupEntries;
299+
wgpuBindGroupDesc.entryCount = _countof(wgpuBindGroupEntries);
300+
wgpuBindGroupDesc.layout = m_wgpuBindGroupLayout;
299301

300-
WebGPUBindGroupWrapper wgpuBindGroup{wgpuDeviceCreateBindGroup(m_pRenderDevice->GetWebGPUDevice(), &wgpuBindGroupDesc)};
302+
m_wgpuBindGroup.Reset(wgpuDeviceCreateBindGroup(m_pRenderDevice->GetWebGPUDevice(), &wgpuBindGroupDesc));
303+
}
301304

302305
WGPUCommandEncoderDescriptor wgpuCmdEncoderDesc{};
303306
WebGPUCommandEncoderWrapper wgpuCmdEncoder{wgpuDeviceCreateCommandEncoder(m_pRenderDevice->GetWebGPUDevice(), &wgpuCmdEncoderDesc)};
@@ -315,7 +318,7 @@ class SwapChainWebGPUImpl::PresentCommand
315318

316319
WebGPURenderPassEncoderWrapper wgpuRenderPassEncoder{wgpuCommandEncoderBeginRenderPass(wgpuCmdEncoder, &wgpuRenderPassDesc)};
317320
wgpuRenderPassEncoderSetPipeline(wgpuRenderPassEncoder, m_wgpuRenderPipeline);
318-
wgpuRenderPassEncoderSetBindGroup(wgpuRenderPassEncoder, 0, wgpuBindGroup, 0, nullptr);
321+
wgpuRenderPassEncoderSetBindGroup(wgpuRenderPassEncoder, 0, m_wgpuBindGroup, 0, nullptr);
319322
wgpuRenderPassEncoderDraw(wgpuRenderPassEncoder, 3, 1, 0, 0);
320323
wgpuRenderPassEncoderEnd(wgpuRenderPassEncoder);
321324

@@ -333,9 +336,15 @@ class SwapChainWebGPUImpl::PresentCommand
333336
return wgpuSurfaceTexture.status;
334337
}
335338

339+
void ReleaseSwapChainResources()
340+
{
341+
m_wgpuBindGroup.Reset();
342+
}
343+
336344
private:
337345
RefCntAutoPtr<IRenderDeviceWebGPU> m_pRenderDevice;
338346
WebGPUBindGroupLayoutWrapper m_wgpuBindGroupLayout;
347+
WebGPUBindGroupWrapper m_wgpuBindGroup;
339348
WebGPUPipelineLayoutWrapper m_wgpuPipelineLayout;
340349
WebGPURenderPipelineWrapper m_wgpuRenderPipeline;
341350
};
@@ -599,6 +608,7 @@ void SwapChainWebGPUImpl::ReleaseSwapChainResources()
599608
if (!m_wgpuSurface)
600609
return;
601610

611+
m_pCmdPresent->ReleaseSwapChainResources();
602612
m_pBackBufferSRV.Release();
603613
m_pBackBufferRTV.Release();
604614
m_pDepthBufferDSV.Release();

0 commit comments

Comments
 (0)