From 334884d1c4282b6deda3f356e8ba490df54ad8d1 Mon Sep 17 00:00:00 2001 From: Eugene Golushkov Date: Fri, 22 Nov 2024 14:16:23 +0100 Subject: [PATCH] [Vk] Add VulkanPhysicalDevice::physicalDeviceID to compare physical device with new one obtained from fresh VkInstance. TODO: use deviceLUID/UUID if available, rather than name hash --- .../Vulkan/include/OgreVulkanRenderSystem.h | 1 + RenderSystems/Vulkan/src/OgreVulkanDevice.cpp | 13 ++++++++++++- RenderSystems/Vulkan/src/OgreVulkanRenderSystem.cpp | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/RenderSystems/Vulkan/include/OgreVulkanRenderSystem.h b/RenderSystems/Vulkan/include/OgreVulkanRenderSystem.h index ee16595ac5..2820fb00de 100644 --- a/RenderSystems/Vulkan/include/OgreVulkanRenderSystem.h +++ b/RenderSystems/Vulkan/include/OgreVulkanRenderSystem.h @@ -56,6 +56,7 @@ namespace Ogre struct VulkanPhysicalDevice { VkPhysicalDevice physicalDevice; + long long physicalDeviceID; String title; }; diff --git a/RenderSystems/Vulkan/src/OgreVulkanDevice.cpp b/RenderSystems/Vulkan/src/OgreVulkanDevice.cpp index 941ceccd78..26f7462556 100644 --- a/RenderSystems/Vulkan/src/OgreVulkanDevice.cpp +++ b/RenderSystems/Vulkan/src/OgreVulkanDevice.cpp @@ -43,6 +43,12 @@ THE SOFTWARE. # include "swappy/swappyVk.h" #endif +#if OGRE_ARCH_TYPE == OGRE_ARCHITECTURE_32 +# define OGRE_HASH128_FUNC MurmurHash3_x86_128 +#else +# define OGRE_HASH128_FUNC MurmurHash3_x64_128 +#endif + #define OGRE_VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface" #define OGRE_VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface" #define OGRE_VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface" @@ -428,8 +434,13 @@ namespace Ogre if( sameNameIndex != 0 ) name += " (" + Ogre::StringConverter::toString( sameNameIndex + 1 ) + ")"; + // TODO: use deviceLUID or deviceUUID if available + uint64 hashResult[2] = {}; + OGRE_HASH128_FUNC( name.c_str(), (int)name.size(), IdString::Seed, hashResult ); + long long deviceLUID = hashResult[0]; + LogManager::getSingleton().logMessage( "Vulkan: \"" + name + "\"" ); - mVulkanPhysicalDevices.push_back( { device, name } ); + mVulkanPhysicalDevices.push_back( { device, deviceLUID, name } ); } LogManager::getSingleton().logMessage( "Vulkan: Device detection ends" ); diff --git a/RenderSystems/Vulkan/src/OgreVulkanRenderSystem.cpp b/RenderSystems/Vulkan/src/OgreVulkanRenderSystem.cpp index 5e191a6e56..1e26a37420 100644 --- a/RenderSystems/Vulkan/src/OgreVulkanRenderSystem.cpp +++ b/RenderSystems/Vulkan/src/OgreVulkanRenderSystem.cpp @@ -173,7 +173,7 @@ namespace Ogre mVulkanProgramFactory1( 0 ), mVulkanProgramFactory2( 0 ), mVulkanProgramFactory3( 0 ), - mActiveDevice( { 0, String() } ), + mActiveDevice( { 0, 0, String() } ), mFirstUnflushedAutoParamsBuffer( 0 ), mAutoParamsBufferIdx( 0 ), mCurrentAutoParamsBufferPtr( 0 ), @@ -1090,7 +1090,7 @@ namespace Ogre dbgFunc, this ); mActiveDevice = externalDevice - ? VulkanPhysicalDevice( { externalDevice->physicalDevice, String() } ) + ? VulkanPhysicalDevice( { externalDevice->physicalDevice, 0, String() } ) : *mInstance->findByName( mVulkanSupport->getSelectedDeviceName() ); mDevice = new VulkanDevice( this );