Blender V4.5
vk_resource_state_tracker.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 "BLI_index_range.hh"
10
12
14
15/* -------------------------------------------------------------------- */
18ResourceHandle VKResourceStateTracker::create_resource_slot()
19{
20 ResourceHandle handle;
21 if (unused_handles_.is_empty()) {
22 handle = resources_.size();
23 }
24 else {
25 handle = unused_handles_.pop_last();
26 }
27
28 Resource new_resource = {};
29 resources_.add_new(handle, new_resource);
30 return handle;
31}
32
33void VKResourceStateTracker::add_image(VkImage vk_image, uint32_t layer_count, const char *name)
34{
36 BLI_assert_msg(!image_resources_.contains(vk_image),
37 "Image resource is added twice to the render graph.");
38 std::scoped_lock lock(mutex);
39 ResourceHandle handle = create_resource_slot();
40 Resource &resource = resources_.lookup(handle);
41 image_resources_.add_new(vk_image, handle);
42
44 resource.image.vk_image = vk_image;
45 resource.image.layer_count = layer_count;
46 resource.stamp = 0;
47#ifndef NDEBUG
48 resource.name = name;
49#endif
50
51#ifdef VK_RESOURCE_STATE_TRACKER_VALIDATION
52 validate();
53#endif
54}
55
56void VKResourceStateTracker::add_buffer(VkBuffer vk_buffer, const char *name)
57{
59 BLI_assert_msg(!buffer_resources_.contains(vk_buffer),
60 "Buffer resource is added twice to the render graph.");
61 std::scoped_lock lock(mutex);
62 ResourceHandle handle = create_resource_slot();
63 Resource &resource = resources_.lookup(handle);
64 buffer_resources_.add_new(vk_buffer, handle);
65
67 resource.buffer.vk_buffer = vk_buffer;
68 resource.stamp = 0;
69#ifndef NDEBUG
70 resource.name = name;
71#endif
72
73#ifdef VK_RESOURCE_STATE_TRACKER_VALIDATION
74 validate();
75#endif
76}
77
79
80/* -------------------------------------------------------------------- */
83
85{
86 std::scoped_lock lock(mutex);
87 ResourceHandle handle = buffer_resources_.pop(vk_buffer);
88 resources_.pop(handle);
89 unused_handles_.append(handle);
90
91#ifdef VK_RESOURCE_STATE_TRACKER_VALIDATION
92 validate();
93#endif
94}
95
97{
98 std::scoped_lock lock(mutex);
99 ResourceHandle handle = image_resources_.pop(vk_image);
100 resources_.pop(handle);
101 unused_handles_.append(handle);
102
103#ifdef VK_RESOURCE_STATE_TRACKER_VALIDATION
104 validate();
105#endif
106}
107
109
110ResourceWithStamp VKResourceStateTracker::get_stamp(ResourceHandle handle,
111 const Resource &resource)
112{
114 result.handle = handle;
115 result.stamp = resource.stamp;
116 return result;
117}
118
119ResourceWithStamp VKResourceStateTracker::get_and_increase_stamp(ResourceHandle handle,
120 Resource &resource)
121{
122 ResourceWithStamp result = get_stamp(handle, resource);
123 resource.stamp += 1;
124 return result;
125}
126
128{
129 ResourceHandle handle = image_resources_.lookup(vk_image);
130 Resource &resource = resources_.lookup(handle);
131 return get_and_increase_stamp(handle, resource);
132}
133
135{
136 ResourceHandle handle = buffer_resources_.lookup(vk_buffer);
137 Resource &resource = resources_.lookup(handle);
138 return get_and_increase_stamp(handle, resource);
139}
140
142{
143 ResourceHandle handle = buffer_resources_.lookup(vk_buffer);
144 const Resource &resource = resources_.lookup(handle);
145 return get_stamp(handle, resource);
146}
147
149{
150 ResourceHandle handle = image_resources_.lookup(vk_image);
151 const Resource &resource = resources_.lookup(handle);
152 return get_stamp(handle, resource);
153}
154
155#ifdef VK_RESOURCE_STATE_TRACKER_VALIDATION
156void VKResourceStateTracker::validate() const
157{
158 for (const Map<VkImage, ResourceHandle>::Item &item : image_resources_.items()) {
159 for (ResourceHandle buffer_handle : buffer_resources_.values()) {
160 BLI_assert(item.value != buffer_handle);
161 }
162 BLI_assert(resources_.contains(item.value));
163 const Resource &resource = resources_.lookup(item.value);
165 }
166
167 for (const Map<VkBuffer, ResourceHandle>::Item &item : buffer_resources_.items()) {
168 for (ResourceHandle image_handle : image_resources_.values()) {
169 BLI_assert(item.value != image_handle);
170 }
171 BLI_assert(resources_.contains(item.value));
172 const Resource &resource = resources_.lookup(item.value);
174 }
175
176 BLI_assert(resources_.size() == image_resources_.size() + buffer_resources_.size());
177}
178#endif
179
181{
182 std::ostream &os = std::cout;
183 os << "VKResourceStateTracker\n";
184 os << " resources=(" << resources_.size() << "/" << resources_.capacity() << ")\n";
185 os << " buffers=(" << buffer_resources_.size() << "/" << buffer_resources_.capacity() << ")\n";
186 os << " images=(" << image_resources_.size() << "/" << image_resources_.capacity() << ")\n";
187 os << " unused=(" << unused_handles_.size() << "/" << unused_handles_.capacity() << ")\n";
188}
189
190} // namespace blender::gpu::render_graph
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
#define UNUSED_VARS_NDEBUG(...)
volatile int lock
ValueIterator values() const &
Definition BLI_map.hh:884
const Value & lookup(const Key &key) const
Definition BLI_map.hh:545
bool contains(const Key &key) const
Definition BLI_map.hh:353
ItemIterator items() const &
Definition BLI_map.hh:902
MapItem< Key, Value > Item
Definition BLI_map.hh:132
ResourceWithStamp get_image_and_increase_stamp(VkImage vk_image)
ResourceWithStamp get_buffer_and_increase_stamp(VkBuffer vk_buffer)
ResourceWithStamp get_buffer(VkBuffer vk_buffer) const
void add_image(VkImage vk_image, uint32_t layer_count, const char *name=nullptr)
void add_buffer(VkBuffer vk_buffer, const char *name=nullptr)
ResourceWithStamp get_image(VkImage vk_image) const
#define resource