25 if (buffer_initialized_ && buffer_memory_export_ == memory_export) {
29 if (buffer_.is_allocated()) {
34 VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
35 VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE,
36 VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
41 buffer_initialized_ =
true;
42 buffer_memory_export_ = memory_export;
72 size_t memory_size = 0;
73 VkDeviceMemory memory = buffer_.export_memory_get(memory_size);
74 if (memory ==
nullptr) {
75 CLOG_ERROR(&
LOG,
"Failed to get device memory for Vulkan pixel buffer");
81 VkMemoryGetWin32HandleInfoKHR info = {};
82 info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR;
85 info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
88 if (device.
functions.vkGetMemoryWin32Handle(device.
vk_handle(), &info, &handle) != VK_SUCCESS) {
89 CLOG_ERROR(&
LOG,
"Failed to get Windows handle for Vulkan pixel buffer");
94 native_handle.
size = memory_size;
97 VkMemoryGetFdInfoKHR info = {};
98 info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
100 info.memory = memory;
101 info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
105 CLOG_ERROR(&
LOG,
"Failed to get file descriptor for Vulkan pixel buffer");
106 return native_handle;
110 native_handle.
size = memory_size;
113 return native_handle;