From 6c5f73ac26205fe9cdb98a450e12206c6caf2510 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 26 Jul 2022 22:34:23 +0200 Subject: [PATCH] [dxvk] Reintroduce VkPhysicalDeviceIDProperties We need this to get the device LUID. Wine does not fill in the LUID properties in VkPhysicalDeviceVulkan11Properties right now. Fixes DLSS not working, as well as other potential issues. --- src/d3d9/d3d9_adapter.cpp | 6 +++--- src/dxgi/dxgi_adapter.cpp | 6 +++--- src/dxvk/dxvk_adapter.cpp | 3 +++ src/dxvk/dxvk_device_info.h | 1 + src/dxvk/dxvk_instance.cpp | 4 ++-- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/d3d9/d3d9_adapter.cpp b/src/d3d9/d3d9_adapter.cpp index 7ca05fffe..6a5762d4c 100644 --- a/src/d3d9/d3d9_adapter.cpp +++ b/src/d3d9/d3d9_adapter.cpp @@ -702,10 +702,10 @@ namespace dxvk { if (pLUID == nullptr) return D3DERR_INVALIDCALL; - auto& vk11 = m_adapter->devicePropertiesExt().vk11; + auto& deviceId = m_adapter->devicePropertiesExt().coreDeviceId; - if (vk11.deviceLUIDValid) - *pLUID = bit::cast(vk11.deviceLUID); + if (deviceId.deviceLUIDValid) + *pLUID = bit::cast(deviceId.deviceLUID); else *pLUID = dxvk::GetAdapterLUID(m_ordinal); diff --git a/src/dxgi/dxgi_adapter.cpp b/src/dxgi/dxgi_adapter.cpp index 81c471746..3e8f6307e 100644 --- a/src/dxgi/dxgi_adapter.cpp +++ b/src/dxgi/dxgi_adapter.cpp @@ -244,7 +244,7 @@ namespace dxvk { auto deviceProp = m_adapter->deviceProperties(); auto memoryProp = m_adapter->memoryProperties(); - auto vk11 = m_adapter->devicePropertiesExt().vk11; + auto deviceId = m_adapter->devicePropertiesExt().coreDeviceId; // Custom Vendor / Device ID if (options->customVendorId >= 0) @@ -322,8 +322,8 @@ namespace dxvk { pDesc->GraphicsPreemptionGranularity = DXGI_GRAPHICS_PREEMPTION_DMA_BUFFER_BOUNDARY; pDesc->ComputePreemptionGranularity = DXGI_COMPUTE_PREEMPTION_DMA_BUFFER_BOUNDARY; - if (vk11.deviceLUIDValid) - std::memcpy(&pDesc->AdapterLuid, vk11.deviceLUID, VK_LUID_SIZE); + if (deviceId.deviceLUIDValid) + std::memcpy(&pDesc->AdapterLuid, deviceId.deviceLUID, VK_LUID_SIZE); else pDesc->AdapterLuid = GetAdapterLUID(m_index); diff --git a/src/dxvk/dxvk_adapter.cpp b/src/dxvk/dxvk_adapter.cpp index ea1423fa8..42514ebdc 100644 --- a/src/dxvk/dxvk_adapter.cpp +++ b/src/dxvk/dxvk_adapter.cpp @@ -611,6 +611,9 @@ namespace dxvk { m_deviceInfo.vk13.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES; m_deviceInfo.vk13.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.vk13); + m_deviceInfo.coreDeviceId.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES; + m_deviceInfo.coreDeviceId.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.coreDeviceId); + if (m_deviceExtensions.supports(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME)) { m_deviceInfo.extConservativeRasterization.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT; m_deviceInfo.extConservativeRasterization.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extConservativeRasterization); diff --git a/src/dxvk/dxvk_device_info.h b/src/dxvk/dxvk_device_info.h index 545c88cdc..d8bc9ffdb 100644 --- a/src/dxvk/dxvk_device_info.h +++ b/src/dxvk/dxvk_device_info.h @@ -14,6 +14,7 @@ namespace dxvk { */ struct DxvkDeviceInfo { VkPhysicalDeviceProperties2 core; + VkPhysicalDeviceIDProperties coreDeviceId; VkPhysicalDeviceVulkan11Properties vk11; VkPhysicalDeviceVulkan12Properties vk12; VkPhysicalDeviceVulkan13Properties vk13; diff --git a/src/dxvk/dxvk_instance.cpp b/src/dxvk/dxvk_instance.cpp index 3b7487f7a..189418c72 100644 --- a/src/dxvk/dxvk_instance.cpp +++ b/src/dxvk/dxvk_instance.cpp @@ -61,9 +61,9 @@ namespace dxvk { Rc DxvkInstance::findAdapterByLuid(const void* luid) const { for (const auto& adapter : m_adapters) { - const auto& props = adapter->devicePropertiesExt().vk11; + const auto& deviceId = adapter->devicePropertiesExt().coreDeviceId; - if (props.deviceLUIDValid && !std::memcmp(luid, props.deviceLUID, VK_LUID_SIZE)) + if (deviceId.deviceLUIDValid && !std::memcmp(luid, deviceId.deviceLUID, VK_LUID_SIZE)) return adapter; }