diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml index b29a1343..f2ed2300 100644 --- a/.github/workflows/presubmit.yml +++ b/.github/workflows/presubmit.yml @@ -568,14 +568,12 @@ jobs: if: matrix.BIN != 'x86' working-directory: ${{runner.workspace}}/OpenCL-SDK/build run: | - $EXCLUDE_REGEX = 'externalmemory.*' foreach ($Config in 'Release','Debug') { & ctest ` --build-config ${Config} ` --output-on-failure ` --no-tests=error ` --parallel ${env:NUMBER_OF_PROCESSORS} ` - --exclude-reges "$EXCLUDE_REGEX" if ($LASTEXITCODE -ne 0) { throw "Running OpenCL-SDK tests in $Config failed." } } diff --git a/samples/extensions/khr/externalmemory/main.c b/samples/extensions/khr/externalmemory/main.c index dd160741..a16884ed 100644 --- a/samples/extensions/khr/externalmemory/main.c +++ b/samples/extensions/khr/externalmemory/main.c @@ -217,18 +217,6 @@ bool cl_check_external_memory_handle_type( exit(EXIT_FAILURE); } -// Vulkan function to export a: -// - POSIX file descriptor or -// - a Windows handle -// referencing the payload of a Vulkan device memory object. -const char* vk_get_memory_function_name = -#ifdef _WIN32 - "vkGetMemoryWin32HandleKHR" -#else - "vkGetMemoryFdKHR" -#endif - ; - int main(int argc, char* argv[]) { cl_int error = CL_SUCCESS; @@ -442,7 +430,6 @@ int main(int argc, char* argv[]) buffer_info.size = sizeof(cl_float) * length; buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - ; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; VkBuffer vk_buf_x, vk_buf_y; @@ -497,6 +484,35 @@ int main(int argc, char* argv[]) memcpy(vk_arr_x, arr_x, sizeof(cl_float) * length); memcpy(vk_arr_y, arr_y, sizeof(cl_float) * length); +#ifdef _WIN32 + // Get Vulkan external memory file descriptors for accessing external memory + // with OpenCL. + VkMemoryGetWin32HandleInfoKHR handle_info_x = { 0 }; + handle_info_x.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR; + handle_info_x.pNext = NULL; + handle_info_x.memory = vk_buf_x_memory; + handle_info_x.handleType = vk_external_memory_handle_type; + HANDLE handle_x; + + VkMemoryGetWin32HandleInfoKHR handle_info_y = { 0 }; + handle_info_y.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR; + handle_info_y.pNext = NULL; + handle_info_y.memory = vk_buf_y_memory; + handle_info_y.handleType = vk_external_memory_handle_type; + HANDLE handle_y; + + // We need to get the pointer to the + // vkGetMemoryFdKHR/vkGetMemoryWin32HandleKHR function because it's from + // extension VK_KHR_external_memory_fd. This Vulkan function exports a POSIX + // file descriptor/Windows handle referencing the payload of a Vulkan device + // memory object. + PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32Handle; + *(PFN_vkGetMemoryWin32HandleKHR*)&vkGetMemoryWin32Handle = + (PFN_vkGetMemoryWin32HandleKHR)vkGetDeviceProcAddr( + vk_device, "vkGetMemoryWin32HandleKHR"); + VK_CHECK(vkGetMemoryWin32Handle(vk_device, &handle_info_x, &handle_x)); + VK_CHECK(vkGetMemoryWin32Handle(vk_device, &handle_info_y, &handle_y)); +#else // Get Vulkan external memory file descriptors for accessing external memory // with OpenCL. VkMemoryGetFdInfoKHR fd_info_x = { 0 }; @@ -513,19 +529,28 @@ int main(int argc, char* argv[]) fd_info_y.handleType = vk_external_memory_handle_type; int fd_y; - // We need to get the pointer to the vkGetMemoryFdKHR function because it's - // from extension VK_KHR_external_memory_fd. - PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR = + // We need to get the pointer to the + // vkGetMemoryFdKHR/vkGetMemoryWin32HandleKHR function because it's from + // extension VK_KHR_external_memory_fd. This Vulkan function exports a POSIX + // file descriptor/Windows handle referencing the payload of a Vulkan device + // memory object. + PFN_vkGetMemoryFdKHR vkGetMemoryFd; + *(PFN_vkGetMemoryFdKHR*)&vkGetMemoryFd = (PFN_vkGetMemoryFdKHR)vkGetDeviceProcAddr(vk_device, - vk_get_memory_function_name); + "vkGetMemoryFdKHR"); + VK_CHECK(vkGetMemoryFd(vk_device, &fd_info_x, &fd_x)); + VK_CHECK(vkGetMemoryFd(vk_device, &fd_info_y, &fd_y)); +#endif - VK_CHECK(vkGetMemoryFdKHR(vk_device, &fd_info_x, &fd_x)); - VK_CHECK(vkGetMemoryFdKHR(vk_device, &fd_info_y, &fd_y)); // Create OpenCL buffers from Vulkan external memory file descriptors. cl_mem_properties ext_mem_props_x[] = { (cl_mem_properties)CL_EXTERNAL_MEMORY_HANDLE_OPAQUE_FD_KHR, +#ifdef _WIN32 + (cl_mem_properties)handle_x, +#else (cl_mem_properties)fd_x, +#endif (cl_mem_properties)CL_DEVICE_HANDLE_LIST_KHR, (cl_mem_properties)(uintptr_t)cl_device, CL_DEVICE_HANDLE_LIST_END_KHR, @@ -533,7 +558,11 @@ int main(int argc, char* argv[]) }; cl_mem_properties ext_mem_props_y[] = { (cl_mem_properties)CL_EXTERNAL_MEMORY_HANDLE_OPAQUE_FD_KHR, +#ifdef _WIN32 + (cl_mem_properties)handle_y, +#else (cl_mem_properties)fd_y, +#endif (cl_mem_properties)CL_DEVICE_HANDLE_LIST_KHR, (cl_mem_properties)(uintptr_t)cl_device, CL_DEVICE_HANDLE_LIST_END_KHR, diff --git a/samples/extensions/khr/externalmemory/main.cpp b/samples/extensions/khr/externalmemory/main.cpp index 1274df54..f6ee1a63 100644 --- a/samples/extensions/khr/externalmemory/main.cpp +++ b/samples/extensions/khr/externalmemory/main.cpp @@ -138,18 +138,6 @@ bool cl_check_external_memory_handle_type( return it != supported_handle_types.end(); } -// Vulkan function to export a: -// - POSIX file descriptor or -// - a Windows handle -// referencing the payload of a Vulkan device memory object. -const std::string vk_get_memory_function_name = -#ifdef _WIN32 - std::string{ "vkGetMemoryWin32HandleKHR" } -#else - std::string{ "vkGetMemoryFdKHR" } -#endif -; - int main(int argc, char* argv[]) { try @@ -361,7 +349,6 @@ int main(int argc, char* argv[]) buffer_info.size = sizeof(cl_float) * length; buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - ; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; VkBuffer vk_buf_x, vk_buf_y; @@ -416,6 +403,37 @@ int main(int argc, char* argv[]) memcpy(vk_arr_x, arr_x.data(), sizeof(cl_float) * length); memcpy(vk_arr_y, arr_y.data(), sizeof(cl_float) * length); +#ifdef _WIN32 + // Get Vulkan external memory file descriptors for accessing external + // memory with OpenCL. + VkMemoryGetWin32HandleInfoKHR handle_info_x{}; + handle_info_x.sType = + VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR; + handle_info_x.pNext = nullptr; + handle_info_x.memory = vk_buf_x_memory; + handle_info_x.handleType = vk_external_memory_handle_type; + HANDLE handle_x; + + VkMemoryGetWin32HandleInfoKHR handle_info_y{}; + handle_info_y.sType = + VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR; + handle_info_y.pNext = nullptr; + handle_info_y.memory = vk_buf_y_memory; + handle_info_y.handleType = vk_external_memory_handle_type; + HANDLE handle_y; + + // We need to get the pointer to the + // vkGetMemoryFdKHR/vkGetMemoryWin32HandleKHR function because it's from + // extension VK_KHR_external_memory_fd. This Vulkan function exports a + // POSIX file descriptor/Windows handle referencing the payload of a + // Vulkan device memory object. + PFN_vkGetMemoryWin32HandleKHR vkGetMemoryWin32Handle; + *(PFN_vkGetMemoryWin32HandleKHR*)&vkGetMemoryWin32Handle = + (PFN_vkGetMemoryWin32HandleKHR)vkGetDeviceProcAddr( + vk_device, "vkGetMemoryWin32HandleKHR"); + VK_CHECK(vkGetMemoryWin32Handle(vk_device, &handle_info_x, &handle_x)); + VK_CHECK(vkGetMemoryWin32Handle(vk_device, &handle_info_y, &handle_y)); +#else // Get Vulkan external memory file descriptors for accessing external // memory with OpenCL. VkMemoryGetFdInfoKHR fd_info_x{}; @@ -432,19 +450,27 @@ int main(int argc, char* argv[]) fd_info_y.handleType = vk_external_memory_handle_type; int fd_y; - // We need to get the pointer to the vkGetMemoryFdKHR function because - // it's from extension VK_KHR_external_memory_fd. - PFN_vkGetMemoryFdKHR vkGetMemoryFdKHR = - (PFN_vkGetMemoryFdKHR)vkGetDeviceProcAddr( - vk_device, vk_get_memory_function_name.c_str()); - - VK_CHECK(vkGetMemoryFdKHR(vk_device, &fd_info_x, &fd_x)); - VK_CHECK(vkGetMemoryFdKHR(vk_device, &fd_info_y, &fd_y)); + // We need to get the pointer to the + // vkGetMemoryFdKHR/vkGetMemoryWin32HandleKHR function because it's from + // extension VK_KHR_external_memory_fd. This Vulkan function exports a + // POSIX file descriptor/Windows handle referencing the payload of a + // Vulkan device memory object. + PFN_vkGetMemoryFdKHR vkGetMemoryFd; + *(PFN_vkGetMemoryFdKHR*)&vkGetMemoryFd = + (PFN_vkGetMemoryFdKHR)vkGetDeviceProcAddr(vk_device, + "vkGetMemoryFdKHR"); + VK_CHECK(vkGetMemoryFd(vk_device, &fd_info_x, &fd_x)); + VK_CHECK(vkGetMemoryFd(vk_device, &fd_info_y, &fd_y)); +#endif // Create OpenCL buffers from Vulkan external memory file descriptors. std::vector ext_mem_props_x = { (cl_mem_properties)CL_EXTERNAL_MEMORY_HANDLE_OPAQUE_FD_KHR, +#ifdef _WIN32 + (cl_mem_properties)handle_x, +#else (cl_mem_properties)fd_x, +#endif (cl_mem_properties)CL_DEVICE_HANDLE_LIST_KHR, (cl_mem_properties)cl_device(), CL_DEVICE_HANDLE_LIST_END_KHR, @@ -452,7 +478,11 @@ int main(int argc, char* argv[]) }; std::vector ext_mem_props_y = { (cl_mem_properties)CL_EXTERNAL_MEMORY_HANDLE_OPAQUE_FD_KHR, +#ifdef _WIN32 + (cl_mem_properties)handle_y, +#else (cl_mem_properties)fd_y, +#endif (cl_mem_properties)CL_DEVICE_HANDLE_LIST_KHR, (cl_mem_properties)cl_device(), CL_DEVICE_HANDLE_LIST_END_KHR,