Files
UnrealEngine/Engine/Source/Runtime/D3D12RHI/Private/D3D12IntelExtensions.cpp
2025-05-18 13:04:45 +08:00

106 lines
3.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "D3D12IntelExtensions.h"
#include "D3D12RHICommon.h"
#include "D3D12RHIPrivate.h"
#if INTEL_EXTENSIONS
#if INTEL_GPU_CRASH_DUMPS
namespace UE::RHICore::Intel::GPUCrashDumps
{
extern RHICORE_API TAutoConsoleVariable<int32> CVarIntelCrashDumps;
}
#endif // INTEL_GPU_CRASH_DUMPS
const INTCSupportedVersion SupportedExtensionsVersion[] = {
{ { 4, 8, 0 }, nullptr }, // Emulated Typed 64bit Atomics - this is required to run Nanite on ACM (DG2)
#if INTEL_GPU_CRASH_DUMPS
{ { 4, 14, 0 }, &( *UE::RHICore::Intel::GPUCrashDumps::CVarIntelCrashDumps) } // Intel GPU crash dumps
#endif // INTEL_GPU_CRASH_DUMPS
};
bool MatchIntelExtensionVersion(const INTCExtensionVersion& ExtensionsVersion)
{
uint32_t count = sizeof( SupportedExtensionsVersion ) / sizeof( SupportedExtensionsVersion[ 0 ] );
// We try to match the highest version first (most features)
for( int i = count - 1; i >= 0; i-- )
{
const INTCSupportedVersion& SupportedVersion = SupportedExtensionsVersion[ i ];
if( SupportedVersion.CVar && SupportedVersion.CVar->GetInt() == 0 )
{
continue; // skip disabled feature
}
if( ( ExtensionsVersion.HWFeatureLevel == SupportedVersion.Version.HWFeatureLevel ) &&
( ExtensionsVersion.APIVersion == SupportedVersion.Version.APIVersion ) &&
( ExtensionsVersion.Revision == SupportedVersion.Version.Revision ) )
{
// First match wins
return true;
}
}
// No matches
return false;
}
#if INTEL_GPU_CRASH_DUMPS
namespace UE::RHICore::Intel::GPUCrashDumps::D3D12
{
uint64_t RegisterCommandList( ID3D12CommandList* pCommandList )
{
if( !IsEnabled() )
{
return 0;
}
return INTC_D3D12_GetCommandListHandle( FD3D12DynamicRHI::GetD3DRHI()->GetIntelExtensionContext(), pCommandList );
}
#if WITH_RHI_BREADCRUMBS
void BeginBreadcrumb(ID3D12GraphicsCommandList* pCommandList, FRHIBreadcrumbNode* Breadcrumb)
{
if( !IsEnabled() )
{
return;
}
FMarker Marker(Breadcrumb);
if (Marker)
{
#if INTEL_BREADCRUMBS_USE_BREADCRUMB_PTRS
INTC_D3D12_SetEventMarker( FD3D12DynamicRHI::GetD3DRHI()->GetIntelExtensionContext(), pCommandList, INTC_EVENT_MARKER_BEGIN | INTC_EVENT_MARKER_PTR, Marker.GetPtr(), Marker.GetSize() );
#else
INTC_D3D12_SetEventMarker( FD3D12DynamicRHI::GetD3DRHI()->GetIntelExtensionContext(), pCommandList, INTC_EVENT_MARKER_BEGIN | INTC_EVENT_MARKER_WSTRING, Marker.GetPtr(), Marker.GetSize() );
#endif
}
}
void EndBreadcrumb(ID3D12GraphicsCommandList* pCommandList, FRHIBreadcrumbNode* Breadcrumb)
{
if( !IsEnabled() )
{
return;
}
FMarker Marker(Breadcrumb);
if (Marker)
{
#if INTEL_BREADCRUMBS_USE_BREADCRUMB_PTRS
INTC_D3D12_SetEventMarker( FD3D12DynamicRHI::GetD3DRHI()->GetIntelExtensionContext(), pCommandList, INTC_EVENT_MARKER_END | INTC_EVENT_MARKER_PTR, Marker.GetPtr(), Marker.GetSize() );
#else
INTC_D3D12_SetEventMarker( FD3D12DynamicRHI::GetD3DRHI()->GetIntelExtensionContext(), pCommandList, INTC_EVENT_MARKER_END | INTC_EVENT_MARKER_WSTRING, Marker.GetPtr(), Marker.GetSize() );
#endif
}
}
#endif
}
#endif // INTEL_GPU_CRASH_DUMPS
#endif // INTEL_EXTENSIONS