Skip to content

Commit

Permalink
Test windows
Browse files Browse the repository at this point in the history
  • Loading branch information
Beanavil committed Dec 15, 2023
1 parent c0ae855 commit 64c7ca0
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 42 deletions.
2 changes: 0 additions & 2 deletions .github/workflows/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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." }
}
Expand Down
67 changes: 48 additions & 19 deletions samples/extensions/khr/externalmemory/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 };
Expand All @@ -513,27 +529,40 @@ 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,
0
};
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,
Expand Down
72 changes: 51 additions & 21 deletions samples/extensions/khr/externalmemory/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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{};
Expand All @@ -432,27 +450,39 @@ 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<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)cl_device(),
CL_DEVICE_HANDLE_LIST_END_KHR,
0
};
std::vector<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)cl_device(),
CL_DEVICE_HANDLE_LIST_END_KHR,
Expand Down

0 comments on commit 64c7ca0

Please sign in to comment.