Use dxvk interop for gpu info detection

Co-authored-by: Astyyyyy <imapotatook123@gmail.com>
This commit is contained in:
FakeMichau
2026-05-07 16:27:09 +02:00
co-authored by Astyyyyy
parent 92dd1ab5a4
commit 8e975c727a
2 changed files with 57 additions and 6 deletions
+48 -2
View File
@@ -88,10 +88,56 @@ std::vector<GpuInformation> IdentifyGpu::checkGpuInfo()
std::wstring szName(adapterDesc.Description);
gpuInfo.name = wstring_to_string(szName);
ComPtr<IDXGIDXVKAdapter> dxvkAdapter;
if (SUCCEEDED(adapter->QueryInterface(IID_PPV_ARGS(&dxvkAdapter))))
ComPtr<IDXGIVkInteropAdapter> interopAdapter;
if (SUCCEEDED(adapter->QueryInterface(__uuidof(IDXGIVkInteropAdapter), (void**) &interopAdapter)))
{
gpuInfo.usesDxvk = true;
// Try to get the real GPU info when using dxvk.conf to spoof
ComPtr<IDXGIVkInteropFactory> interopFactory;
if (SUCCEEDED(factory->QueryInterface(__uuidof(IDXGIVkInteropFactory), (void**) &interopFactory)))
{
VkInstance vkInst = VK_NULL_HANDLE;
VkPhysicalDevice vkPhysDev = VK_NULL_HANDLE;
interopAdapter->GetVulkanHandles(&vkInst, &vkPhysDev);
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = VK_NULL_HANDLE;
interopFactory->GetVulkanInstance(&vkInst, &vkGetInstanceProcAddr);
if (vkPhysDev)
{
PFN_vkGetPhysicalDeviceProperties pvkGetProps = VK_NULL_HANDLE;
if (vkGetInstanceProcAddr && vkInst)
{
pvkGetProps = (PFN_vkGetPhysicalDeviceProperties) vkGetInstanceProcAddr(
vkInst, "vkGetPhysicalDeviceProperties");
}
if (!pvkGetProps)
{
HMODULE hVulkan = GetModuleHandleA("vulkan-1.dll");
pvkGetProps = hVulkan ? (PFN_vkGetPhysicalDeviceProperties) GetProcAddress(
hVulkan, "vkGetPhysicalDeviceProperties")
: nullptr;
}
if (pvkGetProps)
{
VkPhysicalDeviceProperties props {};
pvkGetProps(vkPhysDev, &props);
if (props.vendorID != gpuInfo.vendorId)
{
LOG_INFO("DXVK: unspoofing vendorId {:04X} -> {:04X} ({})", (uint32_t) gpuInfo.vendorId,
props.vendorID, props.deviceName);
gpuInfo.vendorId = (VendorId::Value) props.vendorID;
gpuInfo.deviceId = props.deviceID;
gpuInfo.name = props.deviceName;
}
}
}
}
}
if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
gpuInfo.softwareAdapter = true;
+9 -4
View File
@@ -32,12 +32,17 @@ ID3D12DXVKInteropDevice : public IUnknown
};
// dxvk
MIDL_INTERFACE("907bf281-ea3c-43b4-a8e4-9f231107b4ff")
IDXGIDXVKAdapter : public IDXGIAdapter4
MIDL_INTERFACE("3a6d8f2c-b0e8-4ab4-b4dc-4fd24891bfa5")
IDXGIVkInteropAdapter : public IUnknown
{
virtual void* STDMETHODCALLTYPE GetDXVKAdapter() = 0;
virtual void STDMETHODCALLTYPE GetVulkanHandles(VkInstance * pInstance, VkPhysicalDevice * pPhysDev) = 0;
};
virtual void* STDMETHODCALLTYPE GetDXVKInstance() = 0;
MIDL_INTERFACE("4c5e1b0d-b0c8-4131-bfd8-9b2476f7f408")
IDXGIVkInteropFactory : public IUnknown
{
virtual void STDMETHODCALLTYPE GetVulkanInstance(VkInstance * pInstance,
PFN_vkGetInstanceProcAddr * ppfnVkGetInstanceProcAddr) = 0;
};
struct GpuInformation