Blender V4.5
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
16{
17 descriptor_pools.init(device);
18}
19
21{
22 destroy_discarded_resources(device, true);
23}
24
26{
27 src_pool.buffer_views_.update_timeline(timeline);
28 src_pool.buffers_.update_timeline(timeline);
29 src_pool.image_views_.update_timeline(timeline);
30 src_pool.images_.update_timeline(timeline);
31 src_pool.shader_modules_.update_timeline(timeline);
32 src_pool.pipelines_.update_timeline(timeline);
33 src_pool.pipeline_layouts_.update_timeline(timeline);
34 src_pool.framebuffers_.update_timeline(timeline);
35 src_pool.render_passes_.update_timeline(timeline);
36 src_pool.descriptor_pools_.update_timeline(timeline);
37 buffer_views_.extend(std::move(src_pool.buffer_views_));
38 buffers_.extend(std::move(src_pool.buffers_));
39 image_views_.extend(std::move(src_pool.image_views_));
40 images_.extend(std::move(src_pool.images_));
41 shader_modules_.extend(std::move(src_pool.shader_modules_));
42 pipelines_.extend(std::move(src_pool.pipelines_));
43 pipeline_layouts_.extend(std::move(src_pool.pipeline_layouts_));
44 framebuffers_.extend(std::move(src_pool.framebuffers_));
45 render_passes_.extend(std::move(src_pool.render_passes_));
46 descriptor_pools_.extend(std::move(src_pool.descriptor_pools_));
47}
48
49void VKDiscardPool::discard_image(VkImage vk_image, VmaAllocation vma_allocation)
50{
51 std::scoped_lock mutex(mutex_);
52 images_.append_timeline(timeline_, std::pair(vk_image, vma_allocation));
53}
54
55void VKDiscardPool::discard_image_view(VkImageView vk_image_view)
56{
57 std::scoped_lock mutex(mutex_);
58 image_views_.append_timeline(timeline_, vk_image_view);
59}
60
61void VKDiscardPool::discard_buffer(VkBuffer vk_buffer, VmaAllocation vma_allocation)
62{
63 std::scoped_lock mutex(mutex_);
64 buffers_.append_timeline(timeline_, std::pair(vk_buffer, vma_allocation));
65}
66
67void VKDiscardPool::discard_buffer_view(VkBufferView vk_buffer_view)
68{
69 std::scoped_lock mutex(mutex_);
70 buffer_views_.append_timeline(timeline_, vk_buffer_view);
71}
72
73void VKDiscardPool::discard_shader_module(VkShaderModule vk_shader_module)
74{
75 std::scoped_lock mutex(mutex_);
76 shader_modules_.append_timeline(timeline_, vk_shader_module);
77}
78void VKDiscardPool::discard_pipeline(VkPipeline vk_pipeline)
79{
80 std::scoped_lock mutex(mutex_);
81 pipelines_.append_timeline(timeline_, vk_pipeline);
82}
83void VKDiscardPool::discard_pipeline_layout(VkPipelineLayout vk_pipeline_layout)
84{
85 std::scoped_lock mutex(mutex_);
86 pipeline_layouts_.append_timeline(timeline_, vk_pipeline_layout);
87}
88
89void VKDiscardPool::discard_framebuffer(VkFramebuffer vk_framebuffer)
90{
91 std::scoped_lock mutex(mutex_);
92 framebuffers_.append_timeline(timeline_, vk_framebuffer);
93}
94
95void VKDiscardPool::discard_render_pass(VkRenderPass vk_render_pass)
96{
97 std::scoped_lock mutex(mutex_);
98 render_passes_.append_timeline(timeline_, vk_render_pass);
99}
100
101void VKDiscardPool::discard_descriptor_pool(VkDescriptorPool vk_descriptor_pool)
102{
103 std::scoped_lock mutex(mutex_);
104 descriptor_pools_.append_timeline(timeline_, vk_descriptor_pool);
105}
106
108{
109 std::scoped_lock mutex(mutex_);
110 TimelineValue current_timeline = force ? UINT64_MAX : device.submission_finished_timeline_get();
111
112 image_views_.remove_old(current_timeline, [&](VkImageView vk_image_view) {
113 vkDestroyImageView(device.vk_handle(), vk_image_view, nullptr);
114 });
115
116 images_.remove_old(current_timeline, [&](std::pair<VkImage, VmaAllocation> image_allocation) {
117 device.resources.remove_image(image_allocation.first);
118 vmaDestroyImage(device.mem_allocator_get(), image_allocation.first, image_allocation.second);
119 });
120 buffer_views_.remove_old(current_timeline, [&](VkBufferView vk_buffer_view) {
121 vkDestroyBufferView(device.vk_handle(), vk_buffer_view, nullptr);
122 });
123
124 buffers_.remove_old(current_timeline, [&](std::pair<VkBuffer, VmaAllocation> buffer_allocation) {
125 device.resources.remove_buffer(buffer_allocation.first);
126 vmaDestroyBuffer(
127 device.mem_allocator_get(), buffer_allocation.first, buffer_allocation.second);
128 });
129
130 pipelines_.remove_old(current_timeline, [&](VkPipeline vk_pipeline) {
131 vkDestroyPipeline(device.vk_handle(), vk_pipeline, nullptr);
132 });
133
134 pipeline_layouts_.remove_old(current_timeline, [&](VkPipelineLayout vk_pipeline_layout) {
135 vkDestroyPipelineLayout(device.vk_handle(), vk_pipeline_layout, nullptr);
136 });
137
138 shader_modules_.remove_old(current_timeline, [&](VkShaderModule vk_shader_module) {
139 vkDestroyShaderModule(device.vk_handle(), vk_shader_module, nullptr);
140 });
141
142 framebuffers_.remove_old(current_timeline, [&](VkFramebuffer vk_framebuffer) {
143 vkDestroyFramebuffer(device.vk_handle(), vk_framebuffer, nullptr);
144 });
145
146 render_passes_.remove_old(current_timeline, [&](VkRenderPass vk_render_pass) {
147 vkDestroyRenderPass(device.vk_handle(), vk_render_pass, nullptr);
148 });
149
150 // TODO: Introduce reuse_old as the allocations can all be reused by resetting the pool.
151 descriptor_pools_.remove_old(current_timeline, [&](VkDescriptorPool vk_descriptor_pool) {
152 vkResetDescriptorPool(device.vk_handle(), vk_descriptor_pool, 0);
153 vkDestroyDescriptorPool(device.vk_handle(), vk_descriptor_pool, nullptr);
154 });
155}
156
158{
159 VKContext *context = VKContext::get();
160 if (context != nullptr) {
161 return context->discard_pool;
162 }
163
164 VKDevice &device = VKBackend::get().device;
165 if (G.is_rendering) {
166 return device.orphaned_data_render;
167 }
168 else {
169 return device.orphaned_data;
170 }
171}
172
173} // 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:242
VmaAllocator mem_allocator_get() const
Definition vk_device.hh:346
VkDevice vk_handle() const
Definition vk_device.hh:336
TimelineValue submission_finished_timeline_get() const
Definition vk_device.hh:427
VKDiscardPool orphaned_data
Definition vk_device.hh:243
VKDiscardPool orphaned_data_render
Definition vk_device.hh:245
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_framebuffer(VkFramebuffer vk_framebuffer)
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 discard_descriptor_pool(VkDescriptorPool vk_descriptor_pool)
void destroy_discarded_resources(VKDevice &device, bool force=false)
void discard_render_pass(VkRenderPass vk_render_pass)
void init(VKDevice &device)
#define UINT64_MAX
ThreadMutex mutex
#define G(x, y, z)
uint64_t TimelineValue
Definition vk_common.hh:36