D3D12 CB state cache assertion fail

Hello,

I’m running into a crash with the following config:

  • UE4.14 Preview
  • D3D12 RHI
  • Level from VR Template in Editor
  • Instanced Stereo enabled and Forward shading enabled in ini.
  • Editor startup so instanced stereo drawing disabled.

What is happening is that in the base pass static mesh drawing for the level’s TextRenderComponent:

  1. FForwardLightingParameters::Set is not binding InstancedForwardGlobalLightData (CB slot 5) since instanced is false.
  2. Pixel shader’s CB Resource Count is 8.
  3. D3D12 state cache’s PipelineState::Common::CurrentShaderCBCounts[Pixel] is therefore 8.
  4. D3D12 state cache’s commit code (FD3D12StateCacheBase::ApplyState) assumes every slot is set when calculating dirty bind slots (local variable CurrentShaderDirtyCBVSlots)
  5. Dirty array is then used to set constant buffer at index 5 (FD3D12DescriptorCache::SetConstantBuffers) but this hasn’t been bound so GPU virtual address is 0 and check() fails.

Should the instanced data always be set in (1) or should the code in (4) take into account unbound CB slots?

Thanks,
Michael