UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHICoreResourceCollection.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "RHIResources.h"
7#include "RHICommandList.h"
8#include "DynamicRHI.h"
10
11#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
12
13namespace UE::RHICore
14{
15 template<typename TType>
17 {
18 return (1 + InValues.Num()) * sizeof(uint32);
19 }
20
22 {
23 switch (Member.Type)
24 {
26 return static_cast<const FRHITexture*>(Member.Resource)->GetDefaultBindlessHandle();
28 return static_cast<const FRHITextureReference*>(Member.Resource)->GetBindlessHandle();
30 return static_cast<const FRHIShaderResourceView*>(Member.Resource)->GetBindlessHandle();
31 }
32
33 return FRHIDescriptorHandle();
34 }
35
37 {
38 return Handle;
39 }
40
42 {
43 int32 WriteIndex = 0;
44
46 {
48 check(Handle.IsValid());
49
50 const uint32 BindlessIndex = Handle.IsValid() ? Handle.GetIndex() : 0;
51
52 Destination[WriteIndex] = BindlessIndex;
53 ++WriteIndex;
54 }
55 }
56
58 {
59 Destination[0] = static_cast<uint32>(InValues.Num());
60
62 }
63
65 {
67 }
68
70 {
71 const size_t BufferSize = UE::RHICore::CalculateResourceCollectionMemorySize(InMembers);
72
73 const FRHIBufferCreateDesc CreateDesc =
74 FRHIBufferCreateDesc::CreateByteAddress(TEXT("ResourceCollection"), BufferSize, sizeof(uint32))
78
80 UE::RHICore::FillResourceCollectionMemory(Initializer, InMembers);
81
82 return Initializer.Finalize();
83 }
84
86 {
87 public:
91 {
93 ShaderResourceView = RHICmdList.CreateShaderResourceView(Buffer, ViewDesc);
94 }
95
97
98 // FRHIResourceCollection
99 virtual FRHIDescriptorHandle GetBindlessHandle() const final
100 {
101 return ShaderResourceView->GetBindlessHandle();
102 }
103 //~FRHIResourceCollection
104
105 FRHIShaderResourceView* GetShaderResourceView() const
106 {
107 return ShaderResourceView;
108 }
109
111 TRefCountPtr<FRHIShaderResourceView> ShaderResourceView;
112 };
113
115 {
116 return new FGenericResourceCollection(RHICmdList, InMembers);
117 }
118
120 {
121 const uint32 CollectionSize = ResourceCollection->GetMembers().Num();
122 if (StartIndex >= CollectionSize)
123 {
124 // Invalid start index
125 return {};
126 }
127
128 const int32 UpdateCount = FMath::Min<int32>(InUpdates.Num(), CollectionSize - StartIndex);
129 return InUpdates.Left(UpdateCount);
130 }
131
133 {
134 TConstArrayView<FRHIResourceCollectionMember> MemberUpdates = UE::RHICore::GetValidResourceCollectionUpdateList(ResourceCollection, StartIndex, InMemberUpdates);
135 if (!MemberUpdates.IsEmpty())
136 {
137 // We can't reliably lock with offsets, so we will have to update the entire resource.
138
139 ResourceCollection->UpdateMembers(StartIndex, MemberUpdates);
141
142 const uint32 UploadSize = UE::RHICore::CalculateResourceCollectionMemorySize(Members);
143 uint32* UploadData = reinterpret_cast<uint32*>(RHICmdList.LockBuffer(ResourceCollection->Buffer, 0, UploadSize, RLM_WriteOnly));
144
145 UE::RHICore::FillResourceCollectionMemory(UploadData, Members);
146
147 RHICmdList.UnlockBuffer(ResourceCollection->Buffer);
148 }
149 }
150}
151
152#endif // PLATFORM_SUPPORTS_BINDLESS_RENDERING
#define check(expr)
Definition AssertionMacros.h:314
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ RLM_WriteOnly
Definition RHIDefinitions.h:787
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition RHIResources.h:1581
Definition RHICommandList.h:455
void * LockBuffer(FRHIBuffer *Buffer, uint32 Offset, uint32 SizeRHI, EResourceLockMode LockMode)
Definition RHICommandList.h:747
void UnlockBuffer(FRHIBuffer *Buffer)
Definition RHICommandList.h:755
FRHIBufferInitializer CreateBufferInitializer(const FRHIBufferCreateDesc &CreateDesc)
Definition RHICommandList.h:792
FShaderResourceViewRHIRef CreateShaderResourceView(FRHIBuffer *Buffer, FRHIViewDesc::FBufferSRV::FInitializer const &ViewDesc)
Definition RHICommandList.h:975
Definition RHIResourceCollection.h:46
Definition RHIResources.h:3304
Definition RHITextureReference.h:8
Definition RHIResources.h:2153
Definition RefCounting.h:454
@ Member
Definition AssetDataTagMap.cpp:938
Definition RHIResources.h:819
Definition RHIResources.h:1417
FRHIBufferCreateDesc & SetInitActionInitializer()
Definition RHIResources.h:1542
FRHIBufferCreateDesc & SetInitialState(ERHIAccess InInitialState)
Definition RHIResources.h:1528
static FRHIBufferCreateDesc CreateByteAddress(const TCHAR *InDebugName)
Definition RHIResources.h:1486
FRHIBufferCreateDesc & AddUsage(EBufferUsageFlags InUsage)
Definition RHIResources.h:1524
Definition RHIDefinitions.h:1401
Definition RHIResourceCollection.h:9
Definition RHIResources.h:2812
FInitializer & SetType(EBufferType Type)
Definition RHIResources.h:2824
static FBufferSRV::FInitializer CreateBufferSRV()
Definition RHIResources.h:3124
Definition RHIBufferInitializer.h:110
ElementType * GetWritableData()
Definition RHIBufferInitializer.h:121