@@ -27,6 +27,25 @@ TEST_P(urQueueGetInfoTest, SuccessContext) {
2727 ASSERT_EQ (context, property_value);
2828}
2929
30+ TEST_P (urQueueGetInfoTest, SuccessRoundtripContext) {
31+ const ur_queue_info_t property_name = UR_QUEUE_INFO_CONTEXT;
32+ size_t property_size = sizeof (ur_context_handle_t );
33+
34+ ur_native_handle_t native_queue;
35+ UUR_ASSERT_SUCCESS_OR_UNSUPPORTED (
36+ urQueueGetNativeHandle (queue, nullptr , &native_queue));
37+
38+ ur_queue_handle_t from_native_queue;
39+ UUR_ASSERT_SUCCESS_OR_UNSUPPORTED (urQueueCreateWithNativeHandle (
40+ native_queue, context, device, nullptr , &from_native_queue));
41+
42+ ur_context_handle_t property_value = nullptr ;
43+ ASSERT_SUCCESS (urQueueGetInfo (from_native_queue, property_name, property_size,
44+ &property_value, nullptr ));
45+
46+ ASSERT_EQ (property_value, context);
47+ }
48+
3049TEST_P (urQueueGetInfoTest, SuccessDevice) {
3150 UUR_KNOWN_FAILURE_ON (uur::NativeCPU{});
3251
@@ -45,6 +64,73 @@ TEST_P(urQueueGetInfoTest, SuccessDevice) {
4564 ASSERT_EQ (device, property_value);
4665}
4766
67+ TEST_P (urQueueGetInfoTest, SuccessRoundtripDevice) {
68+ // Segfaults
69+ UUR_KNOWN_FAILURE_ON (uur::LevelZero{}, uur::LevelZeroV2{});
70+
71+ const ur_queue_info_t property_name = UR_QUEUE_INFO_DEVICE;
72+ size_t property_size = 0 ;
73+
74+ ur_native_handle_t native_queue;
75+ UUR_ASSERT_SUCCESS_OR_UNSUPPORTED (
76+ urQueueGetNativeHandle (queue, nullptr , &native_queue));
77+
78+ ur_queue_handle_t from_native_queue;
79+ UUR_ASSERT_SUCCESS_OR_UNSUPPORTED (urQueueCreateWithNativeHandle (
80+ native_queue, context, device, nullptr , &from_native_queue));
81+
82+ ASSERT_SUCCESS_OR_OPTIONAL_QUERY (urQueueGetInfo (from_native_queue,
83+ property_name, 0 , nullptr ,
84+ &property_size),
85+ property_name);
86+ ASSERT_EQ (property_size, sizeof (ur_device_handle_t ));
87+
88+ ur_device_handle_t property_value = nullptr ;
89+ ASSERT_SUCCESS (urQueueGetInfo (from_native_queue, property_name, property_size,
90+ &property_value, nullptr ));
91+
92+ ASSERT_EQ (property_value, device);
93+ }
94+
95+ TEST_P (urQueueGetInfoTest, SuccessRoundtripNullDevice) {
96+ // Segfaults
97+ UUR_KNOWN_FAILURE_ON (uur::LevelZero{}, uur::LevelZeroV2{});
98+
99+ const ur_queue_info_t property_name = UR_QUEUE_INFO_DEVICE;
100+ size_t property_size = 0 ;
101+
102+ ur_native_handle_t native_queue;
103+ UUR_ASSERT_SUCCESS_OR_UNSUPPORTED (
104+ urQueueGetNativeHandle (queue, nullptr , &native_queue));
105+
106+ ur_queue_handle_t from_native_queue;
107+ auto result = urQueueCreateWithNativeHandle (native_queue, context, nullptr ,
108+ nullptr , &from_native_queue);
109+ if (result == UR_RESULT_ERROR_INVALID_NULL_HANDLE) {
110+ GTEST_SKIP () << " Implementation requires a valid device" ;
111+ }
112+ UUR_ASSERT_SUCCESS_OR_UNSUPPORTED (result);
113+
114+ ASSERT_SUCCESS_OR_OPTIONAL_QUERY (urQueueGetInfo (from_native_queue,
115+ property_name, 0 , nullptr ,
116+ &property_size),
117+ property_name);
118+ ASSERT_EQ (property_size, sizeof (ur_device_handle_t ));
119+
120+ ur_device_handle_t property_value = nullptr ;
121+ ASSERT_SUCCESS (urQueueGetInfo (from_native_queue, property_name, property_size,
122+ &property_value, nullptr ));
123+
124+ // We can't assume that the two device handles are equal (since creating the
125+ // link to the UR structures has been severed by going through native handle,
126+ // so just check the underlying native pointers
127+ ur_native_handle_t original_device;
128+ ur_native_handle_t new_device;
129+ ASSERT_SUCCESS (urDeviceGetNativeHandle (device, &original_device));
130+ ASSERT_SUCCESS (urDeviceGetNativeHandle (property_value, &new_device));
131+ ASSERT_EQ (original_device, new_device);
132+ }
133+
48134TEST_P (urQueueGetInfoTest, SuccessFlags) {
49135 UUR_KNOWN_FAILURE_ON (uur::NativeCPU{});
50136
0 commit comments