Skip to content

Commit

Permalink
Added usage of AMD device_info library, printing its information
Browse files Browse the repository at this point in the history
Printing structure GDT_GfxCardInfo, GDT_DeviceInfo.
  • Loading branch information
sawickiap committed Feb 1, 2025
1 parent bace8dd commit 9583045
Show file tree
Hide file tree
Showing 7 changed files with 262 additions and 31 deletions.
33 changes: 18 additions & 15 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
[submodule "Src/ThirdParty/gpudetect"]
path = Src/ThirdParty/gpudetect
url = https://github.com/GameTechDev/gpudetect.git
[submodule "Src/ThirdParty/rapidjson"]
path = Src/ThirdParty/rapidjson
url = https://github.com/Tencent/rapidjson.git
[submodule "Src/ThirdParty/nvapi"]
path = Src/ThirdParty/nvapi
url = https://github.com/NVIDIA/nvapi.git
[submodule "Src/ThirdParty/AGS_SDK"]
path = Src/ThirdParty/AGS_SDK
url = https://github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK.git
[submodule "Src/ThirdParty/Vulkan-Headers"]
path = Src/ThirdParty/Vulkan-Headers
url = https://github.com/KhronosGroup/Vulkan-Headers.git
[submodule "Src/ThirdParty/gpudetect"]
path = Src/ThirdParty/gpudetect
url = https://github.com/GameTechDev/gpudetect.git
[submodule "Src/ThirdParty/rapidjson"]
path = Src/ThirdParty/rapidjson
url = https://github.com/Tencent/rapidjson.git
[submodule "Src/ThirdParty/nvapi"]
path = Src/ThirdParty/nvapi
url = https://github.com/NVIDIA/nvapi.git
[submodule "Src/ThirdParty/AGS_SDK"]
path = Src/ThirdParty/AGS_SDK
url = https://github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK.git
[submodule "Src/ThirdParty/Vulkan-Headers"]
path = Src/ThirdParty/Vulkan-Headers
url = https://github.com/KhronosGroup/Vulkan-Headers.git
[submodule "Src/ThirdParty/AMD_device_info"]
path = Src/ThirdParty/AMD_device_info
url = https://github.com/GPUOpen-Tools/device_info.git
21 changes: 21 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,18 @@ else()
message(STATUS "AMD AGS library not used.")
endif()

option(ENABLE_AMD_DEVICE_INFO "Enables usage of AMD device_info library." ON)
if(ENABLE_AMD_DEVICE_INFO)
if(EXISTS "${PROJECT_SOURCE_DIR}/Src/ThirdParty/AMD_device_info/DeviceInfo.h")
message(STATUS "AMD device_info library used.")
else()
message(STATUS "AMD device_info library not found. This is likely due to missing submodule. Please initialize submodules or set ENABLE_AMD_DEVICE_INFO to OFF.")
set(ENABLE_AMD_DEVICE_INFO OFF)
endif()
else()
message(STATUS "AMD device_info library not used.")
endif()

option(ENABLE_NVAPI "Enables usage of NVAPI library." ON)
if(ENABLE_NVAPI)
if(EXISTS "${PROJECT_SOURCE_DIR}/Src/ThirdParty/nvapi/nvapi.h")
Expand Down Expand Up @@ -112,6 +124,15 @@ function(add_my_executable USE_PREVIEW_AGILITY_SDK)
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${PROJECT_SOURCE_DIR}/Src/ThirdParty/AGS_SDK/ags_lib/lib/amd_ags_x64.dll" "$<TARGET_FILE_DIR:${EXE_NAME}>/")
endif()

if(ENABLE_AMD_DEVICE_INFO)
target_compile_definitions(${EXE_NAME} PRIVATE USE_AMD_DEVICE_INFO=1)
set(AMD_DEVICE_INFO_SOURCE_FILES
"Src/ThirdParty/AMD_device_info/DeviceInfo.cpp"
"Src/ThirdParty/AMD_device_info/DeviceInfo.h")
target_sources(${EXE_NAME} PRIVATE ${AMD_DEVICE_INFO_SOURCE_FILES})
source_group("ThirdParty/AMD_device_info" FILES ${AMD_DEVICE_INFO_SOURCE_FILES})
endif()

if(ENABLE_NVAPI)
target_compile_definitions(${EXE_NAME} PRIVATE USE_NVAPI=1)
target_include_directories(${EXE_NAME} PRIVATE "${PROJECT_SOURCE_DIR}/Src/ThirdParty/nvapi")
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Following types of information are printed by the program:
- Graphics driver version, fetched in a multitude of ways.
- Basic information about the operating system, e.g. Windows version, system memory size.
- Basic information fetched from Vulkan, focused on general GPU description and driver version.
- On AMD GPUs: Information fetched using their AGS library, e.g. more detailed parameters of the hardware and the availability of custom extensions like `userMarkers`, `appRegistration`, `shaderClock`.
- On AMD GPUs: Information fetched using their AGS library and device_info library, e.g. more detailed parameters of the hardware and the availability of custom extensions like `userMarkers`, `appRegistration`, `shaderClock`.
- On Nvidia GPUs: Information fetched using their NVAPI library, e.g. more detailed parameters of the hardware and the availability of custom extensions like `NVAPI_D3D12_RAYTRACING_CAPS_TYPE_THREAD_REORDERING`, `*OPACITY_MICROMAP`, `*DISPLACEMENT_MICROMAP`.
- On Intel GPUs: Information fetched from their GPU Detect library, e.g. more detailed parameters of the hardware.

