Description

When adding a Uniform Buffer Struct that has one 4x4 matrix to a mesh pass, validation will fail, due to a Uniform Buffer Struct mismatch.

This can be reproduced by adding a mesh pass in project-side code. However, it is easier to reproduce by adding the buffer to the Base Pass parameters.

This does not reproduce with "-onethread"

Steps to Reproduce

1. Unshelve CL: 39714201, or make the following engine changes:
(Note that this is reproducible by adding a mesh pass with similar structure instead of engine changes)

  • Create a new static uniform buffer with a single 4x4 matrix, and bind to Base Pass parameters, in BasePassRendering.cpp

// BEGIN_CHANGE
BEGIN_UNIFORM_BUFFER_STRUCT(FTestParams, )
SHADER_PARAMETER(FMatrix44f, TestMatrix)
END_UNIFORM_BUFFER_STRUCT()IMPLEMENT_STATIC_UNIFORM_BUFFER_STRUCT(FTestParams, "TestParams", SceneTextures);
// END_CHANGE
BEGIN_SHADER_PARAMETER_STRUCT(FOpaqueBasePassParameters, )
SHADER_PARAMETER_STRUCT_INCLUDE(FViewShaderParameters, View)
// BEGIN_CHANGE
SHADER_PARAMETER_RDG_UNIFORM_BUFFER(FTestParams, PassUBO)
// END_CHANGE
SHADER_PARAMETER_STRUCT_REF(FReflectionCaptureShaderData, ReflectionCapture)

END_SHADER_PARAMETER_STRUCT()

PassParameters->RenderTargets.ShadingRateTexture = GVRSImageManager.GetVariableRateShadingImage(GraphBuilder, View, FVariableRateShadingImageManager::EVRSPassType::BasePass);
// BEGIN_CHANGE
FTestParams* TestParameters = GraphBuilder.AllocParameters<FTestParams>();
TestParameters->TestMatrix = FMatrix44f::Identity;
PassParameters->PassUBO = GraphBuilder.CreateUniformBuffer(TestParameters);
// END_CHANGE
const bool bShouldRenderView = View.ShouldRenderView();
SkyPassPassParameters->ReflectionCapture = View.ReflectionCaptureUniformBuffer;
// BEGIN_CHANGE
SkyPassPassParameters->PassUBO = GraphBuilder.CreateUniformBuffer(TestParameters);
// END_CHANGE
// Remove all but the SceneColor
```

2. Compile and launch any project, with the debugger attached.
3. Observe the failed check:
"Uniform Buffer FOpaqueBasePassUniformParameters was added multiple times to the binding array but with different values."

Callstack

> UnrealEditor-RHI.dll!FUniformBufferStaticBindings::AddUniformBuffer(FRHIUniformBuffer * UniformBuffer) Line 76 C++
[Inline Frame] UnrealEditor-RenderCore.dll!FRDGParameterStruct::GetStaticUniformBuffers::__l2::<lambda_1>::operator()(FRDGUniformBufferBinding) Line 28 C++
UnrealEditor-RenderCore.dll!FRDGParameterStruct::EnumerateUniformBuffers<`FRDGParameterStruct::GetStaticUniformBuffers'::`2'::<lambda_1>>(FRDGParameterStruct::GetStaticUniformBuffers::__l2::<lambda_1> Function) Line 50 C++
UnrealEditor-RenderCore.dll!FRDGParameterStruct::GetStaticUniformBuffers() Line 32 C++
[Inline Frame] UnrealEditor-RenderCore.dll!FRDGDispatchPassBuilder::

{ctor}

(FRDGDispatchPass *) Line 745 C++
UnrealEditor-RenderCore.dll!FRDGBuilder::SetupDispatchPassExecute() Line 2953 C++
[Inline Frame] UnrealEditor-RenderCore.dll!FRDGBuilder::Execute::__l59::<lambda_15>::operator()() Line 2020 C++
[Inline Frame] UnrealEditor-RenderCore.dll!Invoke(FRDGBuilder::Execute::__l59::<lambda_15> &) Line 47 C++
UnrealEditor-RenderCore.dll!UE::Tasks::Private::TExecutableTaskBase<`FRDGBuilder::Execute'::`59'::<lambda_15>,void,void>::ExecuteTask() Line 873 C++
UnrealEditor-RenderCore.dll!UE::Tasks::Private::FTaskBase::TryExecuteTask() Line 504 C++
[Inline Frame] UnrealEditor-RenderCore.dll!UE::Tasks::Private::FTaskBase::Init::__l2::<lambda_1>::operator()() Line 185 C++
[Inline Frame] UnrealEditor-RenderCore.dll!LowLevelTasks::FTask::Init::__l13::<lambda_1>::operator()(const bool) Line 499 C++
[Inline Frame] UnrealEditor-RenderCore.dll!Invoke(LowLevelTasks::FTask::Init::__l13::<lambda_1> &) Line 47 C++
[Inline Frame] UnrealEditor-RenderCore.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`UE::Tasks::Private::FTaskBase::Init'::`2'::<lambda_1>>'::`13'::<lambda_1>,0>::Call(void *) Line 162 C++
UnrealEditor-RenderCore.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`UE::Tasks::Private::FTaskBase::Init'::`2'::<lambda_1>>'::`13'::<lambda_1>,0>::CallAndMove(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> & Destination, void * InlineData, unsigned int DestInlineSize, bool <Params_0>) Line 171 C++
[Inline Frame] UnrealEditor-Core.dll!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48>::CallAndMove(LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __cdecl(bool),48> &) Line 308 C++
UnrealEditor-Core.dll!LowLevelTasks::FTask::ExecuteTask() Line 627 C++
UnrealEditor-Core.dll!LowLevelTasks::FScheduler::ExecuteTask(LowLevelTasks::FTask * InTask) Line 245 C++
[Inline Frame] UnrealEditor-Core.dll!LowLevelTasks::FScheduler::TryExecuteTaskFrom(LowLevelTasks::Private::FWaitEvent *) Line 457 C++
UnrealEditor-Core.dll!LowLevelTasks::FScheduler::WorkerLoop(LowLevelTasks::Private::FWaitEvent * WorkerEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * WorkerLocalQueue, unsigned int WaitCycles, bool bPermitBackgroundWork) Line 514 C++
[Inline Frame] UnrealEditor-Core.dll!LowLevelTasks::FScheduler::WorkerMain(LowLevelTasks::Private::FWaitEvent * WorkerEvent, LowLevelTasks::Private::TLocalQueueRegistry<1024,1024>::TLocalQueue * WorkerLocalQueue, unsigned int WaitCycles, bool bPermitBackgroundWork) Line 571 C++
UnrealEditor-Core.dll!LowLevelTasks::FScheduler::CreateWorker::__l2::<lambda>() Line 75 C++
[Inline Frame] UnrealEditor-Core.dll!UE::Core::Private::Function::TFunctionRefBase<UE::Core::Private::Function::TFunctionStorage<1>,void __cdecl(void)>::operator()() Line 470 C++
UnrealEditor-Core.dll!FThreadImpl::Run() Line 69 C++
UnrealEditor-Core.dll!FRunnableThreadWin::Run() Line 159 C++
UnrealEditor-Core.dll!FRunnableThreadWin::GuardedRun() Line 71 C++
[External Code]

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-247704 in the post.

0
Login to Vote

By Design
ComponentUE - Rendering Architecture - RHI
Affects Versions5.5
CreatedFeb 12, 2025
ResolvedFeb 14, 2025
UpdatedFeb 18, 2025
View Jira Issue