aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-03-06 15:05:05 +0100
committercrueter <crueter@eden-emu.dev>2026-03-06 15:05:05 +0100
commit2ed1328c93c4739c069e7a284cb82b0a72762dac (patch)
treea0cf86adc435eb4b3b3aab8f4dff1617a112f939 /src
parentc70b857c4f8324621c3d3f7dfe659856c8000878 (diff)
[vk] use static_vector instead of small_vector for TFB and other bindings (#3641)
MK8D is a big offender, taking up lots of time memcpy'ing and memmov'ing small_vector<> AND to add salt to the wound it doesn't even do heap allocations (no game does I think) - so basically useless waste of compute time in hot path for NO reason :^) Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3641 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: DraVee <chimera@dravee.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/video_core/buffer_cache/buffer_cache_base.h13
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.cpp50
2 files changed, 33 insertions, 30 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h
index 0596329392..08524bd854 100644
--- a/src/video_core/buffer_cache/buffer_cache_base.h
+++ b/src/video_core/buffer_cache/buffer_cache_base.h
@@ -14,9 +14,12 @@
#include <mutex>
#include <numeric>
#include <span>
-#include <ankerl/unordered_dense.h>
#include <vector>
+#include <ankerl/unordered_dense.h>
+#include <boost/container/static_vector.hpp>
+#include <boost/container/small_vector.hpp>
+
#include "common/common_types.h"
#include "common/div_ceil.h"
#include "common/literals.h"
@@ -94,10 +97,10 @@ static constexpr Binding NULL_BINDING{
template <typename Buffer>
struct HostBindings {
- boost::container::small_vector<Buffer*, NUM_VERTEX_BUFFERS> buffers;
- boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> offsets;
- boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> sizes;
- boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> strides;
+ boost::container::static_vector<Buffer*, NUM_VERTEX_BUFFERS> buffers;
+ boost::container::static_vector<u64, NUM_VERTEX_BUFFERS> offsets;
+ boost::container::static_vector<u64, NUM_VERTEX_BUFFERS> sizes;
+ boost::container::static_vector<u64, NUM_VERTEX_BUFFERS> strides;
u32 min_index{NUM_VERTEX_BUFFERS};
u32 max_index{0};
};
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index f4345262fb..c842cce709 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -10,6 +10,7 @@
#include <span>
#include <vector>
+#include "video_core/buffer_cache/buffer_cache_base.h"
#include "video_core/renderer_vulkan/vk_buffer_cache.h"
#include "video_core/renderer_vulkan/maxwell_to_vk.h"
@@ -583,18 +584,18 @@ void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset
}
void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bindings) {
- boost::container::small_vector<VkBuffer, 32> buffer_handles;
- for (u32 index = 0; index < bindings.buffers.size(); ++index) {
- auto handle = bindings.buffers[index]->Handle();
+ boost::container::static_vector<VkBuffer, VideoCommon::NUM_VERTEX_BUFFERS> buffer_handles(bindings.buffers.size());
+ for (u32 i = 0; i < bindings.buffers.size(); ++i) {
+ auto handle = bindings.buffers[i]->Handle();
if (handle == VK_NULL_HANDLE) {
- bindings.offsets[index] = 0;
- bindings.sizes[index] = VK_WHOLE_SIZE;
+ bindings.offsets[i] = 0;
+ bindings.sizes[i] = VK_WHOLE_SIZE;
if (!device.HasNullDescriptor()) {
ReserveNullBuffer();
handle = *null_buffer;
}
}
- buffer_handles.push_back(handle);
+ buffer_handles[i] = handle;
}
const u32 device_max = device.GetMaxVertexInputBindings();
const u32 min_binding = (std::min)(bindings.min_index, device_max);
@@ -604,19 +605,12 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi
return;
}
if (device.IsExtExtendedDynamicStateSupported()) {
- scheduler.Record([bindings_ = std::move(bindings),
- buffer_handles_ = std::move(buffer_handles),
- binding_count](vk::CommandBuffer cmdbuf) {
- cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, binding_count, buffer_handles_.data(),
- bindings_.offsets.data(), bindings_.sizes.data(),
- bindings_.strides.data());
+ scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles), binding_count](vk::CommandBuffer cmdbuf) {
+ cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, binding_count, buffer_handles_.data(), bindings_.offsets.data(), bindings_.sizes.data(), bindings_.strides.data());
});
} else {
- scheduler.Record([bindings_ = std::move(bindings),
- buffer_handles_ = std::move(buffer_handles),
- binding_count](vk::CommandBuffer cmdbuf) {
- cmdbuf.BindVertexBuffers(bindings_.min_index, binding_count, buffer_handles_.data(),
- bindings_.offsets.data());
+ scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles), binding_count](vk::CommandBuffer cmdbuf) {
+ cmdbuf.BindVertexBuffers(bindings_.min_index, binding_count, buffer_handles_.data(), bindings_.offsets.data());
});
}
}
@@ -647,15 +641,21 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
// Already logged in the rasterizer
return;
}
- boost::container::small_vector<VkBuffer, 4> buffer_handles;
- for (u32 index = 0; index < bindings.buffers.size(); ++index) {
- buffer_handles.push_back(bindings.buffers[index]->Handle());
+ boost::container::static_vector<VkBuffer, VideoCommon::NUM_VERTEX_BUFFERS> buffer_handles(bindings.buffers.size());
+ for (u32 i = 0; i < bindings.buffers.size(); ++i) {
+ auto handle = bindings.buffers[i]->Handle();
+ if (handle == VK_NULL_HANDLE) {
+ bindings.offsets[i] = 0;
+ bindings.sizes[i] = VK_WHOLE_SIZE;
+ if (!device.HasNullDescriptor()) {
+ ReserveNullBuffer();
+ handle = *null_buffer;
+ }
+ }
+ buffer_handles[i] = handle;
}
- scheduler.Record([bindings_ = std::move(bindings),
- buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
- cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles_.size()),
- buffer_handles_.data(), bindings_.offsets.data(),
- bindings_.sizes.data());
+ scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
+ cmdbuf.BindTransformFeedbackBuffersEXT(0, u32(buffer_handles_.size()), buffer_handles_.data(), bindings_.offsets.data(), bindings_.sizes.data());
});
}