Blender V4.5
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 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
36 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
37 VmaAllocationCreateFlags(0),
38 0.8f,
39 memory_export);
40 debug::object_label(buffer_.vk_handle(), "PixelBuffer");
41
42 buffer_initialized_ = true;
43 buffer_memory_export_ = memory_export;
44}
45
47{
48 /* Vulkan buffers are always mapped between allocation and freeing. */
49 create(false);
50 return buffer_.mapped_memory_get();
51}
52
54{
55 /* Vulkan buffers are always mapped between allocation and freeing. */
56}
57
59{
60 VKDevice &device = VKBackend::get().device;
61
62 GPUPixelBufferNativeHandle native_handle;
63
64 /* Functionality supported? */
65 if (!device.extensions_get().external_memory) {
66 return native_handle;
67 }
68
69 /* Create buffer. */
70 create(true);
71
72 /* Get device memory. */
73 size_t memory_size = 0;
74 VkDeviceMemory memory = buffer_.export_memory_get(memory_size);
75 if (memory == nullptr) {
76 CLOG_ERROR(&LOG, "Failed to get device memory for Vulkan pixel buffer");
77 return native_handle;
78 }
79
80#ifdef _WIN32
81 /* Opaque Windows handle. */
82 VkMemoryGetWin32HandleInfoKHR info = {};
83 info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR;
84 info.pNext = nullptr;
85 info.memory = memory;
86 info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
87
88 HANDLE handle = 0;
89 if (device.functions.vkGetMemoryWin32Handle(device.vk_handle(), &info, &handle) != VK_SUCCESS) {
90 CLOG_ERROR(&LOG, "Failed to get Windows handle for Vulkan pixel buffer");
91 return native_handle;
92 }
93
94 native_handle.handle = int64_t(handle);
95 native_handle.size = memory_size;
96#else
97 /* Opaque file descriptor. */
98 VkMemoryGetFdInfoKHR info = {};
99 info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
100 info.pNext = nullptr;
101 info.memory = memory;
102 info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
103
104 int fd = -1;
105 if (device.functions.vkGetMemoryFd(device.vk_handle(), &info, &fd) != VK_SUCCESS) {
106 CLOG_ERROR(&LOG, "Failed to get file descriptor for Vulkan pixel buffer");
107 return native_handle;
108 }
109
110 native_handle.handle = int64_t(fd);
111 native_handle.size = memory_size;
112#endif
113
114 return native_handle;
115}
116
118{
119 return size_;
120}
121
122} // namespace blender::gpu
#define CLOG_ERROR(clg_ref,...)
Definition CLG_log.h:182
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:266
VkDevice vk_handle() const
Definition vk_device.hh:336
const VKExtensions & extensions_get() const
Definition vk_device.hh:396
struct blender::gpu::VKDevice::@164322360241203077355133066050124027157363067003 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