/* * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. * * NVIDIA CORPORATION and its licensors retain all intellectual property * and proprietary rights in and to this software, related documentation * and any modifications thereto. Any use, reproduction, disclosure or * distribution of this software and related documentation without an express * license agreement from NVIDIA CORPORATION is strictly prohibited. */ /* * █████ █████ ██████ ████ ████ ███████ ████ ██████ ██ ██ * ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ * ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ * ██████ ████ ██ ████ █████ ██ ██ ██ ██████ ██ ███████ * ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ * ██ ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ██ ██ ██ DEBUGGER * ██ ██ * ████████████████████████████████████████████████████████ ██ █ ██ ████████████ * * * HOW TO DECODE AFTERMATH GPU CRASH DUMPS: * ---------------------------------------- * * 1) Call 'GFSDK_Aftermath_GpuCrashDump_CreateDecoder', to create a decoder object for * a GPU crash dump. * * * 2) Call one or more of the 'GFSDK_Aftermath_GpuCrashDump_Get*' functions with this * decoder, to query information from the GPU crash dump. * * Some of the functions require caller allocated buffers to return the data. Those * are accompanied with a corresponding 'GFSDK_Aftermath_GpuCrashDump_Get*Count()' * function to query the element count the caller has to reserve for these buffers. * * If the requested data is not avilable in the crash dump the functions will return * with GFSDK_Aftermath_Result_NotAvailable. * * * 3) Call 'GFSDK_Aftermath_GpuCrashDump_DestroyDecoder', to destroy the decoder object * and cleanup all related memory. * */ #ifndef GFSDK_Aftermath_CrashDumpDecoding_H #define GFSDK_Aftermath_CrashDumpDecoding_H #include "GFSDK_Aftermath_Defines.h" #pragma pack(push, 8) #ifdef __cplusplus extern "C" { #endif // Constants used in crash dump decoding functions enum { GFSDK_Aftermath_MAX_STRING_LENGTH = 127, }; // Unique identifier for shader debug information typedef struct GFSDK_Aftermath_ShaderDebugInfoIdentifier { uint64_t id[2]; } GFSDK_Aftermath_ShaderDebugInfoIdentifier; // Unique identifier for shader binaries typedef struct GFSDK_Aftermath_ShaderHash { uint64_t hash; } GFSDK_Aftermath_ShaderHash; // Unique identifier for shader instructions typedef struct GFSDK_Aftermath_ShaderInstructionsHash { uint64_t hash; } GFSDK_Aftermath_ShaderInstructionsHash; // Shader DebugName, i.e. a unique identifier for shader source debug information typedef struct GFSDK_Aftermath_ShaderDebugName { char name[GFSDK_Aftermath_MAX_STRING_LENGTH + 1]; } GFSDK_Aftermath_ShaderDebugName; // SPIR-V shader code #if defined(VULKAN_H_) typedef struct GFSDK_Aftermath_SpirvCode { GFSDK_AFTERMATH_DECLARE_POINTER_MEMBER(void*, pData); uint32_t size; } GFSDK_Aftermath_SpirvCode; #endif // Graphics API GFSDK_AFTERMATH_DECLARE_ENUM(GraphicsApi) { GFSDK_Aftermath_GraphicsApi_Unknown = 0, GFSDK_Aftermath_GraphicsApi_D3D_10_0 = 1, GFSDK_Aftermath_GraphicsApi_D3D_10_1 = 2, GFSDK_Aftermath_GraphicsApi_D3D_11_0 = 3, GFSDK_Aftermath_GraphicsApi_D3D_11_1 = 4, GFSDK_Aftermath_GraphicsApi_D3D_11_2 = 5, GFSDK_Aftermath_GraphicsApi_D3D_12_0 = 6, GFSDK_Aftermath_GraphicsApi_Vulkan = 7, }; // GPU crash dump - base information typedef struct GFSDK_Aftermath_GpuCrashDump_BaseInfo { char applicationName[GFSDK_Aftermath_MAX_STRING_LENGTH + 1]; char creationDate[GFSDK_Aftermath_MAX_STRING_LENGTH + 1]; uint32_t pid; GFSDK_Aftermath_GraphicsApi graphicsApi; } GFSDK_Aftermath_GpuCrashDump_BaseInfo; // GPU crash dump - device information typedef struct GFSDK_Aftermath_GpuCrashDump_DeviceInfo { GFSDK_Aftermath_Device_Status status; GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(adapterReset); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(channel3dReset); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(channelComputeReset); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(channelCopyReset); } GFSDK_Aftermath_GpuCrashDump_DeviceInfo; // GPU crash dump - system information typedef struct GFSDK_Aftermath_GpuCrashDump_SystemInfo { char osVersion[GFSDK_Aftermath_MAX_STRING_LENGTH + 1]; struct DisplayDriverVersion { uint32_t major; uint32_t minor; } displayDriver; } GFSDK_Aftermath_GpuCrashDump_SystemInfo; // GPU crash dump - GPU information typedef struct GFSDK_Aftermath_GpuCrashDump_GpuInfo { char adapterName[GFSDK_Aftermath_MAX_STRING_LENGTH + 1]; char generationName[GFSDK_Aftermath_MAX_STRING_LENGTH + 1]; uint64_t adapterLUID; } GFSDK_Aftermath_GpuCrashDump_GpuInfo; // GPU crash dump - page fault information typedef struct GFSDK_Aftermath_GpuCrashDump_PageFaultInfo { uint64_t faultingGpuVA; GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(bHasResourceInfo); struct ResourceInfo { uint64_t gpuVa; uint64_t size; uint32_t width; uint32_t height; uint32_t depth; uint32_t mipLevels; uint32_t format; // DXGI_Format for DX, VkFormat for Vulkan GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(bIsBufferHeap); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(bIsStaticTextureHeap); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(bIsRenderTargetOrDepthStencilViewHeap); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(bPlacedResource); GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(bWasDestroyed); uint32_t createDestroyTickCount; } resourceInfo; } GFSDK_Aftermath_GpuCrashDump_PageFaultInfo; // GPU crash dump - shader types GFSDK_AFTERMATH_DECLARE_ENUM(ShaderType) { GFSDK_Aftermath_ShaderType_Unknown = 0, GFSDK_Aftermath_ShaderType_Vertex, GFSDK_Aftermath_ShaderType_Tessellation_Control, GFSDK_Aftermath_ShaderType_Hull = GFSDK_Aftermath_ShaderType_Tessellation_Control, GFSDK_Aftermath_ShaderType_Tessellation_Evaluation, GFSDK_Aftermath_ShaderType_Domain = GFSDK_Aftermath_ShaderType_Tessellation_Evaluation, GFSDK_Aftermath_ShaderType_Geometry, GFSDK_Aftermath_ShaderType_Fragment, GFSDK_Aftermath_ShaderType_Pixel = GFSDK_Aftermath_ShaderType_Fragment, GFSDK_Aftermath_ShaderType_Compute, GFSDK_Aftermath_ShaderType_RayTracing_RayGeneration, GFSDK_Aftermath_ShaderType_RayTracing_Miss, GFSDK_Aftermath_ShaderType_RayTracing_Intersection, GFSDK_Aftermath_ShaderType_RayTracing_AnyHit, GFSDK_Aftermath_ShaderType_RayTracing_ClosestHit, GFSDK_Aftermath_ShaderType_RayTracing_Callable, GFSDK_Aftermath_ShaderType_RayTracing_Internal, GFSDK_Aftermath_ShaderType_Mesh, GFSDK_Aftermath_ShaderType_Task, }; // GPU crash dump - shader information typedef struct GFSDK_Aftermath_GpuCrashDump_ShaderInfo { uint64_t shaderHash; uint64_t shaderInstance; GFSDK_AFTERMATH_DECLARE_BOOLEAN_MEMBER(isInternal); GFSDK_Aftermath_ShaderType shaderType; } GFSDK_Aftermath_GpuCrashDump_ShaderInfo; // GPU crash dump - Event marker context type GFSDK_AFTERMATH_DECLARE_ENUM(Context_Type) { GFSDK_Aftermath_Context_Type_Invalid = 0, GFSDK_Aftermath_Context_Type_Immediate, GFSDK_Aftermath_Context_Type_CommandList, GFSDK_Aftermath_Context_Type_Bundle, GFSDK_Aftermath_Context_Type_CommandQueue }; // GPU crash dump - Event marker data ownership GFSDK_AFTERMATH_DECLARE_ENUM(EventMarkerDataOwnership) { // Data is owned by the user application GFSDK_Aftermath_EventMarkerDataOwnership_User = 0, // Data is part of the crash dump and is owned by the decoder GFSDK_Aftermath_EventMarkerDataOwnership_Decoder, }; // GPU crash dump - Aftermath event marker information // NOTE: If GFSDK_Aftermath_SetEventMarker was called with markerSize=0, // markerDataOwnership will be set to GFSDK_Aftermath_EventMarkerDataOwnership_User // and the markerData pointer will be only valid within the context of the process // setting the marker and if the application properly manages the lifetime of the // pointed to data. It is the responsibility of the caller to ensure that the pointer // is valid before accessing the pointed to data. typedef struct GFSDK_Aftermath_GpuCrashDump_EventMarkerInfo { uint64_t contextId; GFSDK_Aftermath_Context_Status contextStatus; GFSDK_Aftermath_Context_Type contextType; GFSDK_AFTERMATH_DECLARE_POINTER_MEMBER(const void*, markerData); GFSDK_Aftermath_EventMarkerDataOwnership markerDataOwnership; uint32_t markerDataSize; } GFSDK_Aftermath_GpuCrashDump_EventMarkerInfo; // Flags that control the behavior of GFSDK_Aftermath_GpuCrashDump_GenerateJSON GFSDK_AFTERMATH_DECLARE_ENUM(GpuCrashDumpDecoderFlags) { // Include basic information about the GPU crash dump. GFSDK_Aftermath_GpuCrashDumpDecoderFlags_BASE_INFO = 0x1, // Include information about the device state GFSDK_Aftermath_GpuCrashDumpDecoderFlags_DEVICE_INFO = 0x2, // Include information about the OS GFSDK_Aftermath_GpuCrashDumpDecoderFlags_OS_INFO = 0x4, // Include information about the display driver GFSDK_Aftermath_GpuCrashDumpDecoderFlags_DISPLAY_DRIVER_INFO = 0x8, // Include information about the GPU GFSDK_Aftermath_GpuCrashDumpDecoderFlags_GPU_INFO = 0x10, // Include information about page faults (if available) GFSDK_Aftermath_GpuCrashDumpDecoderFlags_PAGE_FAULT_INFO = 0x20, // Include information about shaders (if available) GFSDK_Aftermath_GpuCrashDumpDecoderFlags_SHADER_INFO = 0x40, // Include information about active warps (if available) GFSDK_Aftermath_GpuCrashDumpDecoderFlags_WARP_STATE_INFO = 0x80, // Try to map shader addresses to source or intermediate assembly lines // using additional information provided through shaderDebugInfoLookupCb, // shaderLookupCb and shaderInstructionsLookupCb, if provided. GFSDK_Aftermath_GpuCrashDumpDecoderFlags_SHADER_MAPPING_INFO = 0x100, // Include Aftermath event marker data (if available) GFSDK_Aftermath_GpuCrashDumpDecoderFlags_EVENT_MARKER_INFO = 0x200, // Include automatic event marker call stack data (if available) GFSDK_Aftermath_GpuCrashDumpDecoderFlags_CALL_STACK_INFO = 0x400, // Include user provided GPU crash dump description values (if available) GFSDK_Aftermath_GpuCrashDumpDecoderFlags_DESCRIPTION_INFO = 0x800, // Include all available information GFSDK_Aftermath_GpuCrashDumpDecoderFlags_ALL_INFO= 0xFFF, }; GFSDK_AFTERMATH_DECLARE_ENUM(GpuCrashDumpFormatterFlags) { // No special formatting GFSDK_Aftermath_GpuCrashDumpFormatterFlags_NONE = 0x0, // Remove all unnecessary whitespace from formatted string GFSDK_Aftermath_GpuCrashDumpFormatterFlags_CONDENSED_OUTPUT = 0x1, // Use UTF8 encoding GFSDK_Aftermath_GpuCrashDumpFormatterFlags_UTF8_OUTPUT = 0x2, }; // Crash dump decoder handle GFSDK_AFTERMATH_DECLARE_HANDLE(GFSDK_Aftermath_GpuCrashDump_Decoder); // Function for providing shader debug information and shader binary to the crash dump decoder typedef void(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_SetData)(const void* pData, uint32_t size); // GPU crash dump decoder callback definitions typedef void(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_ShaderDebugInfoLookupCb)(const GFSDK_Aftermath_ShaderDebugInfoIdentifier* pIdentifier, PFN_GFSDK_Aftermath_SetData setShaderDebugInfo, void* pUserData); typedef void(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_ShaderLookupCb)(const GFSDK_Aftermath_ShaderHash* pShaderHash, PFN_GFSDK_Aftermath_SetData setShaderBinary, void* pUserData); typedef void(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_ShaderInstructionsLookupCb)(const GFSDK_Aftermath_ShaderInstructionsHash* pShaderInstructionsHash, PFN_GFSDK_Aftermath_SetData setShaderBinary, void* pUserData); typedef void(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_ShaderSourceDebugInfoLookupCb)(const GFSDK_Aftermath_ShaderDebugName* pShaderDebugName, PFN_GFSDK_Aftermath_SetData setShaderBinary, void* pUserData); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_CreateDecoder // --------------------------------- // // apiVersion; // Must be set to GFSDK_Aftermath_Version_API. Used for checking against library // version. // // pGpuCrashDump; // Pointer to GPU crash dump data captured in a GFSDK_Aftermath_GpuCrashDumpCb // callback. // // gpuCrashDumpSize; // Size of GPU crash dump data in bytes. // // pDecoder; // Pointer to a decoder object owned by the caller that is initialized. // //// DESCRIPTION; // Create a decoder object that can be used to query information about the // provided GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_CreateDecoder( GFSDK_Aftermath_Version apiVersion, const void* pGpuCrashDump, const uint32_t gpuCrashDumpSize, GFSDK_Aftermath_GpuCrashDump_Decoder* pDecoder); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_DestroyDecoder // --------------------------------- // // decoder; // A valid decoder object. // //// DESCRIPTION; // Free any data related to the passed in decoder object. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_DestroyDecoder( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetBaseInfo // --------------------------------- // // decoder; // A valid decoder object. // // pBaseInfo; // Pointer to data structure owned by the caller that is filled in with // information from the GPU crash dump. // //// DESCRIPTION; // Query basic information from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetBaseInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_BaseInfo* pBaseInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetDescriptionSize // --------------------------------- // // decoder; // A valid decoder object. // // key; // What value to query from the description section. // // pValueSize; // Populated with the size of the value in bytes (including 0-termination // of the string). // //// DESCRIPTION; // Query the size of a description value from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetDescriptionSize( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t key, uint32_t* pValueSize); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetDescription // --------------------------------- // // decoder; // A valid decoder object. // // key; // What value to query from the description section. // // valueBufferSize; // Size in bytes of the caller allocated results buffer pValue. // // pValue; // Caller allocated results buffer. // //// DESCRIPTION; // Query description value from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetDescription( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t key, const uint32_t valueBufferSize, char* pValue); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetDeviceInfo // --------------------------------- // // decoder; // A valid decoder object. // // pDeviceInfo; // Pointer to data structure owned by the caller that is filled in with // information from the GPU crash dump. // //// DESCRIPTION; // Query device state information from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetDeviceInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_DeviceInfo* pDeviceInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetSystemInfo // --------------------------------- // // decoder; // A valid decoder object. // // pSystemInfo; // Pointer to data structure owned by the caller that is filled in with // information from the GPU crash dump. // //// DESCRIPTION; // Query system information (OS, display driver) from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetSystemInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_SystemInfo* pSystemInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetGpuInfoCount // --------------------------------- // // decoder; // A valid decoder object. // // pGpuCount; // Populated with the number of GPU entries in the GPU crash dump. // //// DESCRIPTION; // Query number of GPU entries from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetGpuInfoCount( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t* pGpuCount); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetGpuInfo // --------------------------------- // // decoder; // A valid decoder object. // // gpuInfoBufferCount; // Number of elements in caller allocated array passed in pGpuInfo. // // pGpuInfo; // Pointer to caller allocated array of GFSDK_Aftermath_GpuCrashDump_GpuInfo // that is filled in with information from the GPU crash dump. // //// DESCRIPTION; // Query information about the GPUs from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetGpuInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t gpuInfoBufferCount, GFSDK_Aftermath_GpuCrashDump_GpuInfo* pGpuInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetPageFaultInfo // --------------------------------- // // decoder; // A valid decoder object. // // pPageFaultInfo; // Pointer to data structure owned by the caller that is filled in with // information from the GPU crash dump. // //// DESCRIPTION; // Query page fault information from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetPageFaultInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_PageFaultInfo* pPageFaultInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetActiveShadersInfoCount // --------------------------------- // // decoder; // A valid decoder object. // // pShaderCount; // Populated with the number of active shaders in the GPU crash dump. // //// DESCRIPTION; // Query the number of active shaders from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetActiveShadersInfoCount( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t* pShaderCount); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetActiveShadersInfo // --------------------------------- // // decoder; // A valid decoder object. // // shaderInfoBufferCount; // Number of elements in caller allocated array passed in pShaderInfo. // // pShaderInfo; // Pointer to caller allocated array of GFSDK_Aftermath_GpuCrashDump_ShaderInfo // that is filled in with information from the GPU crash dump. // //// DESCRIPTION; // Query information about active shaders from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetActiveShadersInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t shaderInfoBufferCount, GFSDK_Aftermath_GpuCrashDump_ShaderInfo* pShaderInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetEventMarkersInfoCount // --------------------------------- // // decoder; // A valid decoder object. // // pMarkerCount; // Populated with the number of event markers in the GPU crash dump. // //// DESCRIPTION; // Query the number of event markers from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetEventMarkersInfoCount( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t* pMarkerCount); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetEventMarkersInfo // --------------------------------- // // decoder; // A valid decoder object. // // markerInfoBufferCount; // Number of elements in caller allocated array passed in pMarkerInfo. // // pMarkerInfo; // Pointer to caller allocated array of GFSDK_Aftermath_GpuCrashDump_EventMarkerInfo // that is filled in with information from the GPU crash dump. // //// DESCRIPTION; // Query information about event markers from a GPU crash dump. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetEventMarkersInfo( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t markerInfoBufferCount, GFSDK_Aftermath_GpuCrashDump_EventMarkerInfo* pMarkerInfo); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GenerateJSON // --------------------------------- // // decoder; // A valid decoder object. // // decoderFlags; // Flags that define what information to include in the decoding. Bitwise OR of any // of the flags defined in GFSDK_Aftermath_GpuCrashDumpDecoderFlags. // // formatFlags; // Flags controlling the formatting. Bitwise OR of any of the flags defined in // GFSDK_Aftermath_GpuCrashDumpFormatterFlags. // // shaderDebugInfoLookupCb; // Callback used by the decoder to query shader debug information for mapping shader // addresses to source or intermediate assembly line. // Optional, can be NULL. // Used when GFSDK_Aftermath_GpuCrashDumpDecoderFlags_SHADER_MAPPING_INFO is set in // decoderFlags. // // shaderLookupCb; // Callback used by the decoder to query shader information for mapping shader // addresses to shader intermediate assembly (DXIL/SPIR-V) or source. // Optional, can be NULL. // Used when GFSDK_Aftermath_GpuCrashDumpDecoderFlags_SHADER_MAPPING_INFO is set in // decoderFlags. // // shaderInstructionsLookupCb; // Callback used by the decoder to query shader information for mapping shader // addresses to shader intermediate assembly (DXIL/SPIR-V) or source. // Optional, can be NULL. // Used when GFSDK_Aftermath_GpuCrashDumpDecoderFlags_SHADER_MAPPING_INFO is set in // decoderFlags. // // shaderSourceDebugInfoLookupCb; // Callback used by the decoder to query high-level shader debug information for // mapping shader addresses to shader source, if the shaders used by the application // are stripped off debug information. This lookup is done by the shader's DebugName, // a unique identifier of the source debug information. // // Optional, can be NULL. // Used when GFSDK_Aftermath_GpuCrashDumpDecoderFlags_SHADER_MAPPING_INFO is set in // decoderFlags. // // For DXIL shaders DebugName is generated by the dxc compiler and is defined here: // https://github.com/microsoft/DirectXShaderCompiler/blob/master/docs/SourceLevelDebuggingHLSL.rst#using-debug-names. // // The following variants of generating source shader debug information for DXIL shaders // are supported: // // 1) Compile and use a full shader blob // Compile the shaders with the debug information. Use the full (i.e. not // stripped) shader binary when running the application and make it accessible // through shaderLookupCb and shaderInstructionsLookupCb. In this case there is // no need to provide shaderSourceDebugInfoLookupCb. // // Compilation example: // dxc -Zi [..] -Fo shader.bin shader.hlsl // // 2) Compile and strip // Compile the shaders with debug information and then strip off the debug // information. Use the stripped shader binary data when running the application. // Make the stripped shader binary data accessible through shaderLookupCb and // shaderInstructionsLookupCb. In addition, make the non-stripped shader binary // data accessible through shaderSourceDebugInfoLookupCb. // // Compilation example: // dxc -Zi [..] -Fo full_shader.bin shader.hlsl // dxc -dumpbin -Qstrip_debug -Fo shader.bin full_shader.bin // // The shader's DebugName required for implementing the // shaderSourceDebugInfoLookupCb may be extracted from the stripped or the // non-stripped shader binary data with GFSDK_Aftermath_GetShaderDebugName(). // // 3) Compile with separate debug information (and auto-generated debug data file name) // Compile the shaders with debug information and instruct the compiler to store // the debug meta data in a separate shader debug information file. The name of // the file generated by the compiler will match the DebugName of the shader. // Make the shader binary data accessible through shaderLookupCb and // shaderInstructionsLookupCb. In addition, make the data from the compiler // generated shader debug data file accessible through // shaderSourceDebugInfoLookupCb. // // Compilation example: // dxc -Zi [..] -Fo shader.bin -Fd debugInfo\ shader.hlsl // // The debug data file generated by the compiler does not contain any reference to // the shader's DebugName. It is the responsibility of the user providing the // shaderSourceDebugInfoLookupCb callback to implement a solution to lookup the // debug data based on the name of the generated debug data file. // // 4) Compile with separate debug information (and user-defined debug data file name) // Compile the shaders with debug information and instruct the compiler to store // the debug meta data in a separate shader debug information file. The name of // the file is freely choosen by the user. Make the shader binary data accessible // through shaderLookupCb and shaderInstructionsLookupCb. In addition, make the // data from the compiler generated shader debug data file accessible through // shaderSourceDebugInfoLookupCb. // // Compilation example: // dxc -Zi [..] -Fo shader.bin -Fd debugInfo\shader.dbg shader.hlsl // // The debug data file generated by the compiler does not contain any reference to // the shader's DebugName. It is the responsibility of the user providing the // shaderSourceDebugInfoLookupCb callback to implement a solution that performs // the lookup of the debug data based on a mapping between the shader's DebugName // the debug data file's name that was chosen for the compilation. The shader's // DebugName may be extracted from the shader binary data with // GFSDK_Aftermath_GetShaderDebugName(). // // For SPIR-V shaders the Aftermath SDK provides support for the following variants of // generating source shader debug information: // // 1) Compile and use a full shader blob // Compile the shaders with the debug information. Use the full (i.e. not // stripped) shader binary when running the application and make it accessible // through shaderLookupCb. In this case there is no need to provide // shaderInstructionsLookupCb or shaderSourceDebugInfoLookupCb. // // Compilation example using Vulkan SDK tool-chain: // glslangValidator -V -g -o ./full/shader.spv shader.vert // // 2) Compile and strip // Compile the shaders with debug information and then strip off the debug // information. Use the stripped shader binary data when running the application. // Make the stripped shader binary data accessible through shaderLookupCb. // In addition, make the non-stripped shader binary data accessible through // shaderSourceDebugInfoLookupCb. // // Compilation example using Vulkan SDK tool-chain: // glslangValidator -V -g -o ./full/shader.spv shader.vert // spirv-remap --map all --strip-all --input full/shader.spv --output ./stripped/ // // Then pass the content of ./full/shader.spv and ./stripped/shader.spv to // GFSDK_Aftermath_GetDebugNameSpirv() to generate the debug name to use with // shaderSourceDebugInfoLookupCb. // // pUserData; // User data made available in callbacks. // // pJsonSize; // Populated with the size of the generated JSON data in bytes. // //// DESCRIPTION; // Decode a crash dump to JSON format. // The decoded JSON can be later queried by calling GFSDK_Aftermath_GpuCrashDump_GetJSON. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GenerateJSON( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t decoderFlags, uint32_t formatFlags, PFN_GFSDK_Aftermath_ShaderDebugInfoLookupCb shaderDebugInfoLookupCb, PFN_GFSDK_Aftermath_ShaderLookupCb shaderLookupCb, PFN_GFSDK_Aftermath_ShaderInstructionsLookupCb shaderInstructionsLookupCb, PFN_GFSDK_Aftermath_ShaderSourceDebugInfoLookupCb shaderSourceDebugInfoLookupCb, void* pUserData, uint32_t* pJsonSize); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GpuCrashDump_GetJSON // --------------------------------- // // decoder; // A valid decoder object. // // jsonBufferSize; // The size of the caller allocated buffer for the JSON data in bytes. // // pJson; // Caller allocated buffer populated with the JSON data (0-terminated string). // //// DESCRIPTION; // Copy the JSON generated by the last call to GFSDK_Aftermath_GpuCrashDump_GenerateJSON // into a caller provided buffer. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GpuCrashDump_GetJSON( const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t jsonBufferSize, char* pJson); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GetShaderDebugInfoIdentifier // --------------------------------- // // apiVersion; // Must be set to GFSDK_Aftermath_Version_API. Used for checking against library // version. // // pShaderDebugInfo; // Pointer to shader debug information data captured in a GFSDK_Aftermath_ShaderDebugInfoCb callback. // // shaderDebugInfoSize; // Size in bytes of the shader debug information data. // // pIdentifier; // Pointer to GFSDK_Aftermath_ShaderDebugInfoIdentifier structure receiving the result // //// DESCRIPTION; // Read the shader debug information identifier from shader debug information. // The shader debug information identifier is required when implementing the // PFN_GFSDK_Aftermath_ShaderDebugInfoLookupCb callback. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_API GFSDK_Aftermath_GetShaderDebugInfoIdentifier( GFSDK_Aftermath_Version apiVersion, const void* pShaderDebugInfo, const uint32_t shaderDebugInfoSize, GFSDK_Aftermath_ShaderDebugInfoIdentifier* pIdentifier); ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GetShaderHash // --------------------------------- // // apiVersion; // Must be set to GFSDK_Aftermath_Version_API. Used for checking against library // version. // // pShader; // The binary shader blob for which to compute the identifier. // // pShaderHash; // Pointer to GFSDK_Aftermath_ShaderHash structure receiving the computed shader hash. // Optional, can be NULL. // // pShaderInstructionsHash; // Pointer to GFSDK_Aftermath_ShaderInstructionsHash structure receiving the computed // shader instructions hash. // Optional, can be NULL. // //// DESCRIPTION; // Computes shader hashes uniquely identifying the provided DXBC shader binary. // This is, for example, required for comparison in the shader binary lookup by // PFN_GFSDK_Aftermath_ShaderLookupCb or PFN_GFSDK_Aftermath_ShaderInstructionsLookupCb. // ///////////////////////////////////////////////////////////////////////// #if defined(__d3d12_h__) GFSDK_Aftermath_API GFSDK_Aftermath_GetShaderHash( GFSDK_Aftermath_Version apiVersion, const D3D12_SHADER_BYTECODE* pShader, GFSDK_Aftermath_ShaderHash* pShaderHash, GFSDK_Aftermath_ShaderInstructionsHash* pShaderInstructionsHash); #endif ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GetShaderHashSpirv // --------------------------------- // // apiVersion; // Must be set to GFSDK_Aftermath_Version_API. Used for checking against library // version. // // pShader; // The SPIR-V shader binary for which to compute the identifier. // // pShaderHash; // Pointer to GFSDK_Aftermath_ShaderHash structure receiving the computed shader hash. // Optional, can be NULL. // //// DESCRIPTION; // Computes a shader hash uniquely identifying the provided SPIR-V shader binary. // This is, for example, required for comparison in the shader binary lookup by // PFN_GFSDK_Aftermath_ShaderLookupCb. // ///////////////////////////////////////////////////////////////////////// #if defined(VULKAN_H_) GFSDK_Aftermath_API GFSDK_Aftermath_GetShaderHashSpirv( GFSDK_Aftermath_Version apiVersion, const GFSDK_Aftermath_SpirvCode *pShader, GFSDK_Aftermath_ShaderHash* pShaderHash); #endif ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GetShaderDebugName // --------------------------------- // // apiVersion; // Must be set to GFSDK_Aftermath_Version_API. Used for checking against library // version. // // pShader; // The binary shader data blob from which to extract the DebugName. // // pShaderDebugName; // Pointer to GFSDK_Aftermath_ShaderDebugName structure receiving the DebugName. // //// DESCRIPTION; // Extracts the shader's DebugName (if available) from the provided DXBC shader binary. // This is, for example, required for comparison in the shader debug data lookup by // PFN_GFSDK_Aftermath_ShaderSourceDebugInfoLookupCb. For more information about shader // debug names please read: // https://github.com/microsoft/DirectXShaderCompiler/blob/master/docs/SourceLevelDebuggingHLSL.rst#using-debug-names. // ///////////////////////////////////////////////////////////////////////// #if defined(__d3d12_h__) GFSDK_Aftermath_API GFSDK_Aftermath_GetShaderDebugName( GFSDK_Aftermath_Version apiVersion, const D3D12_SHADER_BYTECODE* pShader, GFSDK_Aftermath_ShaderDebugName* pShaderDebugName); #endif ///////////////////////////////////////////////////////////////////////// // GFSDK_Aftermath_GetShaderDebugNameSpirv // --------------------------------- // // apiVersion; // Must be set to GFSDK_Aftermath_Version_API. Used for checking against library // version. // // pShader; // The not-stripped SPIR-V binary shader data of the shader pair for which to // generate the DebugName. // // pStrippedShader; // The stripped SPIR-V binary shader data of the shader pair for which to // generate the DebugName. // // pShaderDebugName; // Pointer to GFSDK_Aftermath_ShaderDebugName structure receiving the DebugName. // //// DESCRIPTION; // Generates a shader DebugName from the provided pair of SPIR-V shader binary // data. This is, for example, required for comparison in the shader debug data // lookup by PFN_GFSDK_Aftermath_ShaderSourceDebugInfoLookupCb. For more information // about how to generate the pair of shader binaries, see the description of // GFSDK_Aftermath_GpuCrashDump_GenerateJSON(). // ///////////////////////////////////////////////////////////////////////// #if defined(VULKAN_H_) GFSDK_Aftermath_API GFSDK_Aftermath_GetShaderDebugNameSpirv( GFSDK_Aftermath_Version apiVersion, const GFSDK_Aftermath_SpirvCode *pShader, const GFSDK_Aftermath_SpirvCode *pStrippedShader, GFSDK_Aftermath_ShaderDebugName* pShaderDebugName); #endif ///////////////////////////////////////////////////////////////////////// // // NOTE: Function table provided - if dynamic loading is preferred. // ///////////////////////////////////////////////////////////////////////// GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_CreateDecoder)(GFSDK_Aftermath_Version apiVersion, const void* pGpuCrashDump, const uint32_t gpuCrashDumpSize, GFSDK_Aftermath_GpuCrashDump_Decoder* pDecoder); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_DestroyDecoder)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetBaseInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_BaseInfo* pBaseInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetDescriptionSize)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t key, uint32_t* pValueSize); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetDescription)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t key, const uint32_t valueBufferSize, char* pValue); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetDeviceInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_DeviceInfo* pDeviceInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetSystemInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_SystemInfo* pSystemInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetGpuInfoCount)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t* pGpuCount); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetGpuInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t gpuInfoBufferCount, GFSDK_Aftermath_GpuCrashDump_GpuInfo* pGpuInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetPageFaultInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, GFSDK_Aftermath_GpuCrashDump_PageFaultInfo* pPageFaultInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetActiveShadersInfoCount)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t* pShaderCount); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetActiveShadersInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t shaderInfoBufferCount, GFSDK_Aftermath_GpuCrashDump_ShaderInfo* pShaderInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetEventMarkersInfoCount)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t markerInfoBufferCount); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetEventMarkersInfo)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t markerInfoBufferCount, GFSDK_Aftermath_GpuCrashDump_EventMarkerInfo* pMarkerInfo); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GenerateJSON)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, uint32_t decoderFlags, uint32_t formatFlags, PFN_GFSDK_Aftermath_ShaderDebugInfoLookupCb shaderDebugInfoLookupCb, PFN_GFSDK_Aftermath_ShaderLookupCb shaderLookupCb, PFN_GFSDK_Aftermath_ShaderInstructionsLookupCb shaderInstructionsLookupCb, PFN_GFSDK_Aftermath_ShaderSourceDebugInfoLookupCb shaderSourceDebugInfoLookupCb, void* pUserData, uint32_t* pJsonSize); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GpuCrashDump_GetJSON)(const GFSDK_Aftermath_GpuCrashDump_Decoder decoder, const uint32_t jsonBufferSize, char* pJson); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GetShaderDebugInfoIdentifier)(GFSDK_Aftermath_Version apiVersion, const void* pShaderDebugInfo, const uint32_t shaderDebugInfoSize, GFSDK_Aftermath_ShaderDebugInfoIdentifier* pIdentifier); #if defined(__d3d12_h__) GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GetShaderHash)(GFSDK_Aftermath_Version apiVersion, const D3D12_SHADER_BYTECODE* pShader, GFSDK_Aftermath_ShaderHash* pShaderHash, GFSDK_Aftermath_ShaderInstructionsHash* pShaderInstructionsHash); GFSDK_Aftermath_PFN(*GPFN_GFSDK_Aftermath_GetShaderDebugName)(GFSDK_Aftermath_Version apiVersion, const D3D12_SHADER_BYTECODE* pShader, GFSDK_Aftermath_ShaderDebugName* pShaderDebugName); #endif #if defined(VULKAN_H_) GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GetShaderHashSpirv)(GFSDK_Aftermath_Version apiVersion, const GFSDK_Aftermath_SpirvCode *pShader, GFSDK_Aftermath_ShaderHash* pShaderHash); GFSDK_Aftermath_PFN(GFSDK_AFTERMATH_CALL *PFN_GFSDK_Aftermath_GetShaderDebugNameSpirv)(GFSDK_Aftermath_Version apiVersion, const GFSDK_Aftermath_SpirvCode *pShader, const GFSDK_Aftermath_SpirvCode *pStrippedShader, GFSDK_Aftermath_ShaderDebugName* pShaderDebugName); #endif #ifdef __cplusplus } // extern "C" #endif #pragma pack(pop) #endif // GFSDK_Aftermath_CrashDumpDecoding_H