Skip to content

Commit d6c1e5a

Browse files
jzulauf-lunargjeremyg-lunarg
authored andcommitted
layers: New merge/split in buffer_address_map
1 parent 954cab0 commit d6c1e5a

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

layers/containers/custom_containers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ class small_vector {
357357
inline const_iterator cend() const { return GetWorkingStore() + size_; }
358358
inline const_iterator end() const { return GetWorkingStore() + size_; }
359359
inline size_type size() const { return size_; }
360+
auto capacity() const { return capacity_; }
360361

361362
inline pointer data() { return GetWorkingStore(); }
362363
inline const_pointer data() const { return GetWorkingStore(); }

layers/state_tracker/state_tracker.cpp

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,29 @@ void ValidationStateTracker::PreCallRecordCmdBlitImage2(VkCommandBuffer commandB
342342
Get<IMAGE_STATE>(pBlitImageInfo->dstImage));
343343
}
344344

345+
struct BufferAddressInfillUpdateOps {
346+
using Map = typename ValidationStateTracker::BufferAddressRangeMap;
347+
using Iterator = typename Map::iterator;
348+
using Value = typename Map::value_type;
349+
using Mapped = typename Map::mapped_type;
350+
using Range = typename Map::key_type;
351+
void infill(Map &map, const Iterator &pos, const Range &infill_range) const {
352+
map.insert(pos, Value(infill_range, insert_value));
353+
}
354+
void update(const Iterator &pos) const {
355+
auto &current_buffer_list = pos->second;
356+
assert(!current_buffer_list.empty());
357+
const auto buffer_found_it = std::find(current_buffer_list.begin(), current_buffer_list.end(), insert_value[0]);
358+
if (buffer_found_it == current_buffer_list.end()) {
359+
if (current_buffer_list.capacity() <= (current_buffer_list.size() + 1)) {
360+
current_buffer_list.reserve(current_buffer_list.capacity() * 2);
361+
}
362+
current_buffer_list.emplace_back(insert_value[0]);
363+
}
364+
}
365+
const Mapped &insert_value;
366+
};
367+
345368
void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
346369
const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer,
347370
VkResult result) {
@@ -366,14 +389,8 @@ void ValidationStateTracker::PostCallRecordCreateBuffer(VkDevice device, const V
366389
buffer_state->deviceAddress = opaque_capture_address->opaqueCaptureAddress;
367390
const auto address_range = buffer_state->DeviceAddressRange();
368391

369-
buffer_address_map_.split_and_merge_insert(
370-
{address_range, {buffer_state}}, [](auto &current_buffer_list, const auto &new_buffer) {
371-
assert(!current_buffer_list.empty());
372-
const auto buffer_found_it = std::find(current_buffer_list.begin(), current_buffer_list.end(), new_buffer[0]);
373-
if (buffer_found_it == current_buffer_list.end()) {
374-
current_buffer_list.emplace_back(new_buffer[0]);
375-
}
376-
});
392+
BufferAddressInfillUpdateOps ops{{buffer_state}};
393+
sparse_container::infill_update_range(buffer_address_map_, address_range, ops);
377394
}
378395

379396
const VkBufferUsageFlags descriptor_buffer_usages =
@@ -5707,14 +5724,8 @@ void ValidationStateTracker::RecordGetBufferDeviceAddress(const VkBufferDeviceAd
57075724
buffer_state->deviceAddress = address;
57085725
const auto address_range = buffer_state->DeviceAddressRange();
57095726

5710-
buffer_address_map_.split_and_merge_insert(
5711-
{address_range, {buffer_state}}, [](auto &current_buffer_list, const auto &new_buffer) {
5712-
assert(!current_buffer_list.empty());
5713-
const auto buffer_found_it = std::find(current_buffer_list.begin(), current_buffer_list.end(), new_buffer[0]);
5714-
if (buffer_found_it == current_buffer_list.end()) {
5715-
current_buffer_list.emplace_back(new_buffer[0]);
5716-
}
5717-
});
5727+
BufferAddressInfillUpdateOps ops{{buffer_state}};
5728+
sparse_container::infill_update_range(buffer_address_map_, address_range, ops);
57185729
}
57195730
}
57205731

layers/state_tracker/state_tracker.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,6 +1596,9 @@ class ValidationStateTracker : public ValidationObject {
15961596

15971597
mutable VideoProfileDesc::Cache video_profile_cache_;
15981598

1599+
using BufferAddressMapStore = small_vector<std::shared_ptr<BUFFER_STATE>, 1, size_t>;
1600+
using BufferAddressRangeMap = sparse_container::range_map<VkDeviceAddress, BufferAddressMapStore>;
1601+
15991602
protected:
16001603
// tracks which queue family index were used when creating the device for quick lookup
16011604
vvl::unordered_set<uint32_t> queue_family_index_set;
@@ -1608,7 +1611,7 @@ class ValidationStateTracker : public ValidationObject {
16081611
};
16091612
std::vector<DeviceQueueInfo> device_queue_info_list;
16101613
// If vkGetBufferDeviceAddress is called, keep track of buffer <-> address mapping.
1611-
sparse_container::range_map<VkDeviceAddress, small_vector<std::shared_ptr<BUFFER_STATE>, 1, size_t>> buffer_address_map_;
1614+
BufferAddressRangeMap buffer_address_map_;
16121615
mutable std::shared_mutex buffer_address_lock_;
16131616

16141617
vl_concurrent_unordered_map<uint64_t, VkFormatFeatureFlags2KHR> ahb_ext_formats_map;

0 commit comments

Comments
 (0)