@@ -91,8 +91,7 @@ void DeviceContextWebGPUImpl::SetPipelineState(IPipelineState* pPipelineState)
9191
9292 const Uint32 SignatureCount = m_pPipelineState->GetResourceSignatureCount ();
9393
94- Uint32 ActiveBindGroupIndex = 0 ;
95- Uint32 MaxDynamicOffsetCount = 0 ;
94+ Uint32 ActiveBindGroupIndex = 0 ;
9695 for (Uint32 i = 0 ; i < SignatureCount; ++i)
9796 {
9897 PipelineResourceSignatureWebGPUImpl* pSign = m_pPipelineState->GetResourceSignature (i);
@@ -117,10 +116,11 @@ void DeviceContextWebGPUImpl::SetPipelineState(IPipelineState* pPipelineState)
117116 if (pSign->HasBindGroup (BindGroupId))
118117 {
119118 const Uint32 DynamicOffsetCount = pSign->GetDynamicOffsetCount (BindGroupId);
120- MaxDynamicOffsetCount = std::max (MaxDynamicOffsetCount, DynamicOffsetCount);
119+ BindGroup.DynamicBufferOffsets .resize (DynamicOffsetCount);
120+ for (Uint32& Offset : BindGroup.DynamicBufferOffsets )
121+ Offset = ~0u ;
121122
122- BindGroup.DynamicOffsetCount = DynamicOffsetCount;
123- BindGroup.BindIndex = ActiveBindGroupIndex++;
123+ BindGroup.BindIndex = ActiveBindGroupIndex++;
124124 }
125125 else
126126 {
@@ -130,8 +130,6 @@ void DeviceContextWebGPUImpl::SetPipelineState(IPipelineState* pPipelineState)
130130 }
131131 }
132132 VERIFY (m_pPipelineState->GetPipelineLayout ().GetBindGroupCount () == ActiveBindGroupIndex, " Bind group count mismatch" );
133-
134- m_DynamicBufferOffsets.resize (MaxDynamicOffsetCount);
135133}
136134
137135void DeviceContextWebGPUImpl::TransitionShaderResources (IShaderResourceBinding* pShaderResourceBinding)
@@ -214,13 +212,13 @@ void DeviceContextWebGPUImpl::CommitShaderResources(IShaderResourceBinding*
214212 VERIFY_EXPR (BGIndex == ResourceCache.GetNumBindGroups ());
215213}
216214
217- void SetBindGroup (WGPURenderPassEncoder Encoder, uint32_t GroupIndex, WGPUBindGroup Group, size_t DynamicOffsetCount, uint32_t const * DynamicOffsets)
215+ void SetBindGroup (WGPURenderPassEncoder Encoder, uint32_t GroupIndex, WGPUBindGroup Group, const std::vector<Uint32>& DynamicOffsets)
218216{
219- wgpuRenderPassEncoderSetBindGroup (Encoder, GroupIndex, Group, DynamicOffsetCount, DynamicOffsets);
217+ wgpuRenderPassEncoderSetBindGroup (Encoder, GroupIndex, Group, DynamicOffsets. size (), ! DynamicOffsets. empty () ? DynamicOffsets. data () : nullptr );
220218}
221- void SetBindGroup (WGPUComputePassEncoder Encoder, uint32_t GroupIndex, WGPUBindGroup Group, size_t DynamicOffsetCount, uint32_t const * DynamicOffsets)
219+ void SetBindGroup (WGPUComputePassEncoder Encoder, uint32_t GroupIndex, WGPUBindGroup Group, const std::vector<Uint32>& DynamicOffsets)
222220{
223- wgpuComputePassEncoderSetBindGroup (Encoder, GroupIndex, Group, DynamicOffsetCount, DynamicOffsets);
221+ wgpuComputePassEncoderSetBindGroup (Encoder, GroupIndex, Group, DynamicOffsets. size (), ! DynamicOffsets. empty () ? DynamicOffsets. data () : nullptr );
224222}
225223
226224template <typename CmdEncoderType>
@@ -234,25 +232,35 @@ void DeviceContextWebGPUImpl::CommitBindGroups(CmdEncoderType CmdEncoder, Uint32
234232
235233 for (Uint32 sign = FirstSign; sign <= LastSign; ++sign)
236234 {
235+ const Uint32 SRBBit = 1u << sign;
236+ if ((CommitSRBMask & SRBBit) == 0 )
237+ continue ;
238+
237239 Uint32 BindGroupCacheIndex = 0 ;
238240 for (PipelineResourceSignatureWebGPUImpl::BIND_GROUP_ID BindGroupId : {PipelineResourceSignatureWebGPUImpl::BIND_GROUP_ID_STATIC_MUTABLE,
239241 PipelineResourceSignatureWebGPUImpl::BIND_GROUP_ID_DYNAMIC})
240242 {
241- const WebGPUResourceBindInfo::BindGroupInfo& BindGroup = m_BindInfo.BindGroups [sign][BindGroupId];
243+ WebGPUResourceBindInfo::BindGroupInfo& BindGroup = m_BindInfo.BindGroups [sign][BindGroupId];
242244 if (!BindGroup.IsActive ())
243245 continue ;
244246
245247 const ShaderResourceCacheWebGPU* ResourceCache = m_BindInfo.ResourceCaches [sign];
246248 VERIFY_EXPR (ResourceCache != nullptr );
247- const Uint32 NumOffsetsWritten = ResourceCache->GetDynamicBufferOffsets (GetContextId (), m_DynamicBufferOffsets, BindGroupCacheIndex++);
248- VERIFY (NumOffsetsWritten == BindGroup.DynamicOffsetCount ,
249- " The number of dynamic offsets written (" , NumOffsetsWritten, " ) does not match the expected number (" , BindGroup.DynamicOffsetCount ,
250- " ). This likely indicates mismatch between the SRB and the PSO" );
251- (void )NumOffsetsWritten;
249+ bool DynamicOffsetsChanged = false ;
250+ if (!BindGroup.DynamicBufferOffsets .empty ())
251+ {
252+ DynamicOffsetsChanged = ResourceCache->GetDynamicBufferOffsets (GetContextId (), BindGroup.DynamicBufferOffsets , BindGroupCacheIndex);
253+ }
254+ ++BindGroupCacheIndex;
255+
256+ if ((m_BindInfo.StaleSRBMask & SRBBit) == 0 && !DynamicOffsetsChanged)
257+ {
258+ continue ;
259+ }
252260
253261 if (WGPUBindGroup wgpuBindGroup = BindGroup.wgpuBindGroup )
254262 {
255- SetBindGroup (CmdEncoder, BindGroup.BindIndex , wgpuBindGroup, BindGroup.DynamicOffsetCount , m_DynamicBufferOffsets. data () );
263+ SetBindGroup (CmdEncoder, BindGroup.BindIndex , wgpuBindGroup, BindGroup.DynamicBufferOffsets );
256264 }
257265 else
258266 {
0 commit comments