UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RenderGraphUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
9#include "HAL/UnrealMemory.h"
10#include "Math/Color.h"
11#include "Math/IntPoint.h"
12#include "Math/IntRect.h"
13#include "Math/IntVector.h"
14#include "Math/UnrealMathSSE.h"
15#include "Math/Vector2D.h"
16#include "Math/Vector4.h"
18#include "Misc/EnumClassFlags.h"
19#include "Misc/Optional.h"
20#include "RHI.h"
21#include "RHICommandList.h"
22#include "RHIDefinitions.h"
24#include "RenderGraphBuilder.h"
26#include "RenderGraphEvent.h"
28#include "RendererInterface.h"
29#include "Shader.h"
32#include "Stats/Stats.h"
33#include "Templates/Function.h"
34#include "Templates/Invoke.h"
38#include "PipelineStateCache.h"
39
40#include <initializer_list>
41
46
47// Callback to modify pass parameters just prior to dispatch, used for indirect dispatches where the group count callback cannot be used for this purpose.
49
52{
53 return Resource && Resource->HasBeenProduced();
54}
55
61
67
73
79
82{
83 return Texture ? Texture->GetRHI() : nullptr;
84}
85
87{
88 return Buffer ? Buffer->GetRHI() : nullptr;
89}
90
92{
93 return Buffer ? Buffer->GetRHI() : nullptr;
94}
95
97{
98 return Buffer ? Buffer->GetSRV() : 0;
99}
100
102{
103 return Buffer ? Buffer->GetSize() : 0;
104}
105
107{
108 return Buffer ? Buffer->GetSize() : 0;
109}
110
112{
113 return GraphBuilder.FindExternalTexture(RenderTarget) != nullptr;
114}
115
117{
118 return GraphBuilder.FindExternalBuffer(Buffer) != nullptr;
119}
120
133
174
182 const FShaderParameterBindings& ShaderBindings,
184 void* InoutParameters,
185 std::initializer_list<FRDGResourceRef> ExcludeList);
186
191 void* InoutParameters,
192 std::initializer_list<FRDGResourceRef> ExcludeList);
193
194template <typename TShaderClass>
198 typename TShaderClass::FParameters* InoutParameters,
199 std::initializer_list<FRDGResourceRef> ExcludeList = {})
200{
201 // Verify the shader have all the parameters it needs. This is done before the
202 // ClearUnusedGraphResourcesImpl() to not mislead user on why some resource are missing
203 // when debugging a validation failure.
205
206 // Clear the resources the shader won't need.
208}
209
210template <typename TShaderClass>
213 typename TShaderClass::FParameters* InoutParameters,
214 std::initializer_list<FRDGResourceRef> ExcludeList = {})
215{
216 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
218}
219
220template <typename TShaderClassA, typename TShaderClassB, typename TPassParameterStruct>
225 std::initializer_list<FRDGResourceRef> ExcludeList = {})
226{
227 static_assert(std::is_same_v<typename TShaderClassA::FParameters, TPassParameterStruct>, "First shader FParameter type must match pass parameters.");
228 static_assert(std::is_same_v<typename TShaderClassB::FParameters, TPassParameterStruct>, "Second shader FParameter type must match pass parameters.");
229 const FShaderParametersMetadata* ParametersMetadata = TPassParameterStruct::FTypeInfo::GetStructMetadata();
230
231 // Verify the shader have all the parameters it needs. This is done before the
232 // ClearUnusedGraphResourcesImpl() to not mislead user on why some resource are missing
233 // when debugging a validation failure.
236
237 // Clear the resources the shader won't need.
238 const FShaderParameterBindings* ShaderBindings[] = { &ShaderA->Bindings, &ShaderB->Bindings };
240}
241
249 FRDGBuilder& GraphBuilder,
252
261
270
280
285
288{
289 FRDGTextureMSAA() = default;
290
295
300
301 bool IsValid() const
302 {
303 return Target != nullptr && Resolve != nullptr;
304 }
305
306 bool IsSeparate() const
307 {
308 return Target != Resolve;
309 }
310
312 {
313 return Target == Other.Target && Resolve == Other.Resolve;
314 }
315
317 {
318 return !(*this == Other);
319 }
320
323};
324
326 FRDGBuilder& GraphBuilder,
327 FRDGTextureDesc Desc,
330
331UE_DEPRECATED(5.3, "CreateTextureMSAA with one name is deprecated, prease provide separate name for the multisampled texture")
340
344{
346 static constexpr int32 kGolden2DGroupSize = 8;
347
349 inline FIntVector GetGroupCount(const int32 ThreadCount, const int32 GroupSize)
350 {
351 return FIntVector(
352 FMath::DivideAndRoundUp(ThreadCount, GroupSize),
353 1,
354 1);
355 }
356 inline FIntVector GetGroupCount(const FIntPoint& ThreadCount, const FIntPoint& GroupSize)
357 {
358 return FIntVector(
359 FMath::DivideAndRoundUp(ThreadCount.X, GroupSize.X),
360 FMath::DivideAndRoundUp(ThreadCount.Y, GroupSize.Y),
361 1);
362 }
363 inline FIntVector GetGroupCount(const FIntPoint& ThreadCount, const int32 GroupSize)
364 {
365 return FIntVector(
366 FMath::DivideAndRoundUp(ThreadCount.X, GroupSize),
367 FMath::DivideAndRoundUp(ThreadCount.Y, GroupSize),
368 1);
369 }
370 inline FIntVector GetGroupCount(const FIntVector& ThreadCount, const FIntVector& GroupSize)
371 {
372 return FIntVector(
373 FMath::DivideAndRoundUp(ThreadCount.X, GroupSize.X),
374 FMath::DivideAndRoundUp(ThreadCount.Y, GroupSize.Y),
375 FMath::DivideAndRoundUp(ThreadCount.Z, GroupSize.Z));
376 }
377 inline FIntVector GetGroupCount(const FIntVector& ThreadCount, const int32 GroupSize)
378 {
379 return FIntVector(
380 FMath::DivideAndRoundUp(ThreadCount.X, GroupSize),
381 FMath::DivideAndRoundUp(ThreadCount.Y, GroupSize),
382 FMath::DivideAndRoundUp(ThreadCount.Z, GroupSize));
383 }
384
390 static constexpr int32 WrappedGroupStride = 128;
391
399 {
400 check(GRHIMaxDispatchThreadGroupsPerDimension.X >= WrappedGroupStride && GRHIMaxDispatchThreadGroupsPerDimension.Y >= WrappedGroupStride);
401
403
405 {
406 GroupCount.Y = FMath::DivideAndRoundUp(GroupCount.X, WrappedGroupStride);
407 GroupCount.X = WrappedGroupStride;
408 }
410 {
411 GroupCount.Z = FMath::DivideAndRoundUp(GroupCount.Y, WrappedGroupStride);
412 GroupCount.Y = WrappedGroupStride;
413 }
414
416
417 return GroupCount;
418 }
419
426 inline FIntVector GetGroupCountWrapped(const int32 ThreadCount, const int32 GroupSize)
427 {
428 return GetGroupCountWrapped(FMath::DivideAndRoundUp(ThreadCount, GroupSize));
429 }
430
437
439 {
441 checkf((IndirectArgOffset % 4) == 0, TEXT("IndirectArgOffset for compute shader indirect dispatch needs to be a multiple of 4."));
442 checkf(
444 TEXT("Indirect parameters buffer for compute shader indirect dispatch at byte offset %d doesn't have enough room for one element."),
446#if PLATFORM_DISPATCH_INDIRECT_ARGUMENT_BOUNDARY_SIZE != 0
448#endif // #if PLATFORM_DISPATCH_INDIRECT_ARGUMENT_BOUNDARY_SIZE != 0
449 }
450
452 {
453 checkf(EnumHasAnyFlags(IndirectArgsBuffer->Desc.Usage, EBufferUsageFlags::VertexBuffer | EBufferUsageFlags::ByteAddressBuffer), TEXT("The buffer %s needs to be a vertex or byte address buffer to be used as an indirect dispatch parameters"), IndirectArgsBuffer->Name);
454 checkf(EnumHasAnyFlags(IndirectArgsBuffer->Desc.Usage, EBufferUsageFlags::DrawIndirect), TEXT("The buffer %s for indirect dispatch parameters was not flagged with BUF_DrawIndirect"), IndirectArgsBuffer->Name);
456 }
457
458 namespace Private
459 {
460 template<typename TShaderClass>
461 inline void PrepareDispatch(
462 FRHIComputeCommandList& RHICmdList,
465 const typename TShaderClass::FParameters& Parameters)
466 {
467 FRHIComputeShader* ShaderRHI = ComputeShader.GetComputeShader();
470 }
471
472 template<typename TShaderClass>
473 inline void PrepareDispatch(
474 FRHIComputeCommandList& RHICmdList,
476 const typename TShaderClass::FParameters& Parameters)
477 {
478 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
479 PrepareDispatch(RHICmdList, ComputeShader, ParametersMetadata, Parameters);
480 }
481
482 template<typename TShaderClass>
484 {
485 UnsetShaderUAVs(RHICmdList, ComputeShader, ComputeShader.GetComputeShader());
486 }
487 }
488
490 template<typename TShaderClass>
491 inline void Dispatch(
492 FRHIComputeCommandList& RHICmdList,
495 const typename TShaderClass::FParameters& Parameters,
497 {
499
503 }
504
505 template<typename TShaderClass>
506 inline void Dispatch(
507 FRHIComputeCommandList& RHICmdList,
509 const typename TShaderClass::FParameters& Parameters,
511 {
512 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
513 Dispatch(RHICmdList, ComputeShader, ParametersMetadata, Parameters, GroupCount);
514 }
515
517 template<typename TShaderClass>
518 inline void DispatchIndirect(
519 FRHIComputeCommandList& RHICmdList,
521 const typename TShaderClass::FParameters& Parameters,
522 FRHIBuffer* IndirectArgsBuffer,
524 {
526
527 Private::PrepareDispatch(RHICmdList, ComputeShader, Parameters);
528 RHICmdList.DispatchIndirectComputeShader(IndirectArgsBuffer, IndirectArgOffset);
530 }
531
533 template<typename TShaderClass>
534 inline void DispatchIndirect(
535 FRHIComputeCommandList& RHICmdList,
537 const typename TShaderClass::FParameters& Parameters,
538 FRDGBufferRef IndirectArgsBuffer,
540 {
542
543 Private::PrepareDispatch(RHICmdList, ComputeShader, Parameters);
546 }
547
549 template<typename TShaderClass>
551 FRDGBuilder& GraphBuilder,
552 FRDGEventName&& PassName,
556 typename TShaderClass::FParameters* Parameters,
558 {
559 checkf(
561 !EnumHasAnyFlags(PassFlags, ERDGPassFlags::Copy | ERDGPassFlags::Raster), TEXT("AddPass only supports 'Compute' or 'AsyncCompute'."));
562
565
566 return GraphBuilder.AddPass(
567 Forward<FRDGEventName>(PassName),
569 Parameters,
570 PassFlags,
572 {
574 });
575 }
576
580 template<typename TShaderClass>
582 FRDGBuilder& GraphBuilder,
583 FRDGEventName&& PassName,
587 typename TShaderClass::FParameters* Parameters,
589 {
590 checkf(
592 !EnumHasAnyFlags(PassFlags, ERDGPassFlags::Copy | ERDGPassFlags::Raster), TEXT("AddPass only supports 'Compute' or 'AsyncCompute'."));
593
595
596 return GraphBuilder.AddPass(
597 Forward<FRDGEventName>(PassName),
599 Parameters,
600 PassFlags,
602 {
604 if (GroupCount.X > 0 && GroupCount.Y > 0 && GroupCount.Z > 0)
605 {
608 }
609 });
610 }
611
612 template<typename TShaderClass>
614 FRDGBuilder& GraphBuilder,
615 FRDGEventName&& PassName,
618 typename TShaderClass::FParameters* Parameters,
620 {
621 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
622 return AddPass(GraphBuilder, Forward<FRDGEventName>(PassName), PassFlags, ComputeShader, ParametersMetadata, Parameters, GroupCount);
623 }
624
625 template <typename TShaderClass>
627 FRDGBuilder& GraphBuilder,
628 FRDGEventName&& PassName,
630 typename TShaderClass::FParameters* Parameters,
632 {
633 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
635 }
636
637 template <typename TShaderClass>
639 FRDGBuilder& GraphBuilder,
640 FRDGEventName&& PassName,
642 typename TShaderClass::FParameters* Parameters,
644 {
645 const FShaderParametersMetadata* ParametersMetadata = TShaderClass::FParameters::FTypeInfo::GetStructMetadata();
647 }
648
650 template<typename TShaderClass>
652 FRDGBuilder& GraphBuilder,
653 FRDGEventName&& PassName,
656 typename TShaderClass::FParameters* Parameters,
657 FRDGBufferRef IndirectArgsBuffer,
658 uint32 IndirectArgsOffset,
660 {
661 checkf(PassFlags == ERDGPassFlags::Compute || PassFlags == ERDGPassFlags::AsyncCompute, TEXT("AddPass only supports 'Compute' or 'AsyncCompute'."));
662 checkf(IndirectArgsBuffer->Desc.Usage & BUF_DrawIndirect, TEXT("The buffer %s was not flagged for indirect draw parameters"), IndirectArgsBuffer->Name);
663
664 ValidateIndirectArgsBuffer(IndirectArgsBuffer, IndirectArgsOffset);
665 ClearUnusedGraphResources(ComputeShader, Parameters, { IndirectArgsBuffer });
666
667 return GraphBuilder.AddPass(
668 Forward<FRDGEventName>(PassName),
669 Parameters,
670 PassFlags,
671 [Parameters, ComputeShader, IndirectArgsBuffer, IndirectArgsOffset, DispatchLateParamCallback = MoveTemp(DispatchLateParamCallback)](FRDGAsyncTask, FRHIComputeCommandList& RHICmdList)
672 {
673 // Marks the indirect draw parameter as used by the pass manually, given it can't be bound directly by any of the shader,
674 // meaning SetShaderParameters() won't be able to do it.
675 IndirectArgsBuffer->MarkResourceAsUsed();
676
678 {
680 }
681 FComputeShaderUtils::DispatchIndirect(RHICmdList, ComputeShader, *Parameters, IndirectArgsBuffer->GetIndirectRHICallBuffer(), IndirectArgsOffset);
682 });
683 }
684
685 template<typename TShaderClass>
687 FRDGBuilder& GraphBuilder,
688 FRDGEventName&& PassName,
690 typename TShaderClass::FParameters* Parameters,
691 FRDGBufferRef IndirectArgsBuffer,
692 uint32 IndirectArgsOffset,
694 {
695 return AddPass(GraphBuilder, Forward<FRDGEventName>(PassName), ERDGPassFlags::Compute, ComputeShader, Parameters, IndirectArgsBuffer, IndirectArgsOffset, MoveTemp(DispatchLateParamCallback));
696 }
697
704};
705
710 FRDGBuilder& GraphBuilder,
711 FRDGTextureRef InputTexture,
712 FRDGTextureRef OutputTexture,
714
722 FRDGBuilder& GraphBuilder,
723 FRDGTextureRef InputTexture,
724 FRDGTextureRef OutputTexture,
728{
731 CopyInfo.SourcePosition.Y = InputPosition.Y;
732 CopyInfo.DestPosition.X = OutputPosition.X;
733 CopyInfo.DestPosition.Y = OutputPosition.Y;
735 {
736 CopyInfo.Size = FIntVector(Size.X, Size.Y, 1);
737 }
738 AddCopyTexturePass(GraphBuilder, InputTexture, OutputTexture, CopyInfo);
739}
740
742{
743 // Number of texels to copy. By default it will copy the whole resource if no size is specified.
745
746 // Position of the copy from the source texture/to destination texture
749
753
754 // Mips to copy and destination mips
758};
759
761 FRDGBuilder& GraphBuilder,
762 const FGlobalShaderMap* ShaderMap,
763 FRDGTextureRef InputTexture,
764 FRDGTextureRef OutputTexture,
766
769
771
772RENDERCORE_API void AddClearUAVPass(FRDGBuilder& GraphBuilder, FRDGTextureUAVRef TextureUAV, float ClearValue, ERDGPassFlags ComputePassFlags = ERDGPassFlags::Compute);
773
775
777
779
781
783
785
786RENDERCORE_API void AddClearUAVPass(FRDGBuilder& GraphBuilder, FRDGTextureUAVRef TextureUAV, const float(&ClearValues)[4], ERDGPassFlags ComputePassFlags = ERDGPassFlags::Compute);
787
788RENDERCORE_API void AddClearUAVPass(FRDGBuilder& GraphBuilder, FRDGTextureUAVRef TextureUAV, const uint32(&ClearValues)[4], ERDGPassFlags ComputePassFlags = ERDGPassFlags::Compute);
789
791
794
797
800
802RENDERCORE_API void AddClearRenderTargetPass(FRDGBuilder& GraphBuilder, FRDGTextureRef Texture, const FLinearColor& ClearColor, FIntRect Viewport);
803
805{
807
808 // Optional : specifies the area of the texture to clear (draws a quad to the requested viewport). If zero (and clear color is not passed or matches the fast clear color), the clear will be done with render pass clear actions :
810
811 // Optional : specifies the clear color. If not specified or if the clear color matches the fast clear color (and Viewport is zero), the clear will be done with render pass clear actions :
813
814 // For texture arrays, specifies which slice(s) to clear
817
818 // Specifies which mip(s) to clear
821};
822
825
828 FRDGBuilder& GraphBuilder,
830 bool bClearDepth,
831 float Depth,
832 bool bClearStencil,
833 uint8 Stencil);
834
837 FRDGBuilder& GraphBuilder,
841
844
846RENDERCORE_API void AddResummarizeHTilePass(FRDGBuilder& GraphBuilder, FRDGTextureRef DepthTexture);
847
849RENDERCORE_API void AddCopyBufferPass(FRDGBuilder& GraphBuilder, FRDGBufferRef DstBuffer, uint64 DstOffset, FRDGBufferRef SrcBuffer, uint64 SrcOffset, uint64 NumBytes);
850
852
855
858
862template<typename InElementType>
863struct FRDGUploadData : public TArrayView<InElementType, int32>
864{
865 FRDGUploadData() = delete;
867 : TArrayView<InElementType, int32>(GraphBuilder.AllocPODArray<InElementType>(InCount), InCount)
868 {
869 }
870
871 inline int32 GetTotalSize() const { return this->Num() * this->GetTypeSize(); }
872};
873
876 FRDGBuilder& GraphBuilder,
877 const TCHAR* Name,
878 uint32 BytesPerElement,
879 uint32 NumElements,
880 const void* InitialData,
883
889 FRDGBuilder& GraphBuilder,
890 const TCHAR* Name,
891 uint32 BytesPerElement,
892 FRDGBufferNumElementsCallback&& NumElementsCallback,
895
899template <typename ElementType, typename AllocatorType>
901 FRDGBuilder& GraphBuilder,
902 const TCHAR* Name,
903 const TArray<ElementType, AllocatorType>& InitialData,
905{
906 static const ElementType DummyElement = ElementType();
907 if (InitialData.Num() == 0)
908 {
909 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), 1, &DummyElement, InitialData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
910 }
911 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), InitialData.Num(), InitialData.GetData(), InitialData.Num() * InitialData.GetTypeSize(), InitialDataFlags);
912}
913
917template <typename ElementType, typename AllocatorType>
919 FRDGBuilder& GraphBuilder,
920 const TCHAR* Name,
922{
923 static const ElementType DummyElement = ElementType();
924 if (InitialData.Num() == 0)
925 {
926 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), 1, &DummyElement, InitialData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
927 }
928
929 // Create a move-initialized copy of the TArray with RDG lifetime & move the data there.
931 return CreateStructuredBuffer(GraphBuilder, Name, UploadData.GetTypeSize(), UploadData.Num(), UploadData.GetData(), UploadData.Num() * UploadData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
932}
933
937template <typename ElementType>
939 FRDGBuilder& GraphBuilder,
940 const TCHAR* Name,
943{
944 static const ElementType DummyElement = ElementType();
945 if (InitialData.Num() == 0)
946 {
947 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), 1, &DummyElement, InitialData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
948 }
949 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), InitialData.Num(), InitialData.GetData(), InitialData.Num() * InitialData.GetTypeSize(), InitialDataFlags);
950}
951
956template <typename ArrayType>
958 FRDGBuilder& GraphBuilder,
959 const TCHAR* Name,
961{
962 return CreateStructuredBuffer(GraphBuilder, Name, sizeof(typename std::remove_reference_t<ArrayType>::ElementType),
963 /*NumElementsCallback = */[ArrayCallback]() { return ArrayCallback().Num(); },
964 /*InitialDataCallback = */[ArrayCallback]() { return ArrayCallback().GetData(); },
965 /*InitialDataSizeCallback = */[ArrayCallback]() { return ArrayCallback().Num() * ArrayCallback().GetTypeSize(); });
966}
967
972template <typename GetArrayRefCallback, typename Type = TInvokeResult_T<GetArrayRefCallback>>
980
981template <typename ElementType>
983 FRDGBuilder& GraphBuilder,
984 const TCHAR* Name,
985 const FRDGUploadData<ElementType>& InitialData)
986{
987 static const ElementType DummyElement = ElementType();
988 if (InitialData.Num() == 0)
989 {
990 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), 1, &DummyElement, InitialData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
991 }
992 return CreateStructuredBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), InitialData.Num(), InitialData.GetData(), InitialData.GetTotalSize(), ERDGInitialDataFlags::NoCopy);
993}
994
997 FRDGBuilder& GraphBuilder,
998 const TCHAR* Name,
999 uint32 NumBytes,
1000 const void* InitialData,
1003
1009 FRDGBuilder& GraphBuilder,
1010 const TCHAR* Name,
1011 FRDGBufferNumElementsCallback&& NumElementsCallback,
1014
1018template <typename ElementType, typename AllocatorType>
1020 FRDGBuilder& GraphBuilder,
1021 const TCHAR* Name,
1023{
1024 static const uint32 DummyElement = 0;
1025 if (InitialData.Num() == 0)
1026 {
1028 }
1029
1030 // Create a move-initialized copy of the TArray with RDG lifetime & move the data there.
1032 return CreateByteAddressBuffer(GraphBuilder, Name, UploadData.Num() * UploadData.GetTypeSize(), UploadData.GetData(), UploadData.Num() * UploadData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
1033}
1034
1038template <typename ElementType>
1040 FRDGBuilder& GraphBuilder,
1041 const TCHAR* Name,
1042 TConstArrayView<ElementType> InitialData,
1044{
1045 static const ElementType DummyElement = ElementType();
1046 if (InitialData.Num() == 0)
1047 {
1048 return CreateByteAddressBuffer(GraphBuilder, Name, InitialData.GetTypeSize(), &DummyElement, InitialData.GetTypeSize(), ERDGInitialDataFlags::NoCopy);
1049 }
1050 return CreateByteAddressBuffer(GraphBuilder, Name, InitialData.Num() * InitialData.GetTypeSize(), InitialData.GetData(), InitialData.Num() * InitialData.GetTypeSize(), InitialDataFlags);
1051}
1052
1057template <typename ArrayType>
1059 FRDGBuilder& GraphBuilder,
1060 const TCHAR* Name,
1062{
1063 return CreateByteAddressBuffer(GraphBuilder, Name,
1064 /*NumElementsCallback = */[ArrayCallback]() { const auto& Array = ArrayCallback(); return Array.Num() * Array.GetTypeSize() / 4; },
1065 /*InitialDataCallback = */[ArrayCallback]() { return ArrayCallback().GetData(); },
1066 /*InitialDataSizeCallback = */[ArrayCallback]() { const auto& Array = ArrayCallback(); return Array.Num() * Array.GetTypeSize(); });
1067}
1068
1073template <typename GetArrayRefCallback, typename Type = TInvokeResult_T<GetArrayRefCallback>>
1075 FRDGBuilder& GraphBuilder,
1076 const TCHAR* Name,
1078{
1080}
1081
1082template <typename ElementType>
1084 FRDGBuilder& GraphBuilder,
1085 const TCHAR* Name,
1086 const FRDGUploadData<ElementType>& InitialData)
1087{
1088 static const uint32 DummyElement = 0;
1089 if (InitialData.Num() == 0)
1090 {
1092 }
1093 return CreateByteAddressBuffer(GraphBuilder, Name, InitialData.Num() * InitialData.GetTypeSize(), InitialData.GetData(), InitialData.GetTotalSize(), ERDGInitialDataFlags::NoCopy);
1094}
1095
1097 FRDGBuilder& GraphBuilder,
1098 const TCHAR* Name,
1099 uint32 BytesPerElement,
1100 uint32 NumElements,
1101 const void* InitialData,
1104
1105template <typename ElementType>
1107 FRDGBuilder& GraphBuilder,
1108 const TCHAR* Name,
1109 uint32 BytesPerElement,
1110 uint32 NumElements,
1111 const FRDGUploadData<ElementType>& InitialData)
1112{
1113 return CreateUploadBuffer(GraphBuilder, Name, BytesPerElement, NumElements, InitialData.GetData(), InitialData.GetTotalSize(), ERDGInitialDataFlags::NoCopy);
1114}
1115
1116template <typename ElementType>
1118 FRDGBuilder& GraphBuilder,
1119 const TCHAR* Name,
1120 const FRDGUploadData<ElementType>& InitialData)
1121{
1122 return CreateUploadBuffer(GraphBuilder, Name, sizeof(ElementType), InitialData.Num(), InitialData);
1123}
1124
1125template <typename ElementType>
1127 FRDGBuilder& GraphBuilder,
1128 const TCHAR* Name,
1129 TConstArrayView<ElementType> InitialData,
1131{
1132 static const uint32 DummyElement = 0;
1133 if (InitialData.Num() == 0)
1134 {
1135 return CreateUploadBuffer(GraphBuilder, Name, 4, 1, &DummyElement, 4, ERDGInitialDataFlags::NoCopy);
1136 }
1137 return CreateUploadBuffer(GraphBuilder, Name, sizeof(ElementType), InitialData.Num(), InitialData.GetData(), sizeof(ElementType) * InitialData.Num(), InitialDataFlags);
1138}
1139
1144template <typename ElementType, typename AllocatorType>
1146 FRDGBuilder& GraphBuilder,
1147 const TCHAR* Name,
1148 const TArray<ElementType, AllocatorType> &InitialData,
1150{
1151 FRDGBufferRef Buffer = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateStructuredUploadDesc(sizeof(ElementType), InitialData.Num()), Name);
1153 return Buffer;
1154}
1155
1160template <typename ElementType, typename AllocatorType>
1162 FRDGBuilder& GraphBuilder,
1163 const TCHAR* Name,
1164 const TArray<ElementType, AllocatorType> &InitialData,
1166{
1167 FRDGBufferRef Buffer = GraphBuilder.CreateBuffer(FRDGBufferDesc::CreateByteAddressUploadDesc(sizeof(ElementType) * InitialData.Num()), Name);
1169 return Buffer;
1170}
1171
1187
1192template <typename ArrayType>
1194 FRDGBuilder& GraphBuilder,
1195 const TCHAR* Name,
1197{
1198 return CreateByteAddressUploadBuffer(GraphBuilder, Name,
1199 /*NumElementsCallback = */[ArrayCallback]() { const auto& Array = ArrayCallback(); return Array.Num() * Array.GetTypeSize() / 4; },
1200 /*InitialDataCallback = */[ArrayCallback]() { return ArrayCallback().GetData(); },
1201 /*InitialDataSizeCallback = */[ArrayCallback]() { const auto& Array = ArrayCallback(); return Array.Num() * Array.GetTypeSize(); });
1202}
1203
1208template <typename GetArrayRefCallback, typename Type = TInvokeResult_T<GetArrayRefCallback>>
1216
1219 FRDGBuilder& GraphBuilder,
1220 const TCHAR* Name,
1221 const FRDGBufferDesc& Desc,
1222 const void* InitialData,
1225
1227template <typename ExecuteLambdaType>
1228inline void AddPass(FRDGBuilder& GraphBuilder, FRDGEventName&& Name, ExecuteLambdaType&& ExecuteLambda)
1229{
1230 GraphBuilder.AddPass(MoveTemp(Name), ERDGPassFlags::None, MoveTemp(ExecuteLambda));
1231}
1232
1233template <typename ExecuteLambdaType>
1234inline void AddPassIfDebug(FRDGBuilder& GraphBuilder, FRDGEventName&& Name, ExecuteLambdaType&& ExecuteLambda)
1235{
1236#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
1237 AddPass(GraphBuilder, MoveTemp(Name), MoveTemp(ExecuteLambda));
1238#endif
1239}
1240
1241inline void AddDispatchToRHIThreadPass(FRDGBuilder& GraphBuilder)
1242{
1243 GraphBuilder.AddDispatchHint();
1244}
1245
1249
1252{
1253 auto* PassParameters = GraphBuilder.AllocParameters<FReadbackTextureParameters>();
1254 PassParameters->Texture = Texture;
1255 GraphBuilder.AddPass(MoveTemp(Name), PassParameters, ERDGPassFlags::Readback, MoveTemp(ExecuteLambda));
1256}
1257
1261
1264{
1265 auto* PassParameters = GraphBuilder.AllocParameters<FReadbackBufferParameters>();
1266 PassParameters->Buffer = Buffer;
1267 GraphBuilder.AddPass(MoveTemp(Name), PassParameters, ERDGPassFlags::Readback, MoveTemp(ExecuteLambda));
1268}
1269
1272{
1273public:
1275
1277 {
1278 checkf(IsEmpty(), TEXT("Submit must be called before destruction."));
1279 }
1280
1282 {
1283 Resources.Reserve(ResourceCount);
1284 }
1285
1287 {
1288 if (!Resource)
1289 {
1290 return;
1291 }
1292
1293 Validate(Resource, Access, Pipelines);
1294 Resources.Emplace(Resource, Access, Pipelines);
1295 }
1296
1298 {
1299 if (!Resource)
1300 {
1301 return;
1302 }
1303
1304 Validate(Resource, Access, Pipelines);
1305
1306 if (Contains(Resource))
1307 {
1308 return;
1309 }
1310
1311 Resources.Emplace(Resource, Access, Pipelines);
1312 }
1313
1314 RENDERCORE_API void Submit(FRDGBuilder& GraphBuilder);
1315
1317 {
1318 return Resources.ContainsByPredicate([&](const FResource& InResource) { return InResource.Resource == Resource; });
1319 }
1320
1321 bool IsEmpty() const
1322 {
1323 return Resources.IsEmpty();
1324 }
1325
1326private:
1327 void Validate(FRDGViewableResource* Resource, ERHIAccess Access, ERHIPipeline Pipelines)
1328 {
1329 checkf(IsValidAccess(Access) && Access != ERHIAccess::Unknown, TEXT("Attempted to finalize texture %s with an invalid access %s."), Resource->Name, *GetRHIAccessName(Access));
1330 check(Pipelines != ERHIPipeline::None);
1331 }
1332
1333 struct FResource
1334 {
1335 FResource() = default;
1336
1338 : Resource(InResource)
1339 , Access(InAccess)
1340 , Pipelines(InPipelines)
1341 {}
1342
1343 FRDGViewableResource* Resource;
1344 ERHIAccess Access;
1345 ERHIPipeline Pipelines = ERHIPipeline::None;
1346 };
1347
1349};
1350
1352 FRDGBuilder& GraphBuilder,
1356{
1357 const TRefCountPtr<IPooledRenderTarget>& PooledTexture = GraphBuilder.ConvertToExternalTexture(Texture);
1358 GraphBuilder.UseExternalAccessMode(Texture, Access, Pipelines);
1359 return PooledTexture;
1360}
1361
1363 FRDGBuilder& GraphBuilder,
1367{
1368 const TRefCountPtr<FRDGPooledBuffer>& PooledBuffer = GraphBuilder.ConvertToExternalBuffer(Buffer);
1369 GraphBuilder.UseExternalAccessMode(Buffer, Access, Pipelines);
1370 return PooledBuffer;
1371}
1372
1383
1394
1395// Allocates an RDG pooled buffer instance. Attempts to reuse allocation if Out has a value. Returns true a new instance was allocated, or false if the existing allocation was reused.
1397 const FRDGBufferDesc& Desc,
1399 const TCHAR* Name,
1401
1403 const FRDGBufferDesc& Desc,
1404 const TCHAR* Name,
1406
1407// Same as AllocatePooledBuffer but will rebase the allocated buffer under the current LLM tag.
1408#if ENABLE_LOW_LEVEL_MEM_TRACKER || UE_MEMORY_TRACE_ENABLED
1410 FRHICommandListBase& RHICmdList,
1411 const FRDGBufferDesc& Desc,
1412 const TCHAR* Name,
1414#else // #if ENABLE_LOW_LEVEL_MEM_TRACKER
1416 FRHICommandListBase& RHICmdList,
1417 const FRDGBufferDesc& Desc,
1418 const TCHAR* Name,
1420{
1421 return AllocatePooledBuffer(Desc, Name, Alignment);
1422}
1423#endif // #if ENABLE_LOW_LEVEL_MEM_TRACKER
1424
1426 const FRDGTextureDesc& Desc,
1428 const TCHAR* Name);
1429
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool IsValidAccess(ED3D12Access InD3D12Access)
Definition D3D12Access.h:78
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
FInt32Vector3 FIntVector
Definition MathFwd.h:115
void SetComputePipelineState(FRHIComputeCommandList &RHICmdList, FRHIComputeShader *ComputeShader)
Definition PipelineStateCache.cpp:1447
ERHIAccess
Definition RHIAccess.h:11
@ MaxSimultaneousRenderTargets
Definition RHIDefinitions.h:287
#define BUF_DrawIndirect
Definition RHIDefinitions.h:987
#define TexCreate_None
Definition RHIDefinitions.h:1191
ETextureCreateFlags
Definition RHIDefinitions.h:1091
#define PLATFORM_DISPATCH_INDIRECT_ARGUMENT_BOUNDARY_SIZE
Definition RHIDefinitions.h:40
ERenderTargetLoadAction
Definition RHIDefinitions.h:1253
#define GRHIMaxDispatchThreadGroupsPerDimension
Definition RHIGlobals.h:881
ERHIPipeline
Definition RHIPipeline.h:13
FString GetRHIAccessName(ERHIAccess Access)
Definition RHIStrings.cpp:466
ERDGTextureFlags
Definition RenderGraphDefinitions.h:185
ERDGPassFlags
Definition RenderGraphDefinitions.h:128
ERDGBufferFlags
Definition RenderGraphDefinitions.h:163
ERDGPooledBufferAlignment
Definition RenderGraphDefinitions.h:290
ERDGInitialDataFlags
Definition RenderGraphDefinitions.h:274
FRHIShaderResourceView * TryGetSRV(FRDGPooledBuffer *Buffer)
Definition RenderGraphUtils.h:96
RENDERCORE_API void AddClearRenderTargetPass(FRDGBuilder &GraphBuilder, FRDGTextureRef Texture)
Definition RenderGraphUtils.cpp:627
RENDERCORE_API void AddCopyTexturePass(FRDGBuilder &GraphBuilder, FRDGTextureRef InputTexture, FRDGTextureRef OutputTexture, const FRHICopyTextureInfo &CopyInfo)
Definition RenderGraphUtils.cpp:259
FRDGBufferRef CreateByteAddressUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const TArray< ElementType, AllocatorType > &InitialData, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.h:1161
void AddReadbackBufferPass(FRDGBuilder &GraphBuilder, FRDGEventName &&Name, FRDGBufferRef Buffer, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphUtils.h:1263
RENDERCORE_API FRDGBufferRef CreateUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, uint32 BytesPerElement, uint32 NumElements, const void *InitialData, uint64 InitialDataSize, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.cpp:940
FRHITexture * TryGetRHI(FRDGTextureRef Texture)
Definition RenderGraphUtils.h:81
FRDGBufferRef CreateStructuredBuffer_Impl(FRDGBuilder &GraphBuilder, const TCHAR *Name, TRDGBufferArrayCallback< ArrayType > &&ArrayCallback)
Definition RenderGraphUtils.h:957
RENDERCORE_API FRDGBufferRef CreateByteAddressBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, uint32 NumBytes, const void *InitialData, uint64 InitialDataSize, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.cpp:915
FRDGBufferRef CreateStructuredUploadBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const TArray< ElementType, AllocatorType > &InitialData, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.h:1145
void AddDispatchToRHIThreadPass(FRDGBuilder &GraphBuilder)
Definition RenderGraphUtils.h:1241
RENDERCORE_API void AddResummarizeHTilePass(FRDGBuilder &GraphBuilder, FRDGTextureRef DepthTexture)
Definition RenderGraphUtils.cpp:794
FRDGTextureRef GetIfProduced(FRDGTextureRef Texture, FRDGTextureRef FallbackTexture=nullptr)
Definition RenderGraphUtils.h:57
RENDERCORE_API void AddDrawTexturePass(FRDGBuilder &GraphBuilder, const FGlobalShaderMap *ShaderMap, FRDGTextureRef InputTexture, FRDGTextureRef OutputTexture, const FRDGDrawTextureInfo &DrawInfo)
Definition RenderGraphUtils.cpp:287
RENDERCORE_API FRDGTextureRef RegisterExternalTextureWithFallback(FRDGBuilder &GraphBuilder, const TRefCountPtr< IPooledRenderTarget > &ExternalPooledTexture, const TRefCountPtr< IPooledRenderTarget > &FallbackPooledTexture)
Definition RenderGraphUtils.cpp:190
const TRefCountPtr< IPooledRenderTarget > & ConvertToExternalAccessTexture(FRDGBuilder &GraphBuilder, FRDGTexture *Texture, ERHIAccess Access=ERHIAccess::SRVMask, ERHIPipeline Pipelines=ERHIPipeline::Graphics)
Definition RenderGraphUtils.h:1351
void AddPass(FRDGBuilder &GraphBuilder, FRDGEventName &&Name, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphUtils.h:1228
const TRefCountPtr< FRDGPooledBuffer > & ConvertToExternalAccessBuffer(FRDGBuilder &GraphBuilder, FRDGBuffer *Buffer, ERHIAccess Access=ERHIAccess::SRVMask, ERHIPipeline Pipelines=ERHIPipeline::Graphics)
Definition RenderGraphUtils.h:1362
void AddReadbackTexturePass(FRDGBuilder &GraphBuilder, FRDGEventName &&Name, FRDGTextureRef Texture, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphUtils.h:1251
bool HasBeenProduced(FRDGViewableResource *Resource)
Definition RenderGraphUtils.h:51
TRefCountPtr< FRDGPooledBuffer > AllocatePooledBufferCurrentLLMTag(FRHICommandListBase &RHICmdList, const FRDGBufferDesc &Desc, const TCHAR *Name, ERDGPooledBufferAlignment Alignment=ERDGPooledBufferAlignment::Page)
Definition RenderGraphUtils.h:1415
RENDERCORE_API void AddClearStencilPass(FRDGBuilder &GraphBuilder, FRDGTextureRef Texture)
Definition RenderGraphUtils.cpp:787
bool IsRegistered(FRDGBuilder &GraphBuilder, const TRefCountPtr< IPooledRenderTarget > &RenderTarget)
Definition RenderGraphUtils.h:111
RENDERCORE_API FRDGBufferRef CreateVertexBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, const FRDGBufferDesc &Desc, const void *InitialData, uint64 InitialDataSize, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.cpp:957
RENDERCORE_API FRDGBufferRef CreateStructuredBuffer(FRDGBuilder &GraphBuilder, const TCHAR *Name, uint32 BytesPerElement, uint32 NumElements, const void *InitialData, uint64 InitialDataSize, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphUtils.cpp:888
RENDERCORE_API void AddCopyBufferPass(FRDGBuilder &GraphBuilder, FRDGBufferRef DstBuffer, uint64 DstOffset, FRDGBufferRef SrcBuffer, uint64 SrcOffset, uint64 NumBytes)
Definition RenderGraphUtils.cpp:369
FRenderTargetBinding GetLoadBindingIfProduced(FRDGTextureRef Texture, ERenderTargetLoadAction ActionIfNotProduced)
Definition RenderGraphUtils.h:75
RENDERCORE_API void AddClearDepthStencilPass(FRDGBuilder &GraphBuilder, FRDGTextureRef Texture, bool bClearDepth, float Depth, bool bClearStencil, uint8 Stencil)
Definition RenderGraphUtils.cpp:728
FRDGBufferRef CreateByteAddressBuffer_Impl(FRDGBuilder &GraphBuilder, const TCHAR *Name, TRDGBufferArrayCallback< ArrayType > &&ArrayCallback)
Definition RenderGraphUtils.h:1058
RENDERCORE_API FRDGTextureMSAA CreateTextureMSAA(FRDGBuilder &GraphBuilder, FRDGTextureDesc Desc, const TCHAR *NameMultisampled, const TCHAR *NameResolved, ETextureCreateFlags ResolveFlagsToAdd=TexCreate_None)
Definition RenderGraphUtils.cpp:206
FRDGTextureRef TryRegisterExternalTexture(FRDGBuilder &GraphBuilder, const TRefCountPtr< IPooledRenderTarget > &ExternalPooledTexture, ERDGTextureFlags Flags=ERDGTextureFlags::None)
Definition RenderGraphUtils.h:254
FRDGBufferRef CreateByteAddressUploadBuffer_Impl(FRDGBuilder &GraphBuilder, const TCHAR *Name, TRDGBufferArrayCallback< ArrayType > &&ArrayCallback)
Definition RenderGraphUtils.h:1193
RENDERCORE_API void ClearUnusedGraphResourcesImpl(const FShaderParameterBindings &ShaderBindings, const FShaderParametersMetadata *ParametersMetadata, void *InoutParameters, std::initializer_list< FRDGResourceRef > ExcludeList)
Definition RenderGraphUtils.cpp:15
FRenderTargetBindingSlots GetRenderTargetBindings(ERenderTargetLoadAction ColorLoadAction, TArrayView< FRDGTextureRef > ColorTextures)
Definition RenderGraphUtils.h:121
RENDERCORE_API void AddClearUAVPass(FRDGBuilder &GraphBuilder, FRDGBufferUAVRef BufferUAV, uint32 Value, ERDGPassFlags ComputePassFlags=ERDGPassFlags::Compute)
Definition RenderGraphUtils.cpp:402
RENDERCORE_API bool AllocatePooledBuffer(const FRDGBufferDesc &Desc, TRefCountPtr< FRDGPooledBuffer > &Out, const TCHAR *Name, ERDGPooledBufferAlignment Alignment=ERDGPooledBufferAlignment::Page)
Definition RenderGraphUtils.cpp:982
void AddPassIfDebug(FRDGBuilder &GraphBuilder, FRDGEventName &&Name, ExecuteLambdaType &&ExecuteLambda)
Definition RenderGraphUtils.h:1234
RENDERCORE_API void AddClearUAVFloatPass(FRDGBuilder &GraphBuilder, FRDGBufferUAVRef BufferUAV, float Value, ERDGPassFlags ComputePassFlags=ERDGPassFlags::Compute)
Definition RenderGraphUtils.cpp:420
FRDGBufferRef TryRegisterExternalBuffer(FRDGBuilder &GraphBuilder, const TRefCountPtr< FRDGPooledBuffer > &ExternalPooledBuffer, ERDGBufferFlags Flags=ERDGBufferFlags::None)
Definition RenderGraphUtils.h:263
RENDERCORE_API bool AllocatePooledTexture(const FRDGTextureDesc &Desc, TRefCountPtr< IPooledRenderTarget > &Out, const TCHAR *Name)
Definition RenderGraphUtils.cpp:1004
ERenderTargetLoadAction GetLoadActionIfProduced(FRDGTextureRef Texture, ERenderTargetLoadAction ActionIfNotProduced)
Definition RenderGraphUtils.h:69
RENDERCORE_API void AddEnqueueCopyPass(FRDGBuilder &GraphBuilder, FRHIGPUTextureReadback *Readback, FRDGTextureRef SourceTexture, FResolveRect Rect=FResolveRect(), uint32 SourceSlice=0)
Definition RenderGraphUtils.cpp:812
TFunction< void()> FRDGDispatchLateParamCallback
Definition RenderGraphUtils.h:48
uint64 TryGetSize(const FRDGBuffer *Buffer)
Definition RenderGraphUtils.h:101
FRDGTextureRef RegisterExternalTexture(FRDGBuilder &GraphBuilder, FRHITexture *Texture, const TCHAR *NameIfUnregistered, ERDGTextureFlags Flags)
Definition RenderGraphUtils.h:271
void ClearUnusedGraphResources(const TShaderRef< TShaderClass > &Shader, const FShaderParametersMetadata *ParametersMetadata, typename TShaderClass::FParameters *InoutParameters, std::initializer_list< FRDGResourceRef > ExcludeList={})
Definition RenderGraphUtils.h:195
TRefCountPtr< IPooledRenderTarget > CreateRenderTarget(FRHITexture *Texture, const TCHAR *Name)
Definition RenderTargetPool.cpp:32
#define RDG_BUFFER_ACCESS(MemberName, Access)
Definition ShaderParameterMacros.h:1923
#define BEGIN_SHADER_PARAMETER_STRUCT(StructTypeName, DllStorage)
Definition ShaderParameterMacros.h:1482
#define END_SHADER_PARAMETER_STRUCT()
Definition ShaderParameterMacros.h:1485
#define RDG_TEXTURE_ACCESS(MemberName, Access)
Definition ShaderParameterMacros.h:1933
void SetShaderParameters(FRHIBatchedShaderParameters &BatchedParameters, const FShaderParameterBindings &Bindings, const FShaderParametersMetadata *ParametersMetadata, const void *InParametersData)
Definition ShaderParameterStruct.cpp:883
void UnsetShaderUAVs(FRHIBatchedShaderUnbinds &BatchedUnbinds, const FShaderParameterBindings &Bindings)
Definition ShaderParameterStruct.h:163
void ValidateShaderParameters(const TShaderRef< FShader > &Shader, const FShaderParametersMetadata *ParametersMetadata, const void *ParametersData)
Definition ShaderParameterStruct.h:125
@ Multiplier
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition GlobalShader.h:173
Definition RenderGraphResources.h:1426
Definition RenderGraphResources.h:1452
Definition RenderGraphResources.h:1321
FRHIBuffer * GetIndirectRHICallBuffer() const
Definition RenderGraphResources.h:1338
uint32 GetSize() const
Definition RenderGraphResources.h:1351
FRDGBufferDesc Desc
Definition RenderGraphResources.h:1325
Definition RenderGraphBuilder.h:49
RENDERCORE_API void UseExternalAccessMode(FRDGViewableResource *Resource, ERHIAccess ReadOnlyAccess, ERHIPipeline Pipelines=ERHIPipeline::Graphics)
Definition RenderGraphBuilder.cpp:887
FRDGBuffer * FindExternalBuffer(FRHIBuffer *Buffer) const
Definition RenderGraphBuilder.inl:23
RENDERCORE_API FRDGTextureRef RegisterExternalTexture(const TRefCountPtr< IPooledRenderTarget > &ExternalPooledTexture, ERDGTextureFlags Flags=ERDGTextureFlags::None)
Definition RenderGraphBuilder.cpp:1070
RENDERCORE_API FRDGBufferRef RegisterExternalBuffer(const TRefCountPtr< FRDGPooledBuffer > &ExternalPooledBuffer, ERDGBufferFlags Flags=ERDGBufferFlags::None)
Definition RenderGraphBuilder.cpp:1111
ObjectType * AllocObject(TArgs &&... Args)
Definition RenderGraphBuilder.inl:158
FRDGBufferRef CreateBuffer(const FRDGBufferDesc &Desc, const TCHAR *Name, ERDGBufferFlags Flags=ERDGBufferFlags::None)
Definition RenderGraphBuilder.inl:65
RENDERCORE_API const TRefCountPtr< IPooledRenderTarget > & ConvertToExternalTexture(FRDGTextureRef Texture)
Definition RenderGraphBuilder.cpp:728
FRDGPassRef AddPass(FRDGEventName &&Name, const ParameterStructType *ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType &&ExecuteLambda)
void AddDispatchHint()
Definition RenderGraphBuilder.inl:501
RENDERCORE_API const TRefCountPtr< FRDGPooledBuffer > & ConvertToExternalBuffer(FRDGBufferRef Buffer)
Definition RenderGraphBuilder.cpp:712
void QueueBufferUpload(FRDGBufferRef Buffer, const void *InitialData, uint64 InitialDataSize, ERDGInitialDataFlags InitialDataFlags=ERDGInitialDataFlags::None)
Definition RenderGraphBuilder.inl:375
FRDGTexture * FindExternalTexture(FRHITexture *Texture) const
Definition RenderGraphBuilder.inl:5
Definition RenderGraphEvent.h:38
Definition RenderGraphUtils.h:1272
~FRDGExternalAccessQueue()
Definition RenderGraphUtils.h:1276
bool Contains(FRDGViewableResource *Resource)
Definition RenderGraphUtils.h:1316
FRDGExternalAccessQueue()=default
void AddUnique(FRDGViewableResource *Resource, ERHIAccess Access=ERHIAccess::SRVMask, ERHIPipeline Pipelines=ERHIPipeline::Graphics)
Definition RenderGraphUtils.h:1297
bool IsEmpty() const
Definition RenderGraphUtils.h:1321
void Add(FRDGViewableResource *Resource, ERHIAccess Access=ERHIAccess::SRVMask, ERHIPipeline Pipelines=ERHIPipeline::Graphics)
Definition RenderGraphUtils.h:1286
void Reserve(uint32 ResourceCount)
Definition RenderGraphUtils.h:1281
RENDERCORE_API void Submit(FRDGBuilder &GraphBuilder)
Definition RenderGraphUtils.cpp:973
Definition RenderGraphPass.h:217
Definition RenderGraphResources.h:1196
virtual RENDERCORE_API void MarkResourceAsUsed()
The following methods may only be called during pass execution.
const TCHAR *const Name
Definition RenderGraphResources.h:137
Definition RenderGraphResources.h:905
Definition RenderGraphResources.h:571
Definition RenderGraphResources.h:291
bool HasBeenProduced() const
Definition RenderGraphResources.h:321
Definition RHIResources.h:1581
uint32 GetSize() const
Definition RHIResources.h:1595
Definition RHICommandList.h:455
Definition RHICommandList.h:2735
void DispatchComputeShader(uint32 ThreadGroupCountX, uint32 ThreadGroupCountY, uint32 ThreadGroupCountZ)
Definition RHICommandList.h:2929
void DispatchIndirectComputeShader(FRHIBuffer *ArgumentBuffer, uint32 ArgumentOffset)
Definition RHICommandList.h:2939
Definition RHIResources.h:1018
Definition RHIGPUReadback.h:116
Definition RHIGPUReadback.h:139
Definition RHIResources.h:3304
Definition RHIResources.h:2153
Definition Shader.h:746
Definition ShaderParameterMetadata.h:136
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr ElementType * GetData() const
Definition ArrayView.h:295
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
static UE_FORCEINLINE_HINT constexpr size_t GetTypeSize()
Definition ArrayView.h:305
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
UE_NODEBUG static UE_FORCEINLINE_HINT constexpr uint32 GetTypeSize()
Definition Array.h:1047
Definition RefCounting.h:454
Definition Shader.h:1021
Type
Definition RHIFeatureLevel.h:20
void AfterDispatch(FRHIComputeCommandList &RHICmdList, const TShaderRef< TShaderClass > &ComputeShader)
Definition RenderGraphUtils.h:483
void PrepareDispatch(FRHIComputeCommandList &RHICmdList, const TShaderRef< TShaderClass > &ComputeShader, const FShaderParametersMetadata *ParametersMetadata, const typename TShaderClass::FParameters &Parameters)
Definition RenderGraphUtils.h:461
Definition RenderGraphUtils.h:344
FIntVector GetGroupCountWrapped(const int32 TargetGroupCount)
Definition RenderGraphUtils.h:398
void DispatchIndirect(FRHIComputeCommandList &RHICmdList, const TShaderRef< TShaderClass > &ComputeShader, const typename TShaderClass::FParameters &Parameters, FRHIBuffer *IndirectArgsBuffer, uint32 IndirectArgOffset)
Definition RenderGraphUtils.h:518
void ValidateGroupCount(const FIntVector &GroupCount)
Definition RenderGraphUtils.h:431
void ValidateIndirectArgsBuffer(uint32 IndirectArgsBufferSize, uint32 IndirectArgOffset)
Definition RenderGraphUtils.h:438
RENDERCORE_API FRDGBufferRef AddIndirectArgsSetupCsPass1D(FRDGBuilder &GraphBuilder, ERHIFeatureLevel::Type FeatureLevel, FRDGBuffer *InputCountBuffer, const TCHAR *OutputBufferName, uint32 Divisor, uint32 InputCountOffset=0U, uint32 Multiplier=1U)
Definition RenderGraphUtils.cpp:863
FRDGPassRef AddPass(FRDGBuilder &GraphBuilder, FRDGEventName &&PassName, ERDGPassFlags PassFlags, const TShaderRef< TShaderClass > &ComputeShader, const FShaderParametersMetadata *ParametersMetadata, typename TShaderClass::FParameters *Parameters, FIntVector GroupCount)
Definition RenderGraphUtils.h:550
void Dispatch(FRHIComputeCommandList &RHICmdList, const TShaderRef< TShaderClass > &ComputeShader, const FShaderParametersMetadata *ParametersMetadata, const typename TShaderClass::FParameters &Parameters, FIntVector GroupCount)
Definition RenderGraphUtils.h:491
FIntVector GetGroupCount(const int32 ThreadCount, const int32 GroupSize)
Definition RenderGraphUtils.h:349
Definition OverriddenPropertySet.cpp:45
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition Color.h:48
static constexpr UE_FORCEINLINE_HINT T DivideAndRoundUp(T Dividend, T Divisor)
Definition UnrealMathUtility.h:694
Definition RenderGraphDefinitions.h:103
Definition RenderGraphResources.h:940
static FRDGBufferDesc CreateByteAddressUploadDesc(uint32 NumBytes)
Definition RenderGraphResources.h:1061
static FRDGBufferDesc CreateStructuredUploadDesc(uint32 BytesPerElement, uint32 NumElements)
Definition RenderGraphResources.h:1044
EBufferUsageFlags Usage
Definition RenderGraphResources.h:1114
Definition RenderGraphUtils.h:742
uint32 DestMipIndex
Definition RenderGraphUtils.h:756
uint32 DestSliceIndex
Definition RenderGraphUtils.h:751
uint32 NumMips
Definition RenderGraphUtils.h:757
uint32 NumSlices
Definition RenderGraphUtils.h:752
FIntPoint SourcePosition
Definition RenderGraphUtils.h:747
FIntPoint Size
Definition RenderGraphUtils.h:744
uint32 SourceSliceIndex
Definition RenderGraphUtils.h:750
uint32 SourceMipIndex
Definition RenderGraphUtils.h:755
FIntPoint DestPosition
Definition RenderGraphUtils.h:748
Definition RenderGraphUtils.h:805
uint32 FirstSliceIndex
Definition RenderGraphUtils.h:815
uint32 NumSlices
Definition RenderGraphUtils.h:816
FIntRect Viewport
Definition RenderGraphUtils.h:809
uint32 NumMips
Definition RenderGraphUtils.h:820
TOptional< FLinearColor > ClearColor
Definition RenderGraphUtils.h:812
uint32 FirstMipIndex
Definition RenderGraphUtils.h:819
FRDGTextureClearInfo()=default
Definition RenderGraphDefinitions.h:627
Definition RenderGraphUtils.h:288
bool IsValid() const
Definition RenderGraphUtils.h:301
FRDGTextureMSAA()=default
FRDGTextureRef Target
Definition RenderGraphUtils.h:321
bool operator==(FRDGTextureMSAA Other) const
Definition RenderGraphUtils.h:311
FRDGTextureRef Resolve
Definition RenderGraphUtils.h:322
FRDGTextureMSAA(FRDGTextureRef InTexture)
Definition RenderGraphUtils.h:296
bool IsSeparate() const
Definition RenderGraphUtils.h:306
FRDGTextureMSAA(FRDGTextureRef InTarget, FRDGTextureRef InResolve)
Definition RenderGraphUtils.h:291
bool operator!=(FRDGTextureMSAA Other) const
Definition RenderGraphUtils.h:316
Definition RenderGraphUtils.h:864
FRDGUploadData()=delete
FRDGUploadData(FRDGBuilder &GraphBuilder, uint32 InCount)
Definition RenderGraphUtils.h:866
int32 GetTotalSize() const
Definition RenderGraphUtils.h:871
Definition RHICommandList.h:183
FIntVector SourcePosition
Definition RHICommandList.h:198
Definition ShaderParameterMacros.h:770
Definition ShaderParameterMacros.h:525
Definition RHIResources.h:5209
Definition RenderGraphUtils.h:135
int16 ArraySlice
Definition RenderGraphUtils.h:137
FRDGTextureRef Texture
Definition RenderGraphUtils.h:136
FTextureRenderTargetBinding(FRDGTextureRef InTexture, int16 InArraySlice=-1, bool bInNeverClear=false)
Definition RenderGraphUtils.h:152
FTextureRenderTargetBinding()
Definition RenderGraphUtils.h:140
FTextureRenderTargetBinding(FRDGTextureRef InTexture, bool bInNeverClear)
Definition RenderGraphUtils.h:146
bool bNeverClear
Definition RenderGraphUtils.h:138
Definition LinuxPlatformSplash.cpp:43
Definition Optional.h:131
Definition IntPoint.h:25
IntType Y
Definition IntPoint.h:37
static const TIntPoint ZeroValue
Definition IntPoint.h:45
IntType X
Definition IntPoint.h:34
IntType Y
Definition IntVector.h:34
IntType X
Definition IntVector.h:31
IntType Z
Definition IntVector.h:37