mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-10 03:18:55 +02:00
[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>
This commit is contained in:
parent
c70b857c4f
commit
2ed1328c93
2 changed files with 33 additions and 30 deletions
|
|
@ -14,9 +14,12 @@
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <ankerl/unordered_dense.h>
|
|
||||||
#include <vector>
|
#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/common_types.h"
|
||||||
#include "common/div_ceil.h"
|
#include "common/div_ceil.h"
|
||||||
#include "common/literals.h"
|
#include "common/literals.h"
|
||||||
|
|
@ -94,10 +97,10 @@ static constexpr Binding NULL_BINDING{
|
||||||
|
|
||||||
template <typename Buffer>
|
template <typename Buffer>
|
||||||
struct HostBindings {
|
struct HostBindings {
|
||||||
boost::container::small_vector<Buffer*, NUM_VERTEX_BUFFERS> buffers;
|
boost::container::static_vector<Buffer*, NUM_VERTEX_BUFFERS> buffers;
|
||||||
boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> offsets;
|
boost::container::static_vector<u64, NUM_VERTEX_BUFFERS> offsets;
|
||||||
boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> sizes;
|
boost::container::static_vector<u64, NUM_VERTEX_BUFFERS> sizes;
|
||||||
boost::container::small_vector<u64, NUM_VERTEX_BUFFERS> strides;
|
boost::container::static_vector<u64, NUM_VERTEX_BUFFERS> strides;
|
||||||
u32 min_index{NUM_VERTEX_BUFFERS};
|
u32 min_index{NUM_VERTEX_BUFFERS};
|
||||||
u32 max_index{0};
|
u32 max_index{0};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <vector>
|
#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/vk_buffer_cache.h"
|
||||||
|
|
||||||
#include "video_core/renderer_vulkan/maxwell_to_vk.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) {
|
void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bindings) {
|
||||||
boost::container::small_vector<VkBuffer, 32> buffer_handles;
|
boost::container::static_vector<VkBuffer, VideoCommon::NUM_VERTEX_BUFFERS> buffer_handles(bindings.buffers.size());
|
||||||
for (u32 index = 0; index < bindings.buffers.size(); ++index) {
|
for (u32 i = 0; i < bindings.buffers.size(); ++i) {
|
||||||
auto handle = bindings.buffers[index]->Handle();
|
auto handle = bindings.buffers[i]->Handle();
|
||||||
if (handle == VK_NULL_HANDLE) {
|
if (handle == VK_NULL_HANDLE) {
|
||||||
bindings.offsets[index] = 0;
|
bindings.offsets[i] = 0;
|
||||||
bindings.sizes[index] = VK_WHOLE_SIZE;
|
bindings.sizes[i] = VK_WHOLE_SIZE;
|
||||||
if (!device.HasNullDescriptor()) {
|
if (!device.HasNullDescriptor()) {
|
||||||
ReserveNullBuffer();
|
ReserveNullBuffer();
|
||||||
handle = *null_buffer;
|
handle = *null_buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buffer_handles.push_back(handle);
|
buffer_handles[i] = handle;
|
||||||
}
|
}
|
||||||
const u32 device_max = device.GetMaxVertexInputBindings();
|
const u32 device_max = device.GetMaxVertexInputBindings();
|
||||||
const u32 min_binding = (std::min)(bindings.min_index, device_max);
|
const u32 min_binding = (std::min)(bindings.min_index, device_max);
|
||||||
|
|
@ -604,19 +605,12 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (device.IsExtExtendedDynamicStateSupported()) {
|
if (device.IsExtExtendedDynamicStateSupported()) {
|
||||||
scheduler.Record([bindings_ = std::move(bindings),
|
scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles), binding_count](vk::CommandBuffer cmdbuf) {
|
||||||
buffer_handles_ = std::move(buffer_handles),
|
cmdbuf.BindVertexBuffers2EXT(bindings_.min_index, binding_count, buffer_handles_.data(), bindings_.offsets.data(), bindings_.sizes.data(), bindings_.strides.data());
|
||||||
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 {
|
} else {
|
||||||
scheduler.Record([bindings_ = std::move(bindings),
|
scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles), binding_count](vk::CommandBuffer cmdbuf) {
|
||||||
buffer_handles_ = std::move(buffer_handles),
|
cmdbuf.BindVertexBuffers(bindings_.min_index, binding_count, buffer_handles_.data(), bindings_.offsets.data());
|
||||||
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
|
// Already logged in the rasterizer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boost::container::small_vector<VkBuffer, 4> buffer_handles;
|
boost::container::static_vector<VkBuffer, VideoCommon::NUM_VERTEX_BUFFERS> buffer_handles(bindings.buffers.size());
|
||||||
for (u32 index = 0; index < bindings.buffers.size(); ++index) {
|
for (u32 i = 0; i < bindings.buffers.size(); ++i) {
|
||||||
buffer_handles.push_back(bindings.buffers[index]->Handle());
|
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),
|
scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
||||||
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());
|
||||||
cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles_.size()),
|
|
||||||
buffer_handles_.data(), bindings_.offsets.data(),
|
|
||||||
bindings_.sizes.data());
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue