@@ -203,6 +203,7 @@ TEST(WsiTests, Win32GetPhysicalDeviceSurfaceSupportKHR) {
203203 for (uint32_t pd = 0 ; pd < max_device_count; ++pd) {
204204 VkBool32 supported = VK_FALSE;
205205 ASSERT_EQ (VK_SUCCESS, env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (phys_devs[pd], 0 , surface, &supported));
206+ ASSERT_EQ (VK_TRUE, supported);
206207 }
207208
208209 env.vulkan_functions .vkDestroySurfaceKHR (instance.inst , surface, nullptr );
@@ -386,6 +387,7 @@ TEST(WsiTests, XcbGetPhysicalDeviceSurfaceSupportKHR) {
386387 for (uint32_t pd = 0 ; pd < max_device_count; ++pd) {
387388 VkBool32 supported = VK_FALSE;
388389 ASSERT_EQ (VK_SUCCESS, env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (phys_devs[pd], 0 , surface, &supported));
390+ ASSERT_EQ (VK_TRUE, supported);
389391 }
390392
391393 env.vulkan_functions .vkDestroySurfaceKHR (instance.inst , surface, nullptr );
@@ -569,6 +571,7 @@ TEST(WsiTests, XlibGetPhysicalDeviceSurfaceSupportKHR) {
569571 for (uint32_t pd = 0 ; pd < max_device_count; ++pd) {
570572 VkBool32 supported = VK_FALSE;
571573 ASSERT_EQ (VK_SUCCESS, env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (phys_devs[pd], 0 , surface, &supported));
574+ ASSERT_EQ (VK_TRUE, supported);
572575 }
573576
574577 env.vulkan_functions .vkDestroySurfaceKHR (instance.inst , surface, nullptr );
@@ -752,6 +755,7 @@ TEST(WsiTests, WaylandGetPhysicalDeviceSurfaceSupportKHR) {
752755 for (uint32_t pd = 0 ; pd < max_device_count; ++pd) {
753756 VkBool32 supported = VK_FALSE;
754757 ASSERT_EQ (VK_SUCCESS, env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (phys_devs[pd], 0 , surface, &supported));
758+ ASSERT_EQ (VK_TRUE, supported);
755759 }
756760
757761 env.vulkan_functions .vkDestroySurfaceKHR (instance.inst , surface, nullptr );
@@ -1036,3 +1040,110 @@ TEST(WsiTests, EXTSurfaceMaintenance1) {
10361040 }
10371041 }
10381042}
1043+ #if defined(VK_USE_PLATFORM_WAYLAND_KHR) && defined(VK_USE_PLATFORM_XCB_KHR)
1044+ TEST (WsiTests, MultiPlatformGetPhysicalDeviceSurfaceSupportKHR) {
1045+ FrameworkEnvironment env{};
1046+
1047+ const char * xcb_device_name = " XCB" ;
1048+ env.add_icd (TestICDDetails (TEST_ICD_PATH_VERSION_2))
1049+ .setup_WSI (" VK_USE_PLATFORM_XCB_KHR" )
1050+ .add_physical_device (PhysicalDevice{}
1051+ .set_deviceName (xcb_device_name)
1052+ .add_queue_family_properties ({{VK_QUEUE_GRAPHICS_BIT, 1 , 0 , {1 , 1 , 1 }}, true })
1053+ .finish ());
1054+ const char * wayland_device_name = " WAYLAND" ;
1055+ env.add_icd (TestICDDetails (TEST_ICD_PATH_VERSION_2))
1056+ .setup_WSI (" VK_USE_PLATFORM_WAYLAND_KHR" )
1057+ .add_physical_device (PhysicalDevice{}
1058+ .set_deviceName (wayland_device_name)
1059+ .add_queue_family_properties ({{VK_QUEUE_GRAPHICS_BIT, 1 , 0 , {1 , 1 , 1 }}, true })
1060+ .finish ());
1061+
1062+ {
1063+ // Create instance with only XCB support
1064+ InstWrapper inst{env.vulkan_functions };
1065+ inst.create_info .add_extensions ({VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_XCB_SURFACE_EXTENSION_NAME});
1066+ inst.CheckCreate ();
1067+
1068+ auto phys_devs = inst.GetPhysDevs ();
1069+ // Physical devices are enumerated in reverse order to the ICD order
1070+ VkPhysicalDevice xcb_physical_device = phys_devs[1 ];
1071+ VkPhysicalDevice wayland_physical_device = phys_devs[0 ];
1072+ VkPhysicalDeviceProperties props0{};
1073+ inst->vkGetPhysicalDeviceProperties (wayland_physical_device, &props0);
1074+ ASSERT_TRUE (string_eq (props0.deviceName , wayland_device_name));
1075+
1076+ VkPhysicalDeviceProperties props1{};
1077+ inst->vkGetPhysicalDeviceProperties (xcb_physical_device, &props1);
1078+ ASSERT_TRUE (string_eq (props1.deviceName , xcb_device_name));
1079+
1080+ VkXcbSurfaceCreateInfoKHR xcb_createInfo{VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
1081+
1082+ VkSurfaceKHR surface0{VK_NULL_HANDLE};
1083+ ASSERT_EQ (VK_SUCCESS, env.vulkan_functions .vkCreateXcbSurfaceKHR (inst, &xcb_createInfo, nullptr , &surface0));
1084+ ASSERT_TRUE (surface0 != VK_NULL_HANDLE);
1085+
1086+ VkWaylandSurfaceCreateInfoKHR wayland_createInfo{VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
1087+
1088+ VkSurfaceKHR surface1{VK_NULL_HANDLE};
1089+ ASSERT_EQ (VK_ERROR_EXTENSION_NOT_PRESENT,
1090+ env.vulkan_functions .vkCreateWaylandSurfaceKHR (inst, &wayland_createInfo, nullptr , &surface1));
1091+
1092+ // Use the successful surface
1093+
1094+ VkBool32 supported0 = VK_FALSE;
1095+ ASSERT_EQ (VK_SUCCESS,
1096+ env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (xcb_physical_device, 0 , surface0, &supported0));
1097+ ASSERT_EQ (VK_TRUE, supported0);
1098+
1099+ VkBool32 supported1 = VK_FALSE;
1100+ ASSERT_EQ (VK_SUCCESS,
1101+ env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (wayland_physical_device, 0 , surface0, &supported1));
1102+ ASSERT_EQ (VK_FALSE, supported1);
1103+ }
1104+
1105+ {
1106+ // Create instance with only WAYLAND support
1107+
1108+ InstWrapper inst{env.vulkan_functions };
1109+ inst.create_info .add_extensions ({VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME});
1110+ inst.CheckCreate ();
1111+
1112+ auto phys_devs = inst.GetPhysDevs ();
1113+ // Physical devices are enumerated in reverse order to the ICD order
1114+ VkPhysicalDevice xcb_physical_device = phys_devs[1 ];
1115+ VkPhysicalDevice wayland_physical_device = phys_devs[0 ];
1116+ VkPhysicalDeviceProperties props0{};
1117+ inst->vkGetPhysicalDeviceProperties (wayland_physical_device, &props0);
1118+ ASSERT_TRUE (string_eq (props0.deviceName , wayland_device_name));
1119+
1120+ VkPhysicalDeviceProperties props1{};
1121+ inst->vkGetPhysicalDeviceProperties (xcb_physical_device, &props1);
1122+ ASSERT_TRUE (string_eq (props1.deviceName , xcb_device_name));
1123+
1124+ VkXcbSurfaceCreateInfoKHR xcb_createInfo{VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
1125+
1126+ VkSurfaceKHR surface0{VK_NULL_HANDLE};
1127+ ASSERT_EQ (VK_ERROR_EXTENSION_NOT_PRESENT,
1128+ env.vulkan_functions .vkCreateXcbSurfaceKHR (inst, &xcb_createInfo, nullptr , &surface0));
1129+
1130+ VkWaylandSurfaceCreateInfoKHR wayland_createInfo{VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
1131+
1132+ VkSurfaceKHR surface1{VK_NULL_HANDLE};
1133+ ASSERT_EQ (VK_SUCCESS, env.vulkan_functions .vkCreateWaylandSurfaceKHR (inst, &wayland_createInfo, nullptr , &surface1));
1134+ ASSERT_TRUE (surface1 != VK_NULL_HANDLE);
1135+
1136+ // Use the successful surface
1137+
1138+ VkBool32 supported0 = VK_FALSE;
1139+ ASSERT_EQ (VK_SUCCESS,
1140+ env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (xcb_physical_device, 0 , surface1, &supported0));
1141+ ASSERT_EQ (VK_FALSE, supported0);
1142+
1143+ VkBool32 supported1 = VK_FALSE;
1144+ ASSERT_EQ (VK_SUCCESS,
1145+ env.vulkan_functions .vkGetPhysicalDeviceSurfaceSupportKHR (wayland_physical_device, 0 , surface1, &supported1));
1146+ ASSERT_EQ (VK_TRUE, supported1);
1147+ }
1148+ }
1149+ #endif // defined(VK_USE_PLATFORM_WAYLAND_KHR) && defined(VK_USE_PLATFORM_XCB_KHR)
0 commit comments