aboutsummaryrefslogtreecommitdiff
path: root/test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp')
-rw-r--r--test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp427
1 files changed, 6 insertions, 421 deletions
diff --git a/test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp b/test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp
index a7ed307e..89ab17b3 100644
--- a/test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp
+++ b/test_conformance/extensions/cl_khr_external_semaphore/test_external_semaphore.cpp
@@ -120,9 +120,11 @@ int test_external_semaphores_queries(cl_device_id deviceID, cl_context context,
SEMAPHORE_PARAM_TEST(CL_SEMAPHORE_TYPE_KHR, cl_semaphore_type_khr,
CL_SEMAPHORE_TYPE_BINARY_KHR);
- SEMAPHORE_PARAM_TEST(CL_DEVICE_HANDLE_LIST_KHR, cl_uint, 1);
+ SEMAPHORE_PARAM_TEST(CL_DEVICE_HANDLE_LIST_KHR, cl_device_id, deviceID);
- SEMAPHORE_PARAM_TEST(CL_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR, cl_uint, 1);
+ SEMAPHORE_PARAM_TEST(
+ CL_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR, cl_uint,
+ getCLSemaphoreTypeFromVulkanType(vkExternalSemaphoreHandleType));
// Confirm that querying CL_SEMAPHORE_CONTEXT_KHR returns the right context
SEMAPHORE_PARAM_TEST(CL_SEMAPHORE_CONTEXT_KHR, cl_context, context);
@@ -290,7 +292,7 @@ static int semaphore_external_cross_queue_helper(cl_device_id deviceID,
nullptr, 0, nullptr, &wait_event);
test_error(err, "Could not wait semaphore");
- // Finish queue_1 and queue_2
+ // Finish queue_1 and queue_2
err = clFinish(queue_1);
test_error(err, "Could not finish queue");
@@ -304,7 +306,7 @@ static int semaphore_external_cross_queue_helper(cl_device_id deviceID,
return TEST_PASS;
}
-// Confirm that a signal followed by a wait will complete successfully
+// Confirm that a signal followed by a wait will complete successfully
int test_external_semaphores_simple_1(cl_device_id deviceID, cl_context context,
cl_command_queue defaultQueue,
int num_elements)
@@ -931,420 +933,3 @@ int test_external_semaphores_multi_wait(cl_device_id deviceID,
return TEST_PASS;
}
-
-// Confirm that it is possible to enqueue a signal of wait and signal in any
-// order as soon as the submission order (after deferred dependencies) is
-// correct. Case: first one deferred wait, then one non deferred signal.
-int test_external_semaphores_order_1(cl_device_id deviceID, cl_context context,
- cl_command_queue defaultQueue,
- int num_elements)
-{
- if (!is_extension_available(deviceID, "cl_khr_external_semaphore"))
- {
- log_info("cl_khr_semaphore is not supported on this platoform. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- if (init_vuikan_device())
- {
- log_info("Cannot initialise Vulkan. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- VulkanDevice vkDevice;
-
- // Obtain pointers to semaphore's API
- GET_PFN(deviceID, clEnqueueSignalSemaphoresKHR);
- GET_PFN(deviceID, clEnqueueWaitSemaphoresKHR);
-
- const std::vector<VulkanExternalMemoryHandleType>
- vkExternalMemoryHandleTypeList =
- getSupportedVulkanExternalMemoryHandleTypeList();
- VulkanExternalSemaphoreHandleType vkExternalSemaphoreHandleType =
- getSupportedVulkanExternalSemaphoreHandleTypeList()[0];
- VulkanSemaphore vkVk2CLSemaphore(vkDevice, vkExternalSemaphoreHandleType);
-
- clExternalSemaphore sema_ext(vkVk2CLSemaphore, context,
- vkExternalSemaphoreHandleType, deviceID);
-
- cl_int err = CL_SUCCESS;
-
- // Create ooo queue
- clCommandQueueWrapper queue = clCreateCommandQueue(
- context, deviceID, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);
- test_error(err, "Could not create command queue");
-
- // Create user event
- clEventWrapper user_event = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- // Wait semaphore (dependency on user_event)
- clEventWrapper wait_event;
- err = clEnqueueWaitSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event, &wait_event);
- test_error(err, "Could not wait semaphore");
-
- // Signal semaphore
- clEventWrapper signal_event;
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 0, nullptr, &signal_event);
- test_error(err, "Could not signal semaphore");
-
- // Flush and delay
- err = clFlush(queue);
- test_error(err, "Could not flush queue");
- std::this_thread::sleep_for(std::chrono::seconds(FLUSH_DELAY_S));
-
- // Ensure signal event is completed while wait event is not
- test_assert_event_complete(signal_event);
- test_assert_event_inprogress(wait_event);
-
- // Complete user_event
- err = clSetUserEventStatus(user_event, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Finish
- err = clFinish(queue);
- test_error(err, "Could not finish queue");
-
- // Ensure all events are completed
- test_assert_event_complete(signal_event);
- test_assert_event_complete(wait_event);
-
- return TEST_PASS;
-}
-
-// Confirm that it is possible to enqueue a signal of wait and signal in any
-// order as soon as the submission order (after deferred dependencies) is
-// correct. Case: first two deferred signals, then one deferred wait. Unblock
-// signal, then unblock wait. When wait completes, unblock the other signal.
-int test_external_semaphores_order_2(cl_device_id deviceID, cl_context context,
- cl_command_queue defaultQueue,
- int num_elements)
-{
- if (!is_extension_available(deviceID, "cl_khr_external_semaphore"))
- {
- log_info("cl_khr_semaphore is not supported on this platoform. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- if (init_vuikan_device())
- {
- log_info("Cannot initialise Vulkan. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- VulkanDevice vkDevice;
-
- // Obtain pointers to semaphore's API
- GET_PFN(deviceID, clEnqueueSignalSemaphoresKHR);
- GET_PFN(deviceID, clEnqueueWaitSemaphoresKHR);
-
- const std::vector<VulkanExternalMemoryHandleType>
- vkExternalMemoryHandleTypeList =
- getSupportedVulkanExternalMemoryHandleTypeList();
- VulkanExternalSemaphoreHandleType vkExternalSemaphoreHandleType =
- getSupportedVulkanExternalSemaphoreHandleTypeList()[0];
- VulkanSemaphore vkVk2CLSemaphore(vkDevice, vkExternalSemaphoreHandleType);
-
- clExternalSemaphore sema_ext(vkVk2CLSemaphore, context,
- vkExternalSemaphoreHandleType, deviceID);
-
- cl_int err = CL_SUCCESS;
-
- // Create ooo queue
- clCommandQueueWrapper queue = clCreateCommandQueue(
- context, deviceID, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);
- test_error(err, "Could not create command queue");
-
- // Create user events
- clEventWrapper user_event_1 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- clEventWrapper user_event_2 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- clEventWrapper user_event_3 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- // Signal semaphore (dependency on user_event_1)
- clEventWrapper signal_1_event;
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_1,
- &signal_1_event);
- test_error(err, "Could not signal semaphore");
-
- // Signal semaphore (dependency on user_event_2)
- clEventWrapper signal_2_event;
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_2,
- &signal_2_event);
- test_error(err, "Could not signal semaphore");
-
- // Wait semaphore (dependency on user_event_3)
- clEventWrapper wait_event;
- err = clEnqueueWaitSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_3, &wait_event);
- test_error(err, "Could not wait semaphore");
-
- // Complete user_event_1
- err = clSetUserEventStatus(user_event_1, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Complete user_event_3
- err = clSetUserEventStatus(user_event_3, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Flush and delay
- err = clFlush(queue);
- test_error(err, "Could not flush queue");
- std::this_thread::sleep_for(std::chrono::seconds(FLUSH_DELAY_S));
-
- // Ensure all events are completed except for second signal
- test_assert_event_complete(signal_1_event);
- test_assert_event_inprogress(signal_2_event);
- test_assert_event_complete(wait_event);
-
- // Complete user_event_2
- err = clSetUserEventStatus(user_event_2, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Finish
- err = clFinish(queue);
- test_error(err, "Could not finish queue");
-
- // Ensure all events are completed
- test_assert_event_complete(signal_1_event);
- test_assert_event_complete(signal_2_event);
- test_assert_event_complete(wait_event);
-
- return TEST_PASS;
-}
-
-// Confirm that it is possible to enqueue a signal of wait and signal in any
-// order as soon as the submission order (after deferred dependencies) is
-// correct. Case: first two deferred signals, then two deferred waits. Unblock
-// one signal and one wait (both blocked by the same user event). When wait
-// completes, unblock the other signal. Then unblock the other wait.
-int test_external_semaphores_order_3(cl_device_id deviceID, cl_context context,
- cl_command_queue defaultQueue,
- int num_elements)
-{
- if (!is_extension_available(deviceID, "cl_khr_external_semaphore"))
- {
- log_info("cl_khr_semaphore is not supported on this platoform. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- if (init_vuikan_device())
- {
- log_info("Cannot initialise Vulkan. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- VulkanDevice vkDevice;
-
- // Obtain pointers to semaphore's API
- GET_PFN(deviceID, clEnqueueSignalSemaphoresKHR);
- GET_PFN(deviceID, clEnqueueWaitSemaphoresKHR);
-
- const std::vector<VulkanExternalMemoryHandleType>
- vkExternalMemoryHandleTypeList =
- getSupportedVulkanExternalMemoryHandleTypeList();
- VulkanExternalSemaphoreHandleType vkExternalSemaphoreHandleType =
- getSupportedVulkanExternalSemaphoreHandleTypeList()[0];
- VulkanSemaphore vkVk2CLSemaphore(vkDevice, vkExternalSemaphoreHandleType);
-
- clExternalSemaphore sema_ext(vkVk2CLSemaphore, context,
- vkExternalSemaphoreHandleType, deviceID);
-
- cl_int err = CL_SUCCESS;
-
- // Create ooo queue
- clCommandQueueWrapper queue = clCreateCommandQueue(
- context, deviceID, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);
- test_error(err, "Could not create command queue");
-
- // Create user events
- clEventWrapper user_event_1 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- clEventWrapper user_event_2 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- clEventWrapper user_event_3 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- // Signal semaphore (dependency on user_event_1)
- clEventWrapper signal_1_event;
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_1,
- &signal_1_event);
- test_error(err, "Could not signal semaphore");
-
- // Signal semaphore (dependency on user_event_2)
- clEventWrapper signal_2_event;
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_2,
- &signal_2_event);
- test_error(err, "Could not signal semaphore");
-
- // Wait semaphore (dependency on user_event_3)
- clEventWrapper wait_1_event;
- err = clEnqueueWaitSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_3, &wait_1_event);
- test_error(err, "Could not wait semaphore");
-
- // Wait semaphore (dependency on user_event_2)
- clEventWrapper wait_2_event;
- err = clEnqueueWaitSemaphoresKHR(queue, 1, &sema_ext.getCLSemaphore(),
- nullptr, 1, &user_event_2, &wait_2_event);
- test_error(err, "Could not wait semaphore");
-
- // Complete user_event_2
- err = clSetUserEventStatus(user_event_2, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Flush and delay
- err = clFlush(queue);
- test_error(err, "Could not flush queue");
- std::this_thread::sleep_for(std::chrono::seconds(FLUSH_DELAY_S));
-
- // Ensure only second signal and second wait completed
- cl_event event_list[] = { signal_2_event, wait_2_event };
- err = clWaitForEvents(2, event_list);
- test_error(err, "Could not wait for events");
-
- test_assert_event_inprogress(signal_1_event);
- test_assert_event_inprogress(wait_1_event);
-
- // Complete user_event_1
- err = clSetUserEventStatus(user_event_1, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Complete user_event_3
- err = clSetUserEventStatus(user_event_3, CL_COMPLETE);
- test_error(err, "Could not set user event to CL_COMPLETE");
-
- // Finish
- err = clFinish(queue);
- test_error(err, "Could not finish queue");
-
- // Ensure all events are completed
- test_assert_event_complete(signal_1_event);
- test_assert_event_complete(signal_2_event);
- test_assert_event_complete(wait_1_event);
- test_assert_event_complete(wait_2_event);
-
- return TEST_PASS;
-}
-
-// Test that an invalid semaphore command results in the invalidation of the
-// command's event and the dependencies' events
-int test_external_semaphores_invalid_command(cl_device_id deviceID,
- cl_context context,
- cl_command_queue defaultQueue,
- int num_elements)
-{
- if (!is_extension_available(deviceID, "cl_khr_external_semaphore"))
- {
- log_info("cl_khr_semaphore is not supported on this platoform. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- if (init_vuikan_device())
- {
- log_info("Cannot initialise Vulkan. "
- "Skipping test.\n");
- return TEST_SKIPPED_ITSELF;
- }
-
- VulkanDevice vkDevice;
-
- // Obtain pointers to semaphore's API
- GET_PFN(deviceID, clEnqueueSignalSemaphoresKHR);
- GET_PFN(deviceID, clEnqueueWaitSemaphoresKHR);
-
- const std::vector<VulkanExternalMemoryHandleType>
- vkExternalMemoryHandleTypeList =
- getSupportedVulkanExternalMemoryHandleTypeList();
- VulkanExternalSemaphoreHandleType vkExternalSemaphoreHandleType =
- getSupportedVulkanExternalSemaphoreHandleTypeList()[0];
- VulkanSemaphore vkVk2CLSemaphore1(vkDevice, vkExternalSemaphoreHandleType);
- VulkanSemaphore vkVk2CLSemaphore2(vkDevice, vkExternalSemaphoreHandleType);
-
- clExternalSemaphore sema_ext_1(vkVk2CLSemaphore1, context,
- vkExternalSemaphoreHandleType, deviceID);
- clExternalSemaphore sema_ext_2(vkVk2CLSemaphore2, context,
- vkExternalSemaphoreHandleType, deviceID);
-
- cl_int err = CL_SUCCESS;
-
- // Create ooo queue
- clCommandQueueWrapper queue = clCreateCommandQueue(
- context, deviceID, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &err);
- test_error(err, "Could not create command queue");
-
- // Create user events
- clEventWrapper user_event_1 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- clEventWrapper user_event_2 = clCreateUserEvent(context, &err);
- test_error(err, "Could not create user event");
-
- // Signal semaphore_1 (dependency on user_event_1)
- clEventWrapper signal_1_event;
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext_1.getCLSemaphore(),
- nullptr, 1, &user_event_1,
- &signal_1_event);
- test_error(err, "Could not signal semaphore");
-
- // Wait semaphore_1 and semaphore_2 (dependency on user_event_1)
- clEventWrapper wait_event;
- cl_semaphore_khr sema_list[] = { sema_ext_1.getCLSemaphore(),
- sema_ext_2.getCLSemaphore() };
- err = clEnqueueWaitSemaphoresKHR(queue, 2, sema_list, nullptr, 1,
- &user_event_1, &wait_event);
- test_error(err, "Could not wait semaphore");
-
- // Signal semaphore_1 (dependency on wait_event and user_event_2)
- clEventWrapper signal_2_event;
- cl_event wait_list[] = { user_event_2, wait_event };
- err = clEnqueueSignalSemaphoresKHR(queue, 1, &sema_ext_1.getCLSemaphore(),
- nullptr, 2, wait_list, &signal_2_event);
- test_error(err, "Could not signal semaphore");
-
- // Flush and delay
- err = clFlush(queue);
- test_error(err, "Could not flush queue");
- std::this_thread::sleep_for(std::chrono::seconds(FLUSH_DELAY_S));
-
- // Ensure all events are not completed
- test_assert_event_inprogress(signal_1_event);
- test_assert_event_inprogress(signal_2_event);
- test_assert_event_inprogress(wait_event);
-
- // Complete user_event_1 (expect failure as waiting on semaphore_2 is not
- // allowed (unsignaled)
- err = clSetUserEventStatus(user_event_1, CL_COMPLETE);
- test_assert_error(err != CL_SUCCESS,
- "signal_2_event completed unexpectedly");
-
- // Ensure signal_1 is completed while others failed (the second signal
- // should fail as it depends on wait)
- err = clFinish(queue);
- test_error(err, "Could not finish queue");
-
- test_assert_event_complete(signal_1_event);
- test_assert_event_terminated(wait_event);
- test_assert_event_terminated(signal_2_event);
-
- return TEST_PASS;
-}