diff --git a/OptiScaler/misc/IdentifyGpu.cpp b/OptiScaler/misc/IdentifyGpu.cpp index b9e992fc..d8fd67f9 100644 --- a/OptiScaler/misc/IdentifyGpu.cpp +++ b/OptiScaler/misc/IdentifyGpu.cpp @@ -88,10 +88,56 @@ std::vector IdentifyGpu::checkGpuInfo() std::wstring szName(adapterDesc.Description); gpuInfo.name = wstring_to_string(szName); - ComPtr dxvkAdapter; - if (SUCCEEDED(adapter->QueryInterface(IID_PPV_ARGS(&dxvkAdapter)))) + ComPtr 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 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; diff --git a/OptiScaler/misc/IdentifyGpu.h b/OptiScaler/misc/IdentifyGpu.h index 115f4b2a..d20092b8 100644 --- a/OptiScaler/misc/IdentifyGpu.h +++ b/OptiScaler/misc/IdentifyGpu.h @@ -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