UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12View.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"
6#include "D3D12RHICommon.h"
7#include "D3D12Descriptors.h"
8#include "D3D12Resources.h"
9#include "RHIResources.h"
10
11class FD3D12Buffer;
12class FD3D12Texture;
15
17{
18 if (ViewDesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN)
19 {
21 }
22
23 if (ViewDesc.ViewDimension == D3D12_SRV_DIMENSION_BUFFER)
24 {
26 }
27
28#if D3D12_RHI_RAYTRACING
30 {
32 }
33#endif
34
36}
37
39{
40 if (ViewDesc.ViewDimension == D3D12_UAV_DIMENSION_UNKNOWN)
41 {
43 }
44
45 if (ViewDesc.ViewDimension == D3D12_UAV_DIMENSION_BUFFER)
46 {
48 }
49
51}
52
63
64// Holds the mip, array and plane range for a view, as well as the total number of these for the underlying resource.
66{
67 FD3D12ViewRange() = default;
73
74 // @todo remove this
76 {
77 return Mip .ExclusiveLast() <= Other.Mip .First || Other.Mip .ExclusiveLast() <= Mip .First
78 || Array.ExclusiveLast() <= Other.Array.First || Other.Array.ExclusiveLast() <= Array.First
79 || Plane.ExclusiveLast() <= Other.Plane.First || Other.Plane.ExclusiveLast() <= Plane.First;
80 }
81
82 // @todo remove this
84 {
85 return Mip.First;
86 }
87
88 // The subresource range covered by the view.
92};
93
95{
98 : NumArraySlices(ResourceDesc.DepthOrArraySize)
99 , NumPlanes (UE::DXGIUtilities::GetPlaneCount(ResourceDesc.Format))
100 , NumMips (ResourceDesc.MipLevels)
101 {}
102
106};
107
109{
110 FD3D12ViewSubset() = default;
115
116 bool IsWholeResource() const
117 {
118 return
119 Range.Mip .First == 0 && Range.Mip .Num == Layout.NumMips &&
122 }
123
124 bool HasPlane(uint32 PlaneIndex) const
125 {
126 return Range.Plane.IsInRange(PlaneIndex);
127 }
128
130 {
131 check(PlaneIndex >= Range.Plane.First && PlaneIndex < Range.Plane.ExclusiveLast());
132
133 FD3D12ViewSubset Copy { *this };
134 Copy.Range.Plane = { PlaneIndex, 1 };
135
136 return Copy;
137 }
138
139 //
140 // This iterator iterates over the subresources within a view subset. eg:
141 //
142 // for (uint32 SubresourceIndex : ViewSubset)
143 // {
144 // // Action for each subresource
145 // }
146 //
147 class FIterator final
148 {
149 public:
150 FIterator(FD3D12ViewSubset const& ViewSubset, uint8 MipSlice, uint16 ArraySlice, uint8 PlaneSlice)
151 : MipMax (ViewSubset.Range.Mip.Num)
152 , ArrayMax (ViewSubset.Range.Array.Num)
153 , ArrayStride(ViewSubset.Layout.NumMips)
154 , PlaneStride(ViewSubset.Layout.NumMips * (ViewSubset.Layout.NumArraySlices - ViewSubset.Range.Array.Num))
155 {
156 MipRangeStart = D3D12CalcSubresource(
157 MipSlice,
158 ArraySlice,
159 PlaneSlice,
160 ViewSubset.Layout.NumMips,
161 ViewSubset.Layout.NumArraySlices
162 );
163 }
164
166 {
167 if (++MipOffset == MipMax)
168 {
169 // Move to next array slice
170 MipOffset = 0;
171 MipRangeStart += ArrayStride;
172
173 if (++ArrayOffset == ArrayMax)
174 {
175 // Move to next plane slice
176 ArrayOffset = 0;
177 MipRangeStart += PlaneStride;
178 }
179 }
180
181 return *this;
182 }
183
184 uint32 operator * () const { return MipRangeStart + MipOffset; }
185
186 bool operator == (FIterator const& RHS) const { return *(*this) == *RHS; }
187 bool operator != (FIterator const& RHS) const { return !(*this == RHS); }
188
189 private:
190 // Constants
191 uint32 const MipMax;
192 uint32 const ArrayMax;
193 uint32 const ArrayStride;
194 uint32 const PlaneStride;
195
196 // Counters
197 uint32 MipRangeStart;
198 uint32 MipOffset = 0;
199 uint32 ArrayOffset = 0;
200 };
201
204
207};
208
209// Enumeration of supported view types. Each view type must pass this up to their parent FD3D12View constructor.
218
219// Manages descriptor allocations and view creation
221{
222 typedef FD3D12OfflineDescriptor FD3D12DefaultViews::* FNullDescPtr;
223
224public:
225 enum class EReason
226 {
229 };
230
232 {
236
237 FResourceInfo() = default;
238
239 // Constructor for renamable shader resources
245
246 // Constructor for manual views (does not automatically register for resource renames)
252 };
253
260
261#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
262 FRHIDescriptorHandle GetBindlessHandle() const { return BindlessHandle; }
263 bool IsBindless () const { return BindlessHandle.IsValid(); }
264#else
266 constexpr bool IsBindless () const { return false; }
267#endif
268
269protected:
270 FD3D12View() = delete;
272 virtual ~FD3D12View();
273
274 virtual void UpdateDescriptor() = 0;
275
277 void CreateView(FResourceInfo const& InResource, FNullDescPtr NullDescriptor);
278 void UpdateView(FD3D12ContextArray const& Contexts, const FResourceInfo& InResource, FNullDescPtr NullDescriptor);
279
280 bool IsInitialized() const { return ResourceInfo.ResourceLocation != nullptr; }
281
283 void UpdateBindlessSlot(FD3D12ContextArray const& Contexts);
284
287
289
290#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
291 // BindlessHandle is shared across multi-GPU linked objects. First linked object is responsible for destroying the handle.
292 // The D3D12View class doesn't have access to FD3D12LinkedAdapterObject::IsHeadLink(), so this separate bool is used.
293 FRHIDescriptorHandle BindlessHandle;
295#endif
297};
298
299template <typename TParent, typename TDesc>
334
335class FD3D12ConstantBufferView final : public TD3D12View<FD3D12ConstantBufferView, D3D12_CONSTANT_BUFFER_VIEW_DESC>
336{
337public:
339
341 void CreateView(FResourceInfo const& InResource, uint32 InOffset, uint32 InAlignedSize);
342
343private:
344 virtual void ResourceRenamed(FD3D12ContextArray const& Contexts, FD3D12BaseShaderResource* InRenamedResource, FD3D12ResourceLocation* InNewResourceLocation) override;
345 virtual void UpdateDescriptor() override;
346
347 uint32 Offset;
348};
349
350class FD3D12ShaderResourceView : public TD3D12View<FD3D12ShaderResourceView, D3D12_SHADER_RESOURCE_VIEW_DESC>
351{
352public:
354
355 enum class EFlags : uint8
356 {
357 None = 0,
358 SkipFastClearFinalize = 1 << 0,
359 };
361
364 void UpdateView(FD3D12ContextArray const& Contexts, const FResourceInfo& InResource, const D3D12_SHADER_RESOURCE_VIEW_DESC& InD3DViewDesc, EFlags InFlags);
365
367 void UpdateMinLODClamp(FD3D12ContextArray const& Contexts, float MinLODClamp);
368
370
371protected:
374 virtual void UpdateDescriptor() override;
375
376 // Required for resource renaming
379
381
383};
384
386
388{
389public:
391
392 enum class EFlags : uint8
393 {
394 None = 0,
395 NeedsCounter = 1 << 0
396 };
398
400 void CreateView(FResourceInfo const& InResource, D3D12_UNORDERED_ACCESS_VIEW_DESC const& InD3DViewDesc, EFlags InFlags);
401 void UpdateView(FD3D12ContextArray const& Contexts, const FResourceInfo& InResource, const D3D12_UNORDERED_ACCESS_VIEW_DESC& InD3DViewDesc, EFlags InFlags);
402
404 {
405 return CounterResource;
406 }
407
408protected:
409 void UpdateResourceInfo(const FResourceInfo& InResource, const D3D12_UNORDERED_ACCESS_VIEW_DESC& InD3DViewDesc, EFlags InFlags);
410 virtual void ResourceRenamed(FD3D12ContextArray const& Contexts, FD3D12BaseShaderResource* InRenamedResource, FD3D12ResourceLocation* InNewResourceLocation) override;
411 virtual void UpdateDescriptor() override;
412
414
415 // Required for resource renaming
416 uint64 OffsetInBytes = 0;
417 uint32 StrideInBytes = 0;
418};
419
421
433
434class FD3D12DepthStencilView final : public TD3D12View<FD3D12DepthStencilView, D3D12_DEPTH_STENCIL_VIEW_DESC>
435{
436public:
438
441
442 bool HasDepth () const { return GetViewSubset().HasPlane(0); }
443 bool HasStencil() const { return GetViewSubset().HasPlane(1); }
444
447
448private:
449 virtual void UpdateDescriptor() override;
450};
451
452template <typename TParent>
454{
456 {
457 auto InitLambda = [this](FRHICommandListBase&)
458 {
459 for (TParent& LinkedView : *this)
460 {
461 LinkedView.CreateView();
462 }
463 };
464
465 if (RHICmdList.IsTopOfPipe())
466 {
467 // We have to defer the view initialization to the RHI thread if the resource is dynamic (and RHI threading is enabled), since dynamic resources can be renamed.
468 // Also insert an RHI thread fence to prevent parallel translate tasks running until this command has completed.
469 RHICmdList.EnqueueLambda(MoveTemp(InitLambda));
470 RHICmdList.RHIThreadFence(true);
471 }
472 else
473 {
474 // Run the command directly if we're bypassing RHI command list recording, or the buffer is not dynamic.
475 InitLambda(RHICmdList);
476 }
477 }
478};
479
480// Wrapper classes to expose the internal SRV/UAV types to the render as actual RHI resources.
484 , public FD3D12DeferredInitView<FD3D12ShaderResourceView_RHI>
485{
486public:
488
489 virtual void CreateView();
490 virtual void UpdateView(FD3D12ContextArray const& Contexts);
491
493 {
494 // Recreate the view from the FRHIViewDesc rather than simply updating the D3D12 descriptor handle from the existing D3D view desc.
495 // This is because the streaming system may have replaced the underlying resource with one that has a different layout.
496 UpdateView(Contexts);
497 }
498
500};
501
505 , public FD3D12DeferredInitView<FD3D12UnorderedAccessView_RHI>
506{
507public:
509
510 virtual void CreateView();
511 virtual void UpdateView(FD3D12ContextArray const& Contexts);
512
514 {
515 // Recreate the view from the FRHIViewDesc rather than simply updating the D3D12 descriptor handle from the existing D3D view desc.
516 // This is because the streaming system may have replaced the underlying resource with one that has a different layout.
517 UpdateView(Contexts);
518 }
519
521};
522
523template<>
528template<>
#define check(expr)
Definition AssertionMacros.h:314
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
ERHIDescriptorType RHIDescriptorTypeFromD3D12ViewDesc(const D3D12_SHADER_RESOURCE_VIEW_DESC &ViewDesc)
Definition D3D12View.h:16
ED3D12ViewType
Definition D3D12View.h:211
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define FRIEND_ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:17
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
@ Num
Definition MetalRHIPrivate.h:234
ERHIDescriptorType
Definition RHIDefinitions.h:1348
ERHIDescriptorHeapType
Definition RHIDefinitions.h:1338
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition D3D12Resources.h:891
Definition D3D12Resources.h:1017
Definition D3D12View.h:336
void CreateView(FResourceInfo const &InResource, uint32 InOffset, uint32 InAlignedSize)
Definition D3D12View.cpp:345
static constexpr FD3D12OfflineDescriptor FD3D12DefaultViews::* Null
Definition D3D12View.h:338
Definition D3D12CommandContext.h:1193
Definition D3D12View.h:435
FD3D12ViewSubset GetDepthOnlySubset() const
Definition D3D12View.h:445
bool HasStencil() const
Definition D3D12View.h:443
static constexpr FD3D12OfflineDescriptor FD3D12DefaultViews::* Null
Definition D3D12View.h:437
bool HasDepth() const
Definition D3D12View.h:442
FD3D12ViewSubset GetStencilOnlySubset() const
Definition D3D12View.h:446
Definition D3D12RHICommon.h:78
Definition D3D12Device.h:176
Definition D3D12RHICommon.h:164
Definition D3D12View.h:423
Definition D3D12Resources.h:641
Definition D3D12Resources.h:181
TConstArrayView< FD3D12ResidencyHandle * > GetResidencyHandles() const
Definition D3D12Resources.h:401
Definition D3D12View.h:485
virtual void CreateView()
Definition D3D12SRV.cpp:250
virtual void UpdateView(FD3D12ContextArray const &Contexts)
Definition D3D12SRV.cpp:272
virtual FRHIDescriptorHandle GetBindlessHandle() const override
Definition D3D12View.h:499
virtual void ResourceRenamed(FD3D12ContextArray const &Contexts, FD3D12BaseShaderResource *, FD3D12ResourceLocation *) override
Definition D3D12View.h:492
Definition D3D12View.h:351
void CreateView(FResourceInfo const &InResource, D3D12_SHADER_RESOURCE_VIEW_DESC const &InD3DViewDesc, EFlags InFlags)
Definition D3D12SRV.cpp:44
void UpdateMinLODClamp(FD3D12ContextArray const &Contexts, float MinLODClamp)
Definition D3D12SRV.cpp:79
virtual void UpdateDescriptor() override
Definition D3D12SRV.cpp:104
virtual void ResourceRenamed(FD3D12ContextArray const &Contexts, FD3D12BaseShaderResource *InRenamedResource, FD3D12ResourceLocation *InNewResourceLocation) override
Definition D3D12SRV.cpp:56
EFlags
Definition D3D12View.h:356
EFlags Flags
Definition D3D12View.h:380
static constexpr FD3D12OfflineDescriptor FD3D12DefaultViews::* Null
Definition D3D12View.h:353
bool GetSkipFastClearFinalize() const
Definition D3D12View.h:366
void UpdateView(FD3D12ContextArray const &Contexts, const FResourceInfo &InResource, const D3D12_SHADER_RESOURCE_VIEW_DESC &InD3DViewDesc, EFlags InFlags)
Definition D3D12SRV.cpp:50
uint32 StrideInBytes
Definition D3D12View.h:378
uint64 OffsetInBytes
Definition D3D12View.h:377
void UpdateResourceInfo(const FResourceInfo &InResource, const D3D12_SHADER_RESOURCE_VIEW_DESC &InD3DViewDesc, EFlags InFlags)
Definition D3D12SRV.cpp:12
FD3D12RayTracingScene * GetRayTracingScene() const
Definition D3D12View.h:369
FD3D12RayTracingScene * RayTracingScene
Definition D3D12View.h:382
Definition D3D12Texture.h:31
Definition D3D12View.h:506
virtual void ResourceRenamed(FD3D12ContextArray const &Contexts, FD3D12BaseShaderResource *, FD3D12ResourceLocation *) override
Definition D3D12View.h:513
virtual void UpdateView(FD3D12ContextArray const &Contexts)
Definition D3D12UAV.cpp:229
virtual FRHIDescriptorHandle GetBindlessHandle() const override
Definition D3D12View.h:520
virtual void CreateView()
Definition D3D12UAV.cpp:207
Definition D3D12View.h:388
FD3D12Resource * GetCounterResource() const
Definition D3D12View.h:403
TRefCountPtr< FD3D12Resource > CounterResource
Definition D3D12View.h:413
EFlags
Definition D3D12View.h:393
Definition D3D12View.h:148
bool operator!=(FIterator const &RHS) const
Definition D3D12View.h:187
bool operator==(FIterator const &RHS) const
Definition D3D12View.h:186
uint32 operator*() const
Definition D3D12View.h:184
FIterator & operator++()
Definition D3D12View.h:165
FIterator(FD3D12ViewSubset const &ViewSubset, uint8 MipSlice, uint16 ArraySlice, uint8 PlaneSlice)
Definition D3D12View.h:150
Definition D3D12View.h:221
TConstArrayView< FD3D12ResidencyHandle * > GetResidencyHandles() const
Definition D3D12View.h:257
void InitializeBindlessSlot()
Definition D3D12View.cpp:264
virtual ~FD3D12View()
Definition D3D12View.cpp:240
constexpr bool IsBindless() const
Definition D3D12View.h:266
EReason
Definition D3D12View.h:226
FD3D12ResourceLocation * GetResourceLocation() const
Definition D3D12View.h:256
FD3D12OfflineDescriptor GetOfflineCpuHandle() const
Definition D3D12View.h:259
ERHIDescriptorHeapType const HeapType
Definition D3D12View.h:296
FD3D12Resource * GetResource() const
Definition D3D12View.h:254
FD3D12ViewSubset ViewSubset
Definition D3D12View.h:286
void UpdateBindlessSlot(FD3D12ContextArray const &Contexts)
Definition D3D12View.cpp:274
FRHIDescriptorHandle GetBindlessHandle() const
Definition D3D12View.h:265
void UpdateResourceInfo(FResourceInfo const &InResource, FNullDescPtr NullDescriptor)
Definition D3D12View.cpp:284
FD3D12View()=delete
FResourceInfo ResourceInfo
Definition D3D12View.h:285
FD3D12BaseShaderResource * GetShaderResource() const
Definition D3D12View.h:255
void CreateView(FResourceInfo const &InResource, FNullDescPtr NullDescriptor)
Definition D3D12View.cpp:320
bool IsInitialized() const
Definition D3D12View.h:280
FD3D12OfflineDescriptor OfflineCpuHandle
Definition D3D12View.h:288
void UpdateView(FD3D12ContextArray const &Contexts, const FResourceInfo &InResource, FNullDescPtr NullDescriptor)
Definition D3D12View.cpp:326
virtual void UpdateDescriptor()=0
FD3D12ViewSubset const & GetViewSubset() const
Definition D3D12View.h:258
Definition RHICommandList.h:455
void EnqueueLambda(const TCHAR *LambdaName, LAMBDA &&Lambda)
Definition RHICommandList.h:585
RHI_API FGraphEventRef RHIThreadFence(bool bSetLockFence=false)
Definition RHICommandList.cpp:1610
bool IsTopOfPipe() const
Definition RHICommandList.h:658
Definition RHIResources.h:3304
Definition RHIResources.h:3294
Definition RHIResources.h:1265
Definition D3D12View.h:301
TDesc const & GetD3DDesc() const
Definition D3D12View.h:332
void UpdateView(FD3D12ContextArray const &Contexts, FResourceInfo const &InResource, TDesc const &InD3DViewDesc)
Definition D3D12View.h:316
TD3D12View(FD3D12Device *InDevice, ERHIDescriptorType InDescriptorType, ERHIDescriptorHeapType InHeapType, TD3D12View *FirstLinkedObject)
Definition D3D12View.h:305
TDesc D3DViewDesc
Definition D3D12View.h:303
virtual void ResourceRenamed(FD3D12ContextArray const &Contexts, FD3D12BaseShaderResource *InRenamedResource, FD3D12ResourceLocation *InNewResourceLocation) override
Definition D3D12View.h:323
void CreateView(FResourceInfo const &InResource, TDesc const &InD3DViewDesc)
Definition D3D12View.h:309
Definition RefCounting.h:454
Definition AdvancedWidgetsModule.cpp:13
Definition D3D12View.h:54
FD3D12OfflineDescriptor NullUAV
Definition D3D12View.h:57
FD3D12OfflineDescriptor NullCBV
Definition D3D12View.h:58
FD3D12OfflineDescriptor NullDSV
Definition D3D12View.h:59
TRefCountPtr< class FD3D12SamplerState > DefaultSampler
Definition D3D12View.h:61
FD3D12OfflineDescriptor NullSRV
Definition D3D12View.h:55
FD3D12OfflineDescriptor NullRTV
Definition D3D12View.h:56
Definition D3D12View.h:454
void CreateViews(FRHICommandListBase &RHICmdList)
Definition D3D12View.h:455
Definition D3D12Descriptors.h:252
Definition D3D12Residency.h:46
Definition D3D12Resources.h:134
Definition D3D12View.h:95
uint8 NumPlanes
Definition D3D12View.h:104
uint8 NumMips
Definition D3D12View.h:105
FD3D12ResourceLayout()=default
FD3D12ResourceLayout(FD3D12ResourceDesc const &ResourceDesc)
Definition D3D12View.h:97
uint16 NumArraySlices
Definition D3D12View.h:103
Definition D3D12Resources.h:884
Definition D3D12View.h:66
FD3D12ViewRange()=default
uint8 MostDetailedMip() const
Definition D3D12View.h:83
bool DoesNotOverlap(FD3D12ViewRange const &Other) const
Definition D3D12View.h:75
FRHIRange8 Plane
Definition D3D12View.h:90
FRHIRange16 Array
Definition D3D12View.h:89
FRHIRange8 Mip
Definition D3D12View.h:91
Definition D3D12View.h:109
bool IsWholeResource() const
Definition D3D12View.h:116
FD3D12ViewSubset()=default
FD3D12ResourceLayout Layout
Definition D3D12View.h:205
bool HasPlane(uint32 PlaneIndex) const
Definition D3D12View.h:124
FD3D12ViewRange Range
Definition D3D12View.h:206
FIterator end() const
Definition D3D12View.h:203
FD3D12ViewSubset SelectPlane(uint32 PlaneIndex) const
Definition D3D12View.h:129
FD3D12ViewSubset(FD3D12ResourceLayout const &Layout, FD3D12ViewRange const &Range)
Definition D3D12View.h:111
FIterator begin() const
Definition D3D12View.h:202
Definition D3D12View.h:232
FD3D12ResourceLocation * ResourceLocation
Definition D3D12View.h:234
FResourceInfo(FD3D12ResourceLocation *InResourceLocation)
Definition D3D12View.h:247
FD3D12BaseShaderResource * BaseResource
Definition D3D12View.h:233
FResourceInfo(FD3D12BaseShaderResource *InBaseResource)
Definition D3D12View.h:240
FD3D12Resource * Resource
Definition D3D12View.h:235
Definition RHIDefinitions.h:1401
bool IsValid() const
Definition RHIDefinitions.h:1420
Definition RHIResources.h:2648
FD3D12ShaderResourceView_RHI TConcreteType
Definition D3D12View.h:526
FD3D12UnorderedAccessView_RHI TConcreteType
Definition D3D12View.h:531
Definition D3D12RHICommon.h:374
bool IsInRange(uint32 Value) const
Definition RHIResources.h:2633
TType Num
Definition RHIResources.h:2618
TType ExclusiveLast() const
Definition RHIResources.h:2630
TType First
Definition RHIResources.h:2617