Files
UnrealEngine/Engine/Source/Runtime/Apple/MetalRHI/Private/MetalUniformBufferCommands.cpp
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

37 lines
1.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MetalRHIPrivate.h"
#include "MetalDynamicRHI.h"
#include "MetalShaderTypes.h"
#include "MetalTempAllocator.h"
FUniformBufferRHIRef FMetalDynamicRHI::RHICreateUniformBuffer(const void* Contents, const FRHIUniformBufferLayout* Layout, EUniformBufferUsage Usage, EUniformBufferValidation Validation)
{
return new FMetalUniformBuffer(*Device, Contents, Layout, Usage, Validation);
}
void FMetalDynamicRHI::RHIUpdateUniformBuffer(FRHICommandListBase& RHICmdList, FRHIUniformBuffer* UniformBufferRHI, const void* Contents)
{
FMetalUniformBuffer* UniformBuffer = ResourceCast(UniformBufferRHI);
const void* SrcContents = Contents;
if (RHICmdList.IsTopOfPipe())
{
const FRHIUniformBufferLayout& Layout = UniformBuffer->GetLayout();
// Copy the contents memory region into the RHICmdList to allow deferred execution on the RHI thread.
void* DstContents = RHICmdList.Alloc(Layout.ConstantBufferSize, alignof(FRHIResource*));
FMemory::ParallelMemcpy(DstContents, Contents, Layout.ConstantBufferSize, EMemcpyCachePolicy::StoreUncached);
SrcContents = DstContents;
}
RHICmdList.EnqueueLambda([UniformBuffer, SrcContents](FRHICommandListBase& RHICmdList)
{
UniformBuffer->Update(SrcContents);
});
RHICmdList.RHIThreadFence(true);
}