diff --git a/src/dxvk/dxvk_device_filter.cpp b/src/dxvk/dxvk_device_filter.cpp index 0bd0e5ca549..daad4327b35 100644 --- a/src/dxvk/dxvk_device_filter.cpp +++ b/src/dxvk/dxvk_device_filter.cpp @@ -1,5 +1,13 @@ #include "dxvk_device_filter.h" +std::string convertUUID(const uint8_t uuid[VK_UUID_SIZE]) { + std::ostringstream stream; + for (unsigned int i = 0; i < VK_UUID_SIZE; i++) { + stream << static_cast(uuid[i]); + } + return stream.str(); +} + namespace dxvk { DxvkDeviceFilter::DxvkDeviceFilter( @@ -7,12 +15,15 @@ namespace dxvk { const DxvkOptions& options) : m_flags(flags) { m_matchDeviceName = env::getEnvVar("DXVK_FILTER_DEVICE_NAME"); - + m_matchDeviceUUID = env::getEnvVar("DXVK_FILTER_DEVICE_UUID"); + if (m_matchDeviceName.empty()) m_matchDeviceName = options.deviceFilter; if (!m_matchDeviceName.empty()) m_flags.set(DxvkDeviceFilterFlag::MatchDeviceName); + if (!m_matchDeviceUUID.empty()) + m_flags.set(DxvkDeviceFilterFlag::MatchDeviceUUID); } @@ -44,5 +55,14 @@ namespace dxvk { return true; } + + bool DxvkDeviceFilter::testCreatedAdapter(const DxvkDeviceInfo& deviceInfo) const { + if (m_flags.test(DxvkDeviceFilterFlag::MatchDeviceUUID)) { + if (convertUUID(deviceInfo.coreDeviceId.deviceUUID).find(m_matchDeviceUUID) == std::string::npos) + return false; + } + + return true; + } } diff --git a/src/dxvk/dxvk_device_filter.h b/src/dxvk/dxvk_device_filter.h index 79a6db1f780..8d3f20711b4 100644 --- a/src/dxvk/dxvk_device_filter.h +++ b/src/dxvk/dxvk_device_filter.h @@ -14,7 +14,8 @@ namespace dxvk { */ enum class DxvkDeviceFilterFlag { MatchDeviceName = 0, - SkipCpuDevices = 1, + MatchDeviceUUID = 1, + SkipCpuDevices = 2, }; using DxvkDeviceFilterFlags = Flags; @@ -46,13 +47,23 @@ namespace dxvk { */ bool testAdapter( const VkPhysicalDeviceProperties& properties) const; + + /** + * \brief Tests a created adapter + * + * \param [in] properties Adapter properties + * \returns \c true if the test passes + */ + bool testCreatedAdapter( + const DxvkDeviceInfo& deviceInfo) const; private: DxvkDeviceFilterFlags m_flags; std::string m_matchDeviceName; + std::string m_matchDeviceUUID; }; -} \ No newline at end of file +} diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index f47f77786e5..cecfed134c7 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -263,9 +263,11 @@ namespace dxvk { uint32_t numIGPU = 0; for (uint32_t i = 0; i < numAdapters; i++) { - if (filter.testAdapter(deviceProperties[i])) { + if (filter.testAdapter(deviceProperties[i])) result.push_back(new DxvkAdapter(m_vki, adapters[i])); - + if (!filter.testCreatedAdapter(result.back()->devicePropertiesExt())) { + result.pop_back(); + } else { if (deviceProperties[i].deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) numDGPU += 1; else if (deviceProperties[i].deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU)