Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update semaphore synchronisation used in Vulkan interop tests #2243

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 38 additions & 25 deletions test_conformance/common/vulkan_wrapper/opencl_vulkan_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ cl_int check_external_memory_handle_type(
return CL_INVALID_VALUE;
}

cl_int check_external_semaphore_handle_type(
void check_external_semaphore_handle_type(
cl_device_id deviceID,
cl_external_semaphore_handle_type_khr requiredHandleType,
cl_device_info queryParamName)
Expand All @@ -541,39 +541,45 @@ cl_int check_external_semaphore_handle_type(

errNum =
clGetDeviceInfo(deviceID, queryParamName, 0, NULL, &handle_type_size);
test_error(errNum, "clGetDeviceInfo failed");
ASSERT_SUCCESS(errNum, "clGetDeviceInfo");

if (handle_type_size == 0)
{
log_error("Device does not support %s semaphore\n",
queryParamName == CL_DEVICE_SEMAPHORE_IMPORT_HANDLE_TYPES_KHR
? "importing"
: "exporting");
return CL_INVALID_VALUE;

throw std::runtime_error("");
}

handle_type =
(cl_external_semaphore_handle_type_khr *)malloc(handle_type_size);

errNum = clGetDeviceInfo(deviceID, queryParamName, handle_type_size,
handle_type, NULL);
ASSERT_SUCCESS(errNum, "clGetDeviceInfo");

test_error(
errNum,
"Unable to query supported device semaphore handle types list\n");

bool found = false;
for (i = 0; i < handle_type_size; i++)
{
if (requiredHandleType == handle_type[i])
{
return CL_SUCCESS;
found = true;
break;
}
}
log_error("cl_khr_external_semaphore extension is missing support for %d\n",
requiredHandleType);

return CL_INVALID_VALUE;
if (!found)
{
log_error("cl_khr_external_semaphore extension is missing support for"
"handle type %d\n",
requiredHandleType);

throw std::runtime_error("");
}
}

clExternalMemory::clExternalMemory() {}

clExternalMemory::clExternalMemory(const clExternalMemory &externalMemory)
Expand Down Expand Up @@ -855,9 +861,15 @@ clExternalImportableSemaphore::clExternalImportableSemaphore(
cl_device_id deviceId)
: m_deviceSemaphore(semaphore)
{

cl_int err = 0;
cl_device_id devList[] = { deviceId, NULL };
cl_external_semaphore_handle_type_khr clSemaphoreHandleType =
getCLSemaphoreTypeFromVulkanType(externalSemaphoreHandleType);

check_external_semaphore_handle_type(
deviceId, clSemaphoreHandleType,
CL_DEVICE_SEMAPHORE_IMPORT_HANDLE_TYPES_KHR);

m_externalHandleType = externalSemaphoreHandleType;
m_externalSemaphore = nullptr;
m_device = deviceId;
Expand All @@ -875,8 +887,6 @@ clExternalImportableSemaphore::clExternalImportableSemaphore(
ASSERT(0);
#else
fd = (int)semaphore.getHandle(externalSemaphoreHandleType);
err = check_external_semaphore_handle_type(
devList[0], CL_SEMAPHORE_HANDLE_OPAQUE_FD_KHR);
sema_props.push_back(
(cl_semaphore_properties_khr)CL_SEMAPHORE_HANDLE_OPAQUE_FD_KHR);
sema_props.push_back((cl_semaphore_properties_khr)fd);
Expand All @@ -888,8 +898,6 @@ clExternalImportableSemaphore::clExternalImportableSemaphore(
ASSERT(0);
#else
handle = semaphore.getHandle(externalSemaphoreHandleType);
err = check_external_semaphore_handle_type(
devList[0], CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KHR);
sema_props.push_back((cl_semaphore_properties_khr)
CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KHR);
sema_props.push_back((cl_semaphore_properties_khr)handle);
Expand All @@ -903,8 +911,6 @@ clExternalImportableSemaphore::clExternalImportableSemaphore(
const std::wstring &name = semaphore.getName();
if (name.size())
{
err = check_external_semaphore_handle_type(
devList[0], CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_NAME_KHR);
sema_props.push_back(
(cl_semaphore_properties_khr)
CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_NAME_KHR);
Expand All @@ -924,21 +930,17 @@ clExternalImportableSemaphore::clExternalImportableSemaphore(
ASSERT(0);
#else
handle = semaphore.getHandle(externalSemaphoreHandleType);
err = check_external_semaphore_handle_type(
devList[0], CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KMT_KHR);
sema_props.push_back((cl_semaphore_properties_khr)
CL_SEMAPHORE_HANDLE_OPAQUE_WIN32_KMT_KHR);
sema_props.push_back((cl_semaphore_properties_khr)handle);
#endif
break;
case VULKAN_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD:
err = check_external_semaphore_handle_type(
devList[0], CL_SEMAPHORE_HANDLE_SYNC_FD_KHR);

sema_props.push_back(static_cast<cl_semaphore_properties_khr>(
CL_SEMAPHORE_HANDLE_SYNC_FD_KHR));
sema_props.push_back(static_cast<cl_semaphore_properties_khr>(-1));
break;

default:
log_error("Unsupported external memory handle type\n");
ASSERT(0);
Expand Down Expand Up @@ -1013,11 +1015,15 @@ clExternalExportableSemaphore::clExternalExportableSemaphore(
cl_device_id deviceId)
: m_deviceSemaphore(semaphore)
{

cl_int err = 0;
cl_device_id devList[] = { deviceId, NULL };
cl_external_semaphore_handle_type_khr clSemaphoreHandleType =
getCLSemaphoreTypeFromVulkanType(externalSemaphoreHandleType);

check_external_semaphore_handle_type(
deviceId, clSemaphoreHandleType,
CL_DEVICE_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR);

m_externalHandleType = externalSemaphoreHandleType;
m_externalSemaphore = nullptr;
m_device = deviceId;
Expand Down Expand Up @@ -1146,6 +1152,14 @@ int clExternalExportableSemaphore::signal(cl_command_queue cmd_queue)

if (m_externalHandleType == VULKAN_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD)
{
// Finish the queue to signal the semaphore
err = clFinish(cmd_queue);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you explain why this is needed?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This shouldn't be needed. The OpenCL spec states that after clEnqueueSignalSemaphoreKHR returns, it is safe to wait. The implication is that it is also safe to import into vulkan, the finish is not necessary here, and defeats the purpose of semaphores.

if (err != CL_SUCCESS)
{
log_error("Failed to finish cmd_queue\n");
return err;
}

err = clGetSemaphoreHandleForTypeKHRptr(m_externalSemaphore, m_device,
CL_SEMAPHORE_HANDLE_SYNC_FD_KHR,
sizeof(int), &fd, nullptr);
Expand All @@ -1165,7 +1179,6 @@ int clExternalExportableSemaphore::signal(cl_command_queue cmd_queue)

VkResult res =
vkImportSemaphoreFdKHR(m_deviceSemaphore.getDevice(), &import);
ASSERT(res == VK_SUCCESS);
if (res != VK_SUCCESS)
{
err = CL_INVALID_OPERATION;
Expand Down
24 changes: 3 additions & 21 deletions test_conformance/common/vulkan_wrapper/opencl_vulkan_wrapper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,6 @@
#include <OpenCL/cl_ext.h>
#endif

#define CREATE_OPENCL_SEMAPHORE(clSemaphore, vkSemaphore, ctx, handleType, \
devIdx, createExportable) \
if (!(createExportable \
&& (check_external_semaphore_handle_type( \
devIdx, getCLSemaphoreTypeFromVulkanType(handleType), \
CL_DEVICE_SEMAPHORE_EXPORT_HANDLE_TYPES_KHR) \
== CL_SUCCESS))) \
{ \
clSemaphore = new clExternalImportableSemaphore(vkSemaphore, ctx, \
handleType, devIdx); \
} \
else \
{ \
clSemaphore = new clExternalExportableSemaphore(vkSemaphore, ctx, \
handleType, devIdx); \
}

typedef cl_semaphore_khr (*pfnclCreateSemaphoreWithPropertiesKHR)(
cl_context context, cl_semaphore_properties_khr *sema_props,
cl_int *errcode_ret);
Expand Down Expand Up @@ -91,11 +74,10 @@ cl_int getCLImageInfoFromVkImageInfo(const VkImageCreateInfo *, size_t,
cl_int check_external_memory_handle_type(
cl_device_id deviceID,
cl_external_memory_handle_type_khr requiredHandleType);
cl_int check_external_semaphore_handle_type(
void check_external_semaphore_handle_type(
cl_device_id deviceID,
cl_external_semaphore_handle_type_khr requiredHandleType,
cl_device_info queryParamName =
CL_DEVICE_SEMAPHORE_IMPORT_HANDLE_TYPES_KHR);
cl_device_info queryParamName);
cl_int setMaxImageDimensions(cl_device_id deviceID, size_t &width,
size_t &height);

Expand Down Expand Up @@ -191,4 +173,4 @@ VulkanImageTiling vkClExternalMemoryHandleTilingAssumption(
cl_device_id deviceId,
VulkanExternalMemoryHandleType vkExternalMemoryHandleType, int *error_ret);

#endif // _opencl_vulkan_wrapper_hpp_
#endif // _opencl_vulkan_wrapper_hpp_
Loading
Loading