Blender V5.0
vk_pixel_buffer.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "vk_pixel_buffer.hh"
10
11#include "vk_backend.hh"
12
13#include "CLG_log.h"
14
15namespace blender::gpu {
16
17static CLG_LogRef LOG = {"gpu.vulkan"};
18
20
21void VKPixelBuffer::create(bool memory_export)
22{
23 /* Create on demand with or without memory export. When memory export is
24 * enabled there is no host mapping. */
25 if (buffer_initialized_ && buffer_memory_export_ == memory_export) {
26 return;
27 }
28
29 if (buffer_.is_allocated()) {
30 buffer_.free();
31 }
32
33 buffer_.create(size_,
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,
37 0.8f,
38 memory_export);
39 debug::object_label(buffer_.vk_handle(), "PixelBuffer");
40
41 buffer_initialized_ = true;
42 buffer_memory_export_ = memory_export;
43}
44
46{
47 /* Vulkan buffers are always mapped between allocation and freeing. */
48 create(false);
49 return buffer_.mapped_memory_get();
50}
51
53{
54 /* Vulkan buffers are always mapped between allocation and freeing. */
55}
56
58{
59 VKDevice &device = VKBackend::get().device;
60
61 GPUPixelBufferNativeHandle native_handle;
62
63 /* Functionality supported? */
64 if (!device.extensions_get().external_memory) {
65 return native_handle;
66 }
67
68 /* Create buffer. */
69 create(true);
70
71 /* Get device memory. */
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");
76 return native_handle;
77 }
78
79#ifdef _WIN32
80 /* Opaque Windows handle. */
81 VkMemoryGetWin32HandleInfoKHR info = {};
82 info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR;
83 info.pNext = nullptr;
84 info.memory = memory;
85 info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
86
87 HANDLE handle = 0;
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");
90 return native_handle;
91 }
92
93 native_handle.handle = int64_t(handle);
94 native_handle.size = memory_size;
95#else
96 /* Opaque file descriptor. */
97 VkMemoryGetFdInfoKHR info = {};
98 info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
99 info.pNext = nullptr;
100 info.memory = memory;
101 info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
102
103 int fd = -1;
104 if (device.functions.vkGetMemoryFd(device.vk_handle(), &info, &fd) != VK_SUCCESS) {
105 CLOG_ERROR(&LOG, "Failed to get file descriptor for Vulkan pixel buffer");
106 return native_handle;
107 }
108
109 native_handle.handle = int64_t(fd);
110 native_handle.size = memory_size;
111#endif
112
113 return native_handle;
114}
115
117{
118 return size_;
119}
120
121} // namespace blender::gpu
#define CLOG_ERROR(clg_ref,...)
Definition CLG_log.h:188
long long int int64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
static VKBackend & get()
Definition vk_backend.hh:91
PFN_vkGetMemoryFdKHR vkGetMemoryFd
Definition vk_device.hh:241
VkDevice vk_handle() const
Definition vk_device.hh:311
const VKExtensions & extensions_get() const
Definition vk_device.hh:371
struct blender::gpu::VKDevice::@152120360333013146246346216002113345357100126073 functions
GPUPixelBufferNativeHandle get_native_handle() override
void create(bool memory_export)
void object_label(GLenum type, GLuint object, const char *name)
Definition gl_debug.cc:329
static CLG_LogRef LOG