// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "RHICommandList.h" #include "RHIResources.h" #include "Containers/ResourceArray.h" namespace UE::RHIResourceUtils { static FBufferRHIRef CreateBufferZeroed(FRHICommandListBase& RHICmdList, const FRHIBufferCreateDesc& Desc) { return RHICmdList.CreateBuffer(FRHIBufferCreateDesc(Desc).SetInitActionZeroData()); } template static FBufferRHIRef CreateBufferWithArray(FRHICommandListBase& RHICmdList, const FRHIBufferCreateDesc& Desc, TConstArrayView Array) { FResourceArrayUploadArrayView UploadView(Array); return RHICmdList.CreateBuffer(FRHIBufferCreateDesc(Desc).SetInitActionResourceArray(&UploadView)); } template static FBufferRHIRef CreateBufferWithArray(FRHICommandListBase& RHICmdList, const FRHIBufferCreateDesc& Desc, const TArray& Array) { return CreateBufferWithArray(RHICmdList, Desc, TConstArrayView(Array)); } template static FBufferRHIRef CreateBufferWithArray(FRHICommandListBase& RHICmdList, const FRHIBufferCreateDesc& Desc, const TElementType (&Array)[TCount]) { return CreateBufferWithArray(RHICmdList, Desc, TConstArrayView(Array, TCount)); } template static FBufferRHIRef CreateBufferWithValue(FRHICommandListBase& RHICmdList, const FRHIBufferCreateDesc& Desc, const TElementType& Value) { return CreateBufferWithArray(RHICmdList, Desc, TConstArrayView(&Value, 1)); } static FBufferRHIRef CreateBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, EBufferUsageFlags UsageFlags, uint32 InStride, const void* InData, uint32 InSizeInBytes) { FResourceArrayUploadArrayView UploadView(InData, InSizeInBytes); const FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::Create(Name, InSizeInBytes, InStride, UsageFlags) .DetermineInitialState() .SetInitActionResourceArray(&UploadView); return RHICmdList.CreateBuffer(CreateDesc); } template static FBufferRHIRef CreateBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, EBufferUsageFlags UsageFlags, uint32 InStride, ERHIAccess InitialState, TConstArrayView Array) { FResourceArrayUploadArrayView UploadView(Array); const FRHIBufferCreateDesc CreateDesc = FRHIBufferCreateDesc::Create(Name, UploadView.GetResourceDataSize(), InStride, UsageFlags) .SetInitialState(InitialState) .SetInitActionResourceArray(&UploadView); return RHICmdList.CreateBuffer(CreateDesc); } template static FBufferRHIRef CreateBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, EBufferUsageFlags UsageFlags, ERHIAccess InitialState, TConstArrayView Array) { return CreateBufferFromArray(RHICmdList, Name, UsageFlags, Array.GetTypeSize(), InitialState, Array); } template static FBufferRHIRef CreateBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, EBufferUsageFlags UsageFlags, TConstArrayView Array) { return CreateBufferFromArray(RHICmdList, Name, UsageFlags, RHIGetDefaultResourceState(UsageFlags, false), Array); } template static FBufferRHIRef CreateVertexBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, EBufferUsageFlags ExtraFlags, TConstArrayView Array) { const EBufferUsageFlags Usage = EBufferUsageFlags::VertexBuffer | ExtraFlags; const ERHIAccess InitialState = RHIGetDefaultResourceState(Usage, false); return CreateBufferFromArray(RHICmdList, Name, Usage, 0, InitialState, Array); } template static FBufferRHIRef CreateVertexBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, TConstArrayView Array) { return CreateVertexBufferFromArray(RHICmdList, Name, EBufferUsageFlags::None, Array); } template static FBufferRHIRef CreateIndexBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, EBufferUsageFlags ExtraFlags, TConstArrayView Array) { const EBufferUsageFlags Usage = EBufferUsageFlags::IndexBuffer | ExtraFlags; const ERHIAccess InitialState = RHIGetDefaultResourceState(Usage, false); return CreateBufferFromArray(RHICmdList, Name, Usage, InitialState, Array); } template static FBufferRHIRef CreateIndexBufferFromArray(FRHICommandListBase& RHICmdList, const TCHAR* Name, TConstArrayView Array) { return CreateIndexBufferFromArray(RHICmdList, Name, EBufferUsageFlags::None, Array); } }