Expand Down Expand Up @@ -94,6 +94,9 @@ It uses following thirt-party libraries:
- **[AMD GPU Services](https://github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK)** - custom vendor extensions to graphics APIs by AMD.
- Linked via submodule.
- Optional, controlled by Cmake variable `ENABLE_AGS` - on by default.
- **[AMD device_info](https://github.com/GPUOpen-Tools/device_info)** - a library with a list of AMD GPUs. License: MIT.
- Linked via submodule.
- Optional, controlled by Cmake variable `ENABLE_AMD_DEVICE_INFO` - on by default.
- **[NVAPI](https://developer.nvidia.com/nvapi)** - custom vendor extensions to graphics APIs by Nvidia.
- Linked via submodule.
- Optional, controlled by Cmake variable `ENABLE_NVAPI` - on by default.
Expand Down
148 changes: 148 additions & 0 deletions Src/AmdDeviceInfoData.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
/*
This file is part of D3d12info project:
https://github.com/sawickiap/D3d12info
Copyright (c) 2018-2025 Adam Sawicki, https://asawicki.info
License: MIT
For more information, see files README.md, LICENSE.txt.
*/
#include "AmdDeviceInfoData.hpp"
#include "Printing.hpp"
#include "Utils.hpp"
#include "Json.hpp"
#include "Enums.hpp"

// Macro set by Cmake.
#if USE_AMD_DEVICE_INFO

////////////////////////////////////////////////////////////////////////////////
// PRIVATE

#include "ThirdParty/AMD_device_info/DeviceInfo.h"

ENUM_BEGIN(GDT_HW_ASIC_TYPE)
ENUM_ITEM(GDT_ASIC_TYPE_NONE)
ENUM_ITEM(GDT_TAHITI_PRO)
ENUM_ITEM(GDT_TAHITI_XT)
ENUM_ITEM(GDT_PITCAIRN_PRO)
ENUM_ITEM(GDT_PITCAIRN_XT)
ENUM_ITEM(GDT_CAPEVERDE_PRO)
ENUM_ITEM(GDT_CAPEVERDE_XT)
ENUM_ITEM(GDT_OLAND)
ENUM_ITEM(GDT_HAINAN)
ENUM_ITEM(GDT_BONAIRE)
ENUM_ITEM(GDT_HAWAII)
ENUM_ITEM(GDT_KALINDI)
ENUM_ITEM(GDT_SPECTRE)
ENUM_ITEM(GDT_SPECTRE_SL)
ENUM_ITEM(GDT_SPECTRE_LITE)
ENUM_ITEM(GDT_SPOOKY)
ENUM_ITEM(GDT_ICELAND)
ENUM_ITEM(GDT_TONGA)
ENUM_ITEM(GDT_CARRIZO)
ENUM_ITEM(GDT_CARRIZO_EMB)
ENUM_ITEM(GDT_FIJI)
ENUM_ITEM(GDT_STONEY)
ENUM_ITEM(GDT_ELLESMERE)
ENUM_ITEM(GDT_BAFFIN)
ENUM_ITEM(GDT_GFX8_0_4)
ENUM_ITEM(GDT_VEGAM1)
ENUM_ITEM(GDT_VEGAM2)
ENUM_ITEM(GDT_GFX9_0_0)
ENUM_ITEM(GDT_GFX9_0_2)
ENUM_ITEM(GDT_GFX9_0_4)
ENUM_ITEM(GDT_GFX9_0_6)
ENUM_ITEM(GDT_GFX9_0_9)
ENUM_ITEM(GDT_GFX9_0_A)
ENUM_ITEM(GDT_GFX9_0_C)
ENUM_ITEM(GDT_GFX9_4_2)
ENUM_ITEM(GDT_GFX10_1_0)
ENUM_ITEM(GDT_GFX10_1_0_XL)
ENUM_ITEM(GDT_GFX10_1_2)
ENUM_ITEM(GDT_GFX10_1_1)
ENUM_ITEM(GDT_GFX10_3_0)
ENUM_ITEM(GDT_GFX10_3_1)
ENUM_ITEM(GDT_GFX10_3_2)
ENUM_ITEM(GDT_GFX10_3_3)
ENUM_ITEM(GDT_GFX10_3_4)
ENUM_ITEM(GDT_GFX10_3_5)
ENUM_ITEM(GDT_GFX11_0_0)
ENUM_ITEM(GDT_GFX11_0_1)
ENUM_ITEM(GDT_GFX11_0_2)
ENUM_ITEM(GDT_GFX11_0_3)
ENUM_ITEM(GDT_GFX11_0_3B)
ENUM_ITEM(GDT_GFX11_5_0)
ENUM_ITEM(GDT_LAST)
ENUM_END(GDT_HW_ASIC_TYPE)

ENUM_BEGIN(GDT_HW_GENERATION)
ENUM_ITEM(GDT_HW_GENERATION_NONE)
ENUM_ITEM(GDT_HW_GENERATION_NVIDIA)
ENUM_ITEM(GDT_HW_GENERATION_INTEL)
ENUM_ITEM(GDT_HW_GENERATION_SOUTHERNISLAND)
ENUM_ITEM(GDT_HW_GENERATION_FIRST_AMD)
ENUM_ITEM(GDT_HW_GENERATION_SEAISLAND)
ENUM_ITEM(GDT_HW_GENERATION_VOLCANICISLAND)
ENUM_ITEM(GDT_HW_GENERATION_GFX9)
ENUM_ITEM(GDT_HW_GENERATION_GFX10)
ENUM_ITEM(GDT_HW_GENERATION_GFX103)
ENUM_ITEM(GDT_HW_GENERATION_GFX11)
ENUM_ITEM(GDT_HW_GENERATION_CDNA)
ENUM_ITEM(GDT_HW_GENERATION_CDNA2)
ENUM_ITEM(GDT_HW_GENERATION_CDNA3)
ENUM_ITEM(GDT_HW_GENERATION_LAST)
ENUM_END(GDT_HW_GENERATION)

static const GDT_GfxCardInfo* FindCardInfo(const AmdDeviceInfo_Initialize_RAII::DeviceId& id)
{
for(size_t i = 0; i < gs_cardInfoSize; ++i)
{
const GDT_GfxCardInfo& info = gs_cardInfo[i];
if(info.m_deviceID == id.deviceId &&
(info.m_revID == id.revisionId || info.m_revID == REVISION_ID_ANY))
{
return &info;
}
}
return nullptr;
}

////////////////////////////////////////////////////////////////////////////////
// PUBLIC

void AmdDeviceInfo_Initialize_RAII::PrintDeviceData(const DeviceId& id)
{
const GDT_GfxCardInfo* const cardInfo = FindCardInfo(id);
if(!cardInfo)
return;

{
ScopedStructRegion region{L"AMD GDT_GfxCardInfo"};
PrintEnum(L"asicType", cardInfo->m_asicType, Enum_GDT_HW_ASIC_TYPE);
PrintEnum(L"generation", cardInfo->m_generation, Enum_GDT_HW_GENERATION);
Print_BOOL(L"APU", cardInfo->m_bAPU ? TRUE : FALSE);
Print_string(L"CALName", StrToWstr(cardInfo->m_szCALName, CP_UTF8).c_str());
Print_string(L"MarketingName", StrToWstr(cardInfo->m_szMarketingName, CP_UTF8).c_str());
}

if(cardInfo->m_asicType >= 0 && cardInfo->m_asicType < gs_deviceInfoSize)
{
const GDT_DeviceInfo& devInfo = gs_deviceInfo[cardInfo->m_asicType];
if(devInfo.m_deviceInfoValid)
{
ScopedStructRegion region(L"AMD GDT_DeviceInfo");
Print_uint64(L"NumShaderEngines", devInfo.m_nNumShaderEngines); // Number of shader engines.
Print_uint64(L"MaxWavePerSIMD", devInfo.m_nMaxWavePerSIMD); // Number of wave slots per SIMD.
Print_uint64(L"ClocksPrim", devInfo.m_suClocksPrim); // Number of clocks it takes to process a primitive.
Print_uint64(L"NumSQMaxCounters", devInfo.m_nNumSQMaxCounters); // Max number of SQ counters.
Print_uint64(L"NumPrimPipes", devInfo.m_nNumPrimPipes); // Number of primitive pipes.
Print_uint64(L"WaveSize", devInfo.m_nWaveSize); // Wavefront size.
Print_uint64(L"NumSHPerSE", devInfo.m_nNumSHPerSE); // Number of shader array per Shader Engine.
Print_uint64(L"NumCUPerSH", devInfo.m_nNumCUPerSH); // Number of compute unit per Shader Array.
Print_uint64(L"NumSIMDPerCU", devInfo.m_nNumSIMDPerCU); // Number of SIMDs per Compute unit.
}
}
}

#endif // #if USE_AMD_DEVICE_INFO
29 changes: 29 additions & 0 deletions Src/AmdDeviceInfoData.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
This file is part of D3d12info project:
https://github.com/sawickiap/D3d12info
Copyright (c) 2018-2025 Adam Sawicki, https://asawicki.info
License: MIT
For more information, see files README.md, LICENSE.txt.
*/
#pragma once

// Macro set by Cmake.
#if USE_AMD_DEVICE_INFO

class AmdDeviceInfo_Initialize_RAII
{
public:
struct DeviceId
{
uint32_t deviceId, revisionId;
};
void PrintDeviceData(const DeviceId& id);
};

#else

class AmdDeviceInfo_Initialize_RAII { };

#endif // #if USE_AMD_DEVICE_INFO
Loading

0 comments on commit 9583045

Please sign in to comment.