Files
UnrealEngine/Engine/Source/Runtime/D3D12RHI/Private/D3D12ConstantBuffer.h
2025-05-18 13:04:45 +08:00

77 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "D3D12RHICommon.h"
#if D3D12RHI_USE_CONSTANT_BUFFER_VIEWS
#include "D3D12View.h"
#endif
class FD3D12FastConstantAllocator;
class FD3D12ResourceLocation;
// Chunk size for global constant buffer shadow data. Should always be a multiple of 256
#define GLOBAL_CONSTANT_BUFFER_CHUNK_SIZE 512
/**
* A D3D constant buffer
*/
class FD3D12ConstantBuffer : public FD3D12DeviceChild
{
public:
FD3D12ConstantBuffer(FD3D12Device* InParent, FD3D12FastConstantAllocator& InAllocator);
virtual ~FD3D12ConstantBuffer();
/**
* Updates a variable in the constant buffer.
* @param Data - The data to copy into the constant buffer
* @param Offset - The offset in the constant buffer to place the data at
* @param InSize - The size of the data being copied
*/
FORCEINLINE_DEBUGGABLE void UpdateConstant(const uint8* Data, uint16 Offset, uint16 InSize)
{
// Make sure we have enough memory in our shadow data
const uint32 RequiredSize = (uint32)Offset + (uint32)InSize;
if ((uint32)ShadowData.Num() < RequiredSize)
{
// Make sure we grow in chunks to prevent too many reallocs
const uint32 SizeToGrowTo = Align(RequiredSize, GLOBAL_CONSTANT_BUFFER_CHUNK_SIZE);
ShadowData.SetNumZeroed(SizeToGrowTo);
}
FMemory::Memcpy(ShadowData.GetData() + Offset, Data, InSize);
CurrentUpdateSize = FMath::Max(RequiredSize, CurrentUpdateSize);
bIsDirty = true;
}
FORCEINLINE void Reset() { CurrentUpdateSize = 0; }
bool Version(FD3D12ResourceLocation& BufferOut, bool bDiscardSharedConstants);
#if D3D12RHI_USE_CONSTANT_BUFFER_VIEWS
inline D3D12_CPU_DESCRIPTOR_HANDLE GetOfflineCpuHandle() const { return View->GetOfflineCpuHandle(); }
#endif
protected:
#if D3D12RHI_USE_CONSTANT_BUFFER_VIEWS
FD3D12ConstantBufferView* View = nullptr;
#endif
TArray<uint8> ShadowData;
/** Size of all constants that has been updated since the last call to Commit. */
uint32 CurrentUpdateSize;
/**
* Size of all constants that has been updated since the last Discard.
* Includes "shared" constants that don't necessarily gets updated between every Commit.
*/
uint32 TotalUpdateSize;
// Indicates that a constant has been updated but this one hasn't been flushed.
bool bIsDirty;
FD3D12FastConstantAllocator& Allocator;
};