UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D11Util.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 D3D11Util.h: D3D RHI utility definitions.
5=============================================================================*/
6
7#pragma once
8
9#include "RHICommandList.h"
10#include "RHIDefinitions.h"
14
15class FD3D11Buffer;
16class FD3D11Texture;
18class FRHIBuffer;
19class FRHITexture;
20
21#define D3D11RHI_IMMEDIATE_CONTEXT (GD3D11RHI->GetDeviceContext())
22#define D3D11RHI_DEVICE (GD3D11RHI->GetDevice())
23
29
37extern D3D11RHI_API void VerifyD3D11ResultNoExit(HRESULT Result, const ANSICHAR* Code, const ANSICHAR* Filename, uint32 Line, ID3D11Device* Device);
38
46extern D3D11RHI_API void VerifyD3D11Result(HRESULT Result,const ANSICHAR* Code,const ANSICHAR* Filename,uint32 Line, ID3D11Device* Device);
47
57extern D3D11RHI_API void VerifyD3D11ShaderResult(class FRHIShader* Shader, HRESULT Result, const ANSICHAR* Code, const ANSICHAR* Filename, uint32 Line, ID3D11Device* Device);
58
66extern D3D11RHI_API void VerifyD3D11CreateTextureResult(HRESULT D3DResult, int32 UEFormat,const ANSICHAR* Code,const ANSICHAR* Filename,uint32 Line,
67 uint32 SizeX,uint32 SizeY,uint32 SizeZ,uint8 D3DFormat,uint32 NumMips,uint32 Flags, D3D11_USAGE Usage,
69 const void* SubResPtr, uint32 SubResPitch, uint32 SubResSlicePitch, ID3D11Device* Device, const TCHAR* DebugName);
70
78
80 const FD3D11ResizeViewportState& OldState, const FD3D11ResizeViewportState& NewState, ID3D11Device* Device);
81
84
88#define VERIFYD3D11RESULT_EX(x, Device) {HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11Result(hr,#x,__FILE__,__LINE__, Device); }}
89#define VERIFYD3D11RESULT(x) {HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11Result(hr,#x,__FILE__,__LINE__, 0); }}
90#define VERIFYD3D11RESULT_NOEXIT(x) {HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11ResultNoExit(hr,#x,__FILE__,__LINE__, 0); }}
91#define VERIFYD3D11SHADERRESULT(Result, Shader, Device) {HRESULT hr = (Result); if (FAILED(hr)) { VerifyD3D11ShaderResult(Shader, hr, #Result,__FILE__,__LINE__, Device); }}
92#define VERIFYD3D11RESULT_NOEXIT(x) {HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11ResultNoExit(hr,#x,__FILE__,__LINE__, 0); }}
93#define VERIFYD3D11CREATETEXTURERESULT(x,UEFormat,SizeX,SizeY,SizeZ,Format,NumMips,Flags,Usage,CPUAccessFlags,MiscFlags,SampleCount,SampleQuality,SubResPtr,SubResPitch,SubResSlicePitch,Device,DebugName) {HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11CreateTextureResult(hr, UEFormat,#x,__FILE__,__LINE__,SizeX,SizeY,SizeZ,Format,NumMips,Flags,Usage,CPUAccessFlags,MiscFlags,SampleCount,SampleQuality,SubResPtr,SubResPitch,SubResSlicePitch,Device,DebugName); }}
94#define VERIFYD3D11RESIZEVIEWPORTRESULT(x, OldState, NewState, Device) { HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11ResizeViewportResult(hr, #x, __FILE__, __LINE__, OldState, NewState, Device); }}
95#define VERIFYD3D11CREATEVIEWRESULT(x, Device, Resource, Desc) {HRESULT hr = x; if (FAILED(hr)) { VerifyD3D11CreateViewResult(hr, #x, __FILE__, __LINE__, Device, Resource, Desc); }}
96
100extern D3D11RHI_API void VerifyComRefCount(IUnknown* Object,int32 ExpectedRefs,const TCHAR* Code,const TCHAR* Filename,int32 Line);
101#define checkComRefCount(Obj,ExpectedRefs) VerifyComRefCount(Obj,ExpectedRefs,TEXT(#Obj),TEXT(__FILE__),__LINE__)
102
104FString GetD3D11ErrorString(HRESULT ErrorCode, ID3D11Device* Device);
105
112{
113 switch(Face)
114 {
115 case CubeFace_PosX:
116 default:
117 return 0;//D3DCUBEMAP_FACE_POSITIVE_X;
118 case CubeFace_NegX:
119 return 1;//D3DCUBEMAP_FACE_NEGATIVE_X;
120 case CubeFace_PosY:
121 return 2;//D3DCUBEMAP_FACE_POSITIVE_Y;
122 case CubeFace_NegY:
123 return 3;//D3DCUBEMAP_FACE_NEGATIVE_Y;
124 case CubeFace_PosZ:
125 return 4;//D3DCUBEMAP_FACE_POSITIVE_Z;
126 case CubeFace_NegZ:
127 return 5;//D3DCUBEMAP_FACE_NEGATIVE_Z;
128 };
129}
130
135{
136public:
139
140 FD3D11LockedKey() = default;
141
146
148 {
149 return SourceObject == Other.SourceObject && Subresource == Other.Subresource;
150 }
151
153 {
154 return SourceObject != Other.SourceObject || Subresource != Other.Subresource;
155 }
156
158 {
160 }
161
164 {
165 return K.GetHash();
166 }
167};
168
171{
175
176 // constructor
178 : bAllocDataWasUsed(false)
180 {
181 }
182
183 // 16 byte alignment for best performance (can be 30x faster than unaligned)
185 {
186 Data = (uint8*)FMemory::Malloc(Size, 16);
187 bAllocDataWasUsed = true;
188 }
189
190 // Some driver might return aligned memory so we don't enforce the alignment
191 void SetData(void* InData)
192 {
193 check(!bAllocDataWasUsed); Data = (uint8*)InData;
194 }
195
196 uint8* GetData() const
197 {
198 return Data;
199 }
200
201 // only call if AllocData() was used
202 void FreeData()
203 {
204 check(bAllocDataWasUsed);
205 FMemory::Free(Data);
206 Data = 0;
207 }
208
209private:
210 //
211 uint8* Data;
212 // then FreeData
213 bool bAllocDataWasUsed;
214public:
215 // Whether the lock op is deferred
217};
218
223{
224public:
227
230
232 inline int32 GetNumActiveTargets() const { return NumActiveTargets; }
233 inline ID3D11RenderTargetView* GetRenderTargetView(int32 TargetIndex) { return RenderTargetViews[TargetIndex]; }
234 inline ID3D11DepthStencilView* GetDepthStencilView() { return DepthStencilView; }
235
236private:
240 ID3D11DepthStencilView* DepthStencilView;
242 int32 NumActiveTargets;
243};
244
246{
247 static const TCHAR* TStr() { return TEXT("FD3D11RHIGenericCommand"); }
248};
249
250template <
251 typename JobType,
252 typename = TEnableIf<
253 std::is_same_v<JobType, TFunction<void()>> ||
254 std::is_same_v<JobType, TFunction<void()>&>>>
255class TD3D11RHIGenericCommand final : public FRHICommand<TD3D11RHIGenericCommand<JobType>, FD3D11RHIGenericCommandString>
256{
257public:
258 // InRHIJob is supposed to be called on RHIT (don't capture things that can become outdated here)
262
263 void Execute(FRHICommandListBase& RHICmdList)
264 {
265 RHIJob();
266 }
267
268private:
269 JobType RHIJob;
270};
271
272template<typename JobType>
274{
275 //check(IsInRenderingThread());
279}
280
286
288{
290 : FScopedRHIThreadStaller(FRHICommandListExecutor::GetImmediateCommandList(), bDoStall && IsInRenderingThread() && GRHICommandList.AreRHITasksActive())
291 {
292 }
293};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#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::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
D3D11RHI_API void VerifyComRefCount(IUnknown *Object, int32 ExpectedRefs, const TCHAR *Code, const TCHAR *Filename, int32 Line)
Definition D3D11Util.cpp:435
void RunOnRHIThread(JobType &&InRHIJob)
Definition D3D11Util.h:273
D3D11RHI_API void VerifyD3D11CreateViewResult(HRESULT D3DResult, const ANSICHAR *Code, const ANSICHAR *Filename, uint32 Line, ID3D11Device *Device, FRHITexture *Texture, const D3D11_UNORDERED_ACCESS_VIEW_DESC &Desc)
Definition D3D11Util.cpp:416
bool ShouldNotEnqueueRHICommand()
Definition D3D11Util.h:281
D3D11RHI_API void VerifyD3D11CreateTextureResult(HRESULT D3DResult, int32 UEFormat, const ANSICHAR *Code, const ANSICHAR *Filename, uint32 Line, uint32 SizeX, uint32 SizeY, uint32 SizeZ, uint8 D3DFormat, uint32 NumMips, uint32 Flags, D3D11_USAGE Usage, uint32 CPUAccessFlags, uint32 MiscFlags, uint32 SampleCount, uint32 SampleQuality, const void *SubResPtr, uint32 SubResPitch, uint32 SubResSlicePitch, ID3D11Device *Device, const TCHAR *DebugName)
Definition D3D11Util.cpp:265
D3D11RHI_API void VerifyD3D11Result(HRESULT Result, const ANSICHAR *Code, const ANSICHAR *Filename, uint32 Line, ID3D11Device *Device)
Definition D3D11Util.cpp:238
D3D11RHI_API void VerifyD3D11ResultNoExit(HRESULT Result, const ANSICHAR *Code, const ANSICHAR *Filename, uint32 Line, ID3D11Device *Device)
Definition D3D11Util.cpp:229
D3D11RHI_API void VerifyD3D11ShaderResult(class FRHIShader *Shader, HRESULT Result, const ANSICHAR *Code, const ANSICHAR *Filename, uint32 Line, ID3D11Device *Device)
Definition D3D11Util.cpp:252
void SetD3D11ResourceName(FD3D11Texture *Texture, FStringView Name)
Definition D3D11Util.cpp:39
void SetD3D11ObjectName(ID3D11DeviceChild *Object, FAnsiStringView Name)
Definition D3D11Util.cpp:18
D3D11RHI_API void VerifyD3D11ResizeViewportResult(HRESULT D3DResult, const ANSICHAR *Code, const ANSICHAR *Filename, uint32 Line, const FD3D11ResizeViewportState &OldState, const FD3D11ResizeViewportState &NewState, ID3D11Device *Device)
Definition D3D11Util.cpp:333
uint32 GetD3D11CubeFace(ECubeFace Face)
Definition D3D11Util.h:111
FString GetD3D11ErrorString(HRESULT ErrorCode, ID3D11Device *Device)
Definition D3D11Util.cpp:71
FRHICommandListExecutor GRHICommandList
Definition RHICommandList.cpp:119
bool IsRunningRHIInSeparateThread()
Definition RHICommandList.h:159
@ MaxSimultaneousRenderTargets
Definition RHIDefinitions.h:287
ECubeFace
Definition RHIDefinitions.h:525
@ CubeFace_NegX
Definition RHIDefinitions.h:527
@ CubeFace_PosX
Definition RHIDefinitions.h:526
@ CubeFace_NegY
Definition RHIDefinitions.h:529
@ CubeFace_NegZ
Definition RHIDefinitions.h:531
@ CubeFace_PosZ
Definition RHIDefinitions.h:530
@ CubeFace_PosY
Definition RHIDefinitions.h:528
CORE_API bool IsInRHIThread()
Definition ThreadingBase.cpp:339
CORE_API bool IsInRenderingThread()
Definition ThreadingBase.cpp:273
uint32 PointerHash(const void *Key)
Definition TypeHash.h:91
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 D3D11Util.h:223
~FD3D11BoundRenderTargets()
Definition D3D11Util.cpp:483
ID3D11RenderTargetView * GetRenderTargetView(int32 TargetIndex)
Definition D3D11Util.h:233
int32 GetNumActiveTargets() const
Definition D3D11Util.h:232
ID3D11DepthStencilView * GetDepthStencilView()
Definition D3D11Util.h:234
Definition D3D11Resources.h:421
Definition D3D11Util.h:135
FD3D11LockedKey()=default
uint32 GetHash() const
Definition D3D11Util.h:157
bool operator!=(const FD3D11LockedKey &Other) const
Definition D3D11Util.h:152
friend uint32 GetTypeHash(const FD3D11LockedKey &K)
Definition D3D11Util.h:163
bool operator==(const FD3D11LockedKey &Other) const
Definition D3D11Util.h:147
ID3D11Resource * SourceObject
Definition D3D11Util.h:137
FD3D11LockedKey(ID3D11Resource *InSource, uint32 InSubresource=0)
Definition D3D11Util.h:142
uint32 Subresource
Definition D3D11Util.h:138
Definition D3D11Resources.h:154
Definition D3D11Resources.h:557
Definition RHIResources.h:1581
Definition RHICommandList.h:455
void * AllocCommand(int32 AllocSize, int32 Alignment)
Definition RHICommandList.h:567
bool Bypass() const
Definition RHICommandList.inl:27
Definition RHICommandList.h:5284
static FRHICommandListImmediate & GetImmediateCommandList()
Definition RHICommandList.h:5528
Definition RHICommandList.h:4626
Definition RHIResources.h:854
Definition RHIResources.h:2153
Definition RHICommandList.h:4582
Definition D3D11Util.h:256
void Execute(FRHICommandListBase &RHICmdList)
Definition D3D11Util.h:263
TD3D11RHIGenericCommand(JobType &&InRHIJob)
Definition D3D11Util.h:259
Definition EnableIf.h:20
Definition AndroidPlatformMisc.h:14
Definition RefCounting.h:454
@ false
Definition radaudio_common.h:23
Definition D3D11Util.h:171
bool bLockDeferred
Definition D3D11Util.h:216
uint32 DepthPitch
Definition D3D11Util.h:174
TRefCountPtr< ID3D11Resource > StagingResource
Definition D3D11Util.h:172
void AllocData(uint32 Size)
Definition D3D11Util.h:184
void SetData(void *InData)
Definition D3D11Util.h:191
uint8 * GetData() const
Definition D3D11Util.h:196
void FreeData()
Definition D3D11Util.h:202
uint32 Pitch
Definition D3D11Util.h:173
FD3D11LockedData()
Definition D3D11Util.h:177
Definition D3D11Util.h:246
static const TCHAR * TStr()
Definition D3D11Util.h:247
Definition D3D11Util.h:72
uint32 SizeY
Definition D3D11Util.h:74
bool bIsFullscreen
Definition D3D11Util.h:76
uint32 SizeX
Definition D3D11Util.h:73
DXGI_FORMAT Format
Definition D3D11Util.h:75
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition RHICommandList.h:1604
Definition D3D11Util.h:288
FScopedD3D11RHIThreadStaller(bool bDoStall=true)
Definition D3D11Util.h:289