UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12Texture.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4D3D12Texture.h: Implementation of D3D12 Texture
5=============================================================================*/
6#pragma once
7
8#include "D3D12CommandList.h"
9#include "D3D12Resources.h"
10#include "D3D12View.h"
11
13#define GUARDED_TEXTURE_CREATES (PLATFORM_WINDOWS && !(UE_BUILD_SHIPPING || UE_BUILD_TEST || PLATFORM_COMPILER_CLANG))
14
15// @todo don't make global here!
18 FD3D12Adapter* Adapter,
19 const FD3D12ResourceDesc& TextureDesc,
20 const D3D12_CLEAR_VALUE* ClearValue,
27 const TCHAR* Name);
28
31{
32public:
33
34 // Static helper functions
35 static bool CanBe4KAligned(const FD3D12ResourceDesc& Desc, EPixelFormat UEFormat);
36
37 FD3D12Texture() = delete;
38
45 virtual ~FD3D12Texture();
46
47 // IRefCountedObject interface overrides from FD3D12BaseShaderResource
49 virtual uint32 Release() const override { return FRHIResource::Release(); }
50 virtual uint32 GetRefCount() const override { return FRHIResource::GetRefCount(); }
51
52 // FRHIResource overrides
53#if RHI_ENABLE_RESOURCE_INFO
55#endif
56
57 // FRHITexture overrides
58#if D3D12RHI_USE_DUMMY_BACKBUFFER
59 virtual void* GetTextureBaseRHI() override { return this; }
60#else
61 virtual void* GetTextureBaseRHI() override final { return this; }
62#endif
63 virtual void* GetNativeResource() const override final;
65
66 // Accessors.
69
71
73
75 {
77 }
78
79 bool HasRenderTargetViews() const { return (RenderTargetViews.Num() > 0); }
81
83 FD3D12RenderTargetView* GetRenderTargetView(int32 MipIndex, int32 ArraySliceIndex) const;
85
86#if PLATFORM_REQUIRES_TYPELESS_RESOURCE_DISCARD_WORKAROUND
88#endif // #if PLATFORM_REQUIRES_TYPELESS_RESOURCE_DISCARD_WORKAROUND
89
90 // Setup functionality
98
100 {
101 RenderTargetViews.SetNum(Num);
102 }
103
112
121
135
136 // Locking/update functions
138 void Unlock(FRHICommandListBase& RHICmdList, const FRHILockTextureArgs& Arguments);
139
140 void UpdateTexture2D(FRHICommandListBase& RHICmdList, uint32 MipIndex, const struct FUpdateTextureRegion2D& UpdateRegion, uint32 SourcePitch, const uint8* SourceData);
142
143 void CopyTextureRegion(FD3D12CommandContext& Context, uint32 DestX, uint32 DestY, uint32 DestZ, FD3D12Texture* SourceTexture, const D3D12_BOX& SourceBox);
144
145 // Resource aliasing
148
149 // Staging buffer reuse
151
152protected:
153 // A shader resource view of the texture.
155
156 // Set when RTVs are created for each slice - TexCreate_TargetArraySlicesIndependently for TextureArrays & Cubemaps
157 bool bCreatedRTVsPerSlice{ false };
158
159#if PLATFORM_REQUIRES_TYPELESS_RESOURCE_DISCARD_WORKAROUND
161#endif // #if PLATFORM_REQUIRES_TYPELESS_RESOURCE_DISCARD_WORKAROUND
162
163 // Number of RTVs per mip when stored per slice
165
166 // A render targetable view of the texture.
168
169 // A depth-stencil targetable view of the texture.
171
172 // Data for each subresource while texture is locked
174
175 // Cached footprint size of first resource - optimization
177
178 // Source texture when aliased
180};
181
183{
184 int32 ArrayIndex = MipIndex;
185
187 {
188 check(ArraySliceIndex >= 0);
189 ArrayIndex = MipIndex * RTVArraySizePerMip + ArraySliceIndex;
190 check(ArrayIndex < RenderTargetViews.Num());
191 }
192 else
193 {
194 // Catch attempts to use a specific slice without having created the texture to support it
195 check(ArraySliceIndex == -1 || ArraySliceIndex == 0);
196 }
197
198 if (ArrayIndex < RenderTargetViews.Num())
199 {
200 return RenderTargetViews[ArrayIndex].Get();
201 }
202 return 0;
203}
204
205template<>
210
211class FD3D12Viewport;
212
213#if D3D12RHI_USE_DUMMY_BACKBUFFER
215{
216public:
219 , Viewport(InViewPort)
220 {
221 }
222
223 FD3D12Viewport* GetViewPort() const { return Viewport; }
224
226 virtual FRHIDescriptorHandle GetDefaultBindlessHandle() const override;
227
228 // FRHITexture overrides
229 virtual void* GetTextureBaseRHI() override { return (void*)GetBackBufferTexture(); }
230
231private:
232 FD3D12Viewport* const Viewport;
233};
234#endif
235
238{
239 if (!Texture)
240 {
241 return NULL;
242 }
243
244 FRHITexture* RHITexture = Texture;
245 FD3D12Texture* Result((FD3D12Texture*)RHITexture->GetTextureBaseRHI());
246
247 return Result;
248}
249
251{
253 if (Result != nullptr)
254 {
255 Result = Result->GetLinkedObject(GPUIndex);
256 check(Result);
257 return Result;
258 }
259 else
260 {
261 return Result;
262 }
263}
264
266{
267 // Note: This function can be called from many different threads
268 // @param TextureSize >0 to allocate, <0 to deallocate
269 // @param b3D true:3D, false:2D or cube map
270 // @param bStreamable true:Streamable, false:not streamable
271 void UpdateD3D12TextureStats(FD3D12Texture& Texture, const FD3D12ResourceDesc& ResourceDesc, const FRHITextureDesc& TextureDesc, uint64 TextureSize, bool bNewTexture, bool bAllocating);
272
275};
276
#define NULL
Definition oodle2base.h:134
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
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
ED3D12Access
Definition D3D12Access.h:15
FORCEINLINE FD3D12Texture * GetD3D12TextureFromRHITexture(FRHITexture *Texture)
Definition D3D12Texture.h:237
void SafeCreateTexture2D(FD3D12Device *pDevice, FD3D12Adapter *Adapter, const FD3D12ResourceDesc &TextureDesc, const D3D12_CLEAR_VALUE *ClearValue, FD3D12ResourceLocation *OutTexture2D, FD3D12BaseShaderResource *Owner, EPixelFormat Format, ETextureCreateFlags Flags, ED3D12Access InInitialD3D12Access, ED3D12Access InDefaultD3D12Access, const TCHAR *Name)
Definition D3D12Texture.cpp:481
ERHIDescriptorType RHIDescriptorTypeFromD3D12ViewDesc(const D3D12_SHADER_RESOURCE_VIEW_DESC &ViewDesc)
Definition D3D12View.h:16
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
@ Num
Definition MetalRHIPrivate.h:234
EPixelFormat
Definition PixelFormat.h:16
ERHIDescriptorType
Definition RHIDefinitions.h:1348
ETextureCreateFlags
Definition RHIDefinitions.h:1091
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition D3D12Adapter.h:136
Definition D3D12Resources.h:891
Definition D3D12CommandContext.h:513
Definition D3D12View.h:435
void CreateView(FResourceInfo const &InResource, TDesc const &InD3DViewDesc)
Definition D3D12View.h:309
FORCEINLINE FD3D12Device * GetParentDevice() const
Definition D3D12RHICommon.h:85
Definition D3D12Device.h:176
Definition D3D12RHICommon.h:164
Definition D3D12View.h:423
Definition D3D12Resources.h:641
Definition D3D12View.h:351
void CreateView(FResourceInfo const &InResource, D3D12_SHADER_RESOURCE_VIEW_DESC const &InD3DViewDesc, EFlags InFlags)
Definition D3D12SRV.cpp:44
EFlags
Definition D3D12View.h:356
Definition D3D12Texture.h:31
void SetAliasingSource(FTextureRHIRef &SourceTextureRHI)
Definition D3D12Texture.h:147
void Unlock(FRHICommandListBase &RHICmdList, const FRHILockTextureArgs &Arguments)
Definition D3D12Texture.cpp:2280
bool IsStreamable() const
Definition D3D12Texture.h:67
void EmplaceRTV(D3D12_RENDER_TARGET_VIEW_DESC const &RTVDesc, int32 Index, FD3D12Texture *FirstLinkedObject)
Definition D3D12Texture.h:104
void GetReadBackHeapDesc(D3D12_PLACED_SUBRESOURCE_FOOTPRINT &OutFootprint, uint32 Subresource) const
Definition D3D12Texture.cpp:2460
bool bCreatedRTVsPerSlice
Definition D3D12Texture.h:157
void UploadInitialData(FRHICommandListBase &RHICmdList, FD3D12ResourceLocation &&SourceLocation, ED3D12Access InDestinationD3D12Access)
Definition D3D12Texture.cpp:2210
virtual FReturnedRefCountValue AddRef() const override
Definition D3D12Texture.h:48
virtual ~FD3D12Texture()
Definition D3D12Texture.cpp:1671
TUniquePtr< D3D12_PLACED_SUBRESOURCE_FOOTPRINT > FirstSubresourceFootprint
Definition D3D12Texture.h:176
virtual uint32 Release() const override
Definition D3D12Texture.h:49
const FTextureRHIRef & GetAliasingSourceTexture() const
Definition D3D12Texture.h:70
FD3D12DepthStencilView * GetDepthStencilView(FExclusiveDepthStencil AccessType) const
Definition D3D12Texture.h:84
FD3D12Texture()=delete
TSharedPtr< FD3D12DepthStencilView > DepthStencilViews[FExclusiveDepthStencil::MaxIndex]
Definition D3D12Texture.h:170
void UpdateTexture(FD3D12CommandContext &Context, uint32 MipIndex, uint32 DestX, uint32 DestY, uint32 DestZ, const D3D12_TEXTURE_COPY_LOCATION &SourceCopyLocation)
Definition D3D12Texture.cpp:2147
void SetCreatedRTVsPerSlice(bool Value, int32 InRTVArraySize)
Definition D3D12Texture.h:93
TSharedPtr< FD3D12ShaderResourceView > ShaderResourceView
Definition D3D12Texture.h:154
void AliasResources(FD3D12Texture *Texture)
Definition D3D12Texture.cpp:1980
void UpdateTexture2D(FRHICommandListBase &RHICmdList, uint32 MipIndex, const struct FUpdateTextureRegion2D &UpdateRegion, uint32 SourcePitch, const uint8 *SourceData)
Definition D3D12Texture.cpp:2347
int32 RTVArraySizePerMip
Definition D3D12Texture.h:164
void EmplaceSRV(D3D12_SHADER_RESOURCE_VIEW_DESC const &SRVDesc, FD3D12Texture *FirstLinkedObject)
Definition D3D12Texture.h:122
void ReuseStagingBuffer(TUniquePtr< FD3D12LockedResource > &&LockedResource, uint32 Subresource)
Definition D3D12Texture.cpp:2001
TArray< TSharedPtr< FD3D12RenderTargetView >, TInlineAllocator< 1 > > RenderTargetViews
Definition D3D12Texture.h:167
TMap< uint32, TUniquePtr< FD3D12LockedResource > > LockedMap
Definition D3D12Texture.h:173
static bool CanBe4KAligned(const FD3D12ResourceDesc &Desc, EPixelFormat UEFormat)
Definition D3D12Texture.cpp:181
bool HasRenderTargetViews() const
Definition D3D12Texture.h:79
FD3D12ShaderResourceView * GetShaderResourceView() const
Definition D3D12Texture.h:82
FTextureRHIRef AliasingSourceTexture
Definition D3D12Texture.h:179
TConstArrayView< TSharedPtr< FD3D12RenderTargetView > > GetRenderTargetViews() const
Definition D3D12Texture.h:80
bool HasCreatedRTVsPerSlice() const
Definition D3D12Texture.h:74
virtual uint32 GetRefCount() const override
Definition D3D12Texture.h:50
FD3D12RenderTargetView * GetRenderTargetView(int32 MipIndex, int32 ArraySliceIndex) const
Definition D3D12Texture.h:182
void EmplaceDSV(D3D12_DEPTH_STENCIL_VIEW_DESC const &DSVDesc, int32 Index, FD3D12Texture *FirstLinkedObject)
Definition D3D12Texture.h:113
virtual FRHIDescriptorHandle GetDefaultBindlessHandle() const override
Definition D3D12Texture.cpp:1719
virtual void * GetNativeResource() const override final
Definition D3D12Texture.cpp:1696
FD3D12Texture(const FRHITextureCreateDesc &InDesc, class FD3D12Device *InParent)
Definition D3D12Texture.h:40
bool SkipsFastClearFinalize() const
Definition D3D12Texture.h:68
void SetNumRTVs(int32 Num)
Definition D3D12Texture.h:99
virtual void * GetTextureBaseRHI() override final
Definition D3D12Texture.h:61
Definition D3D12Viewport.h:24
Definition RHIResources.h:409
static const uint32 MaxIndex
Definition RHIResources.h:652
uint32 GetIndex() const
Definition RHIResources.h:623
Definition RHICommandList.h:455
uint32 GetRefCount() const
Definition RHIResources.h:93
uint32 Release() const
Definition RHIResources.h:80
uint32 AddRef() const
Definition RHIResources.h:73
Definition RHIResources.h:2153
virtual const FRHITextureDesc & GetDesc() const
Definition RHIResources.h:2170
virtual void * GetTextureBaseRHI()
Definition RHIResources.h:2207
Definition ResourceArray.h:102
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT ObjectType * Get() const
Definition SharedPointer.h:1065
Definition ContainerAllocationPolicies.h:894
Definition UniquePtr.h:107
Definition D3D12Texture.h:266
void D3D12TextureDeleted(FD3D12Texture &Texture)
Definition D3D12Texture.cpp:161
void D3D12TextureAllocated(FD3D12Texture &Texture)
Definition D3D12Texture.cpp:141
void UpdateD3D12TextureStats(FD3D12Texture &Texture, const FD3D12ResourceDesc &ResourceDesc, const FRHITextureDesc &TextureDesc, uint64 TextureSize, bool bNewTexture, bool bAllocating)
Definition D3D12Texture.cpp:73
Definition D3D12Texture.h:278
D3D12_PLACED_SUBRESOURCE_FOOTPRINT GetInitializerSubresourceFootprint(FD3D12Texture *Texture, uint32 Subresource, uint32 &NumRows)
Definition D3D12Texture.cpp:933
uint64 CalculateResourceSize(FD3D12Texture *Texture)
Definition D3D12Texture.cpp:849
D3D12_CLEAR_VALUE * FillClearValue(D3D12_CLEAR_VALUE &ClearValue, const FD3D12ResourceDesc &ResourceDesc, const FRHITextureDesc &TextureDesc)
Definition D3D12Texture.cpp:595
void ReconcileInitialState(FRHICommandListBase &RHICmdList, FD3D12Texture *Texture, ED3D12Access CurrentD3D12Access, ED3D12Access NeededD3D12Access)
Definition D3D12Texture.cpp:813
void CopyBulkData(void *UploadMemory, uint64 UploadMemorySize, FD3D12Texture *Texture, FResourceBulkDataInterface *BulkData)
Definition D3D12Texture.cpp:869
U16 Index
Definition radfft.cpp:71
Definition D3D12Resources.h:134
Definition RHIDefinitions.h:1401
Definition DynamicRHI.h:149
Definition DynamicRHI.h:198
Definition RHI.h:543
Definition RHIResources.h:1938
Definition RHIResources.h:1689
Definition RefCounting.h:29
Definition RHITypes.h:127
FD3D12Texture TConcreteType
Definition D3D12Texture.h:208
Definition D3D12RHICommon.h:374