Blender V5.0
vk_memory_pool.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "vk_memory_pool.hh"
10
11#include "vk_device.hh"
12
13namespace blender::gpu {
14
16{
17 if (device.extensions_get().external_memory) {
18 init_external_memory_image(device);
19 init_external_memory_pixel_buffer(device);
20 }
21}
22
23void VKMemoryPools::init_external_memory_image(VKDevice &device)
24{
25 VkExternalMemoryImageCreateInfo external_image_create_info = {
26 VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
27 nullptr,
29 VkImageCreateInfo image_create_info = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
30 &external_image_create_info,
31 0,
32 VK_IMAGE_TYPE_2D,
33 VK_FORMAT_R8G8B8A8_UNORM,
34 {1024, 1024, 1},
35 1,
36 1,
37 VK_SAMPLE_COUNT_1_BIT,
38 VK_IMAGE_TILING_OPTIMAL,
39 VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
40 VK_IMAGE_USAGE_TRANSFER_DST_BIT |
41 VK_IMAGE_USAGE_SAMPLED_BIT,
42 VK_SHARING_MODE_EXCLUSIVE,
43 0,
44 nullptr,
45 VK_IMAGE_LAYOUT_UNDEFINED};
46 VmaAllocationCreateInfo allocation_create_info = {};
47 allocation_create_info.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;
48 allocation_create_info.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;
49 uint32_t memory_type_index;
50 vmaFindMemoryTypeIndexForImageInfo(
51 device.mem_allocator_get(), &image_create_info, &allocation_create_info, &memory_type_index);
52
54 VmaPoolCreateInfo pool_create_info = {};
55 pool_create_info.memoryTypeIndex = memory_type_index;
56 pool_create_info.pMemoryAllocateNext = &external_memory_image.info;
57 pool_create_info.priority = 1.0f;
58 vmaCreatePool(device.mem_allocator_get(), &pool_create_info, &external_memory_image.pool);
59}
60
61void VKMemoryPools::init_external_memory_pixel_buffer(VKDevice &device)
62{
63 VkExternalMemoryBufferCreateInfo external_buffer_create_info = {
64 VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
65 nullptr,
67 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
68 &external_buffer_create_info,
69 0,
70 1024,
71 VK_BUFFER_USAGE_TRANSFER_DST_BIT |
72 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
73 VK_SHARING_MODE_EXCLUSIVE,
74 0,
75 nullptr};
76 VmaAllocationCreateInfo allocation_create_info = {};
77 allocation_create_info.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;
78 allocation_create_info.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;
79 uint32_t memory_type_index;
80 vmaFindMemoryTypeIndexForBufferInfo(device.mem_allocator_get(),
81 &buffer_create_info,
82 &allocation_create_info,
83 &memory_type_index);
84
86 VmaPoolCreateInfo pool_create_info = {};
87 pool_create_info.memoryTypeIndex = memory_type_index;
88 pool_create_info.pMemoryAllocateNext = &external_memory_pixel_buffer.info;
89 pool_create_info.priority = 1.0f;
90 vmaCreatePool(device.mem_allocator_get(), &pool_create_info, &external_memory_pixel_buffer.pool);
91}
92
94{
95 external_memory_image.deinit(device);
96 external_memory_pixel_buffer.deinit(device);
97}
98
100{
101 vmaDestroyPool(device.mem_allocator_get(), pool);
102}
103
104} // namespace blender::gpu
VmaAllocator mem_allocator_get() const
Definition vk_device.hh:321
const VKExtensions & extensions_get() const
Definition vk_device.hh:371
constexpr VkExternalMemoryHandleTypeFlags vk_external_memory_handle_type()
void deinit(VKDevice &device)
void deinit(VKDevice &device)
VKMemoryPool external_memory_pixel_buffer
void init(VKDevice &device)