mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-08-25 15:46:45 +00:00
Use dxvk interop for gpu info detection
Co-authored-by: Astyyyyy <imapotatook123@gmail.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user