Blender V5.0
vk_resource_pool.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "vk_resource_pool.hh"
10#include "vk_backend.hh"
11#include "vk_context.hh"
12
13namespace blender::gpu {
14
19
21{
22 src_pool.buffer_views_.update_timeline(timeline);
23 src_pool.buffers_.update_timeline(timeline);
24 src_pool.image_views_.update_timeline(timeline);
25 src_pool.images_.update_timeline(timeline);
26 src_pool.shader_modules_.update_timeline(timeline);
27 src_pool.pipelines_.update_timeline(timeline);
28 src_pool.pipeline_layouts_.update_timeline(timeline);
29 src_pool.descriptor_pools_.update_timeline(timeline);
30 buffer_views_.extend(std::move(src_pool.buffer_views_));
31 buffers_.extend(std::move(src_pool.buffers_));
32 image_views_.extend(std::move(src_pool.image_views_));
33 images_.extend(std::move(src_pool.images_));
34 shader_modules_.extend(std::move(src_pool.shader_modules_));
35 pipelines_.extend(std::move(src_pool.pipelines_));
36 pipeline_layouts_.extend(std::move(src_pool.pipeline_layouts_));
37 descriptor_pools_.extend(std::move(src_pool.descriptor_pools_));
38}
39
40void VKDiscardPool::discard_image(VkImage vk_image, VmaAllocation vma_allocation)
41{
42 std::scoped_lock mutex(mutex_);
43 images_.append_timeline(timeline_, std::pair(vk_image, vma_allocation));
44}
45
46void VKDiscardPool::discard_image_view(VkImageView vk_image_view)
47{
48 std::scoped_lock mutex(mutex_);
49 image_views_.append_timeline(timeline_, vk_image_view);
50}
51
52void VKDiscardPool::discard_buffer(VkBuffer vk_buffer, VmaAllocation vma_allocation)
53{
54 std::scoped_lock mutex(mutex_);
55 buffers_.append_timeline(timeline_, std::pair(vk_buffer, vma_allocation));
56}
57
58void VKDiscardPool::discard_buffer_view(VkBufferView vk_buffer_view)
59{
60 std::scoped_lock mutex(mutex_);
61 buffer_views_.append_timeline(timeline_, vk_buffer_view);
62}
63
64void VKDiscardPool::discard_shader_module(VkShaderModule vk_shader_module)
65{
66 std::scoped_lock mutex(mutex_);
67 shader_modules_.append_timeline(timeline_, vk_shader_module);
68}
69void VKDiscardPool::discard_pipeline(VkPipeline vk_pipeline)
70{
71 std::scoped_lock mutex(mutex_);
72 pipelines_.append_timeline(timeline_, vk_pipeline);
73}
74void VKDiscardPool::discard_pipeline_layout(VkPipelineLayout vk_pipeline_layout)
75{
76 std::scoped_lock mutex(mutex_);
77 pipeline_layouts_.append_timeline(timeline_, vk_pipeline_layout);
78}
79
80void VKDiscardPool::discard_descriptor_pool_for_reuse(VkDescriptorPool vk_descriptor_pool,
81 VKDescriptorPools *descriptor_pools)
82{
83 std::scoped_lock mutex(mutex_);
84 descriptor_pools_.append_timeline(timeline_, std::pair(vk_descriptor_pool, descriptor_pools));
85}
86
88{
89 std::scoped_lock mutex(mutex_);
90
91 image_views_.remove_old(current_timeline, [&](VkImageView vk_image_view) {
92 vkDestroyImageView(device.vk_handle(), vk_image_view, nullptr);
93 });
94
95 images_.remove_old(current_timeline, [&](std::pair<VkImage, VmaAllocation> image_allocation) {
96 device.resources.remove_image(image_allocation.first);
97 vmaDestroyImage(device.mem_allocator_get(), image_allocation.first, image_allocation.second);
98 });
99 buffer_views_.remove_old(current_timeline, [&](VkBufferView vk_buffer_view) {
100 vkDestroyBufferView(device.vk_handle(), vk_buffer_view, nullptr);
101 });
102
103 buffers_.remove_old(current_timeline, [&](std::pair<VkBuffer, VmaAllocation> buffer_allocation) {
104 device.resources.remove_buffer(buffer_allocation.first);
105 vmaDestroyBuffer(
106 device.mem_allocator_get(), buffer_allocation.first, buffer_allocation.second);
107 });
108
109 pipelines_.remove_old(current_timeline, [&](VkPipeline vk_pipeline) {
110 vkDestroyPipeline(device.vk_handle(), vk_pipeline, nullptr);
111 });
112
113 pipeline_layouts_.remove_old(current_timeline, [&](VkPipelineLayout vk_pipeline_layout) {
114 vkDestroyPipelineLayout(device.vk_handle(), vk_pipeline_layout, nullptr);
115 });
116
117 shader_modules_.remove_old(current_timeline, [&](VkShaderModule vk_shader_module) {
118 vkDestroyShaderModule(device.vk_handle(), vk_shader_module, nullptr);
119 });
120
121 descriptor_pools_.remove_old(
122 current_timeline, [&](std::pair<VkDescriptorPool, VKDescriptorPools *> descriptor_pool) {
123 descriptor_pool.second->recycle(descriptor_pool.first);
124 });
125}
126
128{
129 VKContext *context = VKContext::get();
130 if (context != nullptr) {
131 return context->discard_pool;
132 }
133
134 VKDevice &device = VKBackend::get().device;
135 if (G.is_rendering) {
136 return device.orphaned_data_render;
137 }
138 else {
139 return device.orphaned_data;
140 }
141}
142
143} // namespace blender::gpu
void update_timeline(TimelineValue timeline)
static VKBackend & get()
Definition vk_backend.hh:91
static VKContext * get()
render_graph::VKResourceStateTracker resources
Definition vk_device.hh:217
VmaAllocator mem_allocator_get() const
Definition vk_device.hh:321
VkDevice vk_handle() const
Definition vk_device.hh:311
VKDiscardPool orphaned_data
Definition vk_device.hh:218
VKDiscardPool orphaned_data_render
Definition vk_device.hh:220
void discard_image_view(VkImageView vk_image_view)
void discard_buffer_view(VkBufferView vk_buffer_view)
void move_data(VKDiscardPool &src_pool, TimelineValue timeline)
void discard_descriptor_pool_for_reuse(VkDescriptorPool vk_descriptor_pool, VKDescriptorPools *descriptor_pools)
static VKDiscardPool & discard_pool_get()
void discard_shader_module(VkShaderModule vk_shader_module)
void discard_image(VkImage vk_image, VmaAllocation vma_allocation)
void discard_buffer(VkBuffer vk_buffer, VmaAllocation vma_allocation)
void deinit(VKDevice &device)
void discard_pipeline(VkPipeline vk_pipeline)
void discard_pipeline_layout(VkPipelineLayout vk_pipeline_layout)
void destroy_discarded_resources(VKDevice &device, TimelineValue current_timeline)
#define UINT64_MAX
ThreadMutex mutex
#define G(x, y, z)
uint64_t TimelineValue
Definition vk_common.hh:36