mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-05-12 16:19:44 -06:00
vk: Use bulk allocator for FP and VP constant blocks to reduce wastage
This commit is contained in:
parent
91a8c56c37
commit
80c1c5dd6d
@ -179,16 +179,27 @@ namespace rsx
|
||||
, m_batch_size(batch_size)
|
||||
{}
|
||||
|
||||
usz alloc()
|
||||
usz alloc(u32 element_count = 1)
|
||||
{
|
||||
if (!m_capacity)
|
||||
if (m_capacity < element_count)
|
||||
{
|
||||
ensure(element_count <= m_batch_size);
|
||||
m_address = m_container.alloc<Alignment>(ElementSize * m_batch_size);
|
||||
m_capacity = m_batch_size;
|
||||
}
|
||||
|
||||
m_capacity--;
|
||||
return std::exchange(m_address, m_address + ElementSize);
|
||||
m_capacity -= element_count;
|
||||
return std::exchange(m_address, m_address + (ElementSize * element_count));
|
||||
}
|
||||
|
||||
usz alloc_bytes(usz size = ElementSize)
|
||||
{
|
||||
return alloc(static_cast<u32>(size / ElementSize));
|
||||
}
|
||||
|
||||
u32 capacity() const
|
||||
{
|
||||
return m_capacity;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@ -568,6 +568,16 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)
|
||||
m_vertex_env_ring_info,
|
||||
std::min<u32>(limits.maxUniformBufferRange / 96u, 1024u));
|
||||
|
||||
m_transform_constants_allocator = std::make_unique<rsx::data_heap::bulk_allocator<256, 16>>(
|
||||
m_transform_constants_ring_info,
|
||||
std::min<u32>(limits.maxUniformBufferRange / 16u, 8192u)
|
||||
);
|
||||
|
||||
m_fragment_constants_allocator = std::make_unique<rsx::data_heap::bulk_allocator<256, 16>>(
|
||||
m_fragment_constants_ring_info,
|
||||
std::min<u32>(limits.maxUniformBufferRange / 16u, 8192u)
|
||||
);
|
||||
|
||||
if (m_texbuffer_view_size < 0x800000)
|
||||
{
|
||||
// Warn, only possibly expected on macOS
|
||||
@ -2006,7 +2016,7 @@ void VKGSRender::load_program_env()
|
||||
usz mem_offset = 0;
|
||||
auto alloc_storage = [&](usz size) -> std::pair<void*, usz>
|
||||
{
|
||||
mem_offset = m_transform_constants_ring_info.alloc<256>(size);
|
||||
mem_offset = m_transform_constants_allocator->alloc_bytes(size);
|
||||
return std::make_pair(m_transform_constants_ring_info.map(mem_offset, size), size);
|
||||
};
|
||||
|
||||
@ -2028,7 +2038,7 @@ void VKGSRender::load_program_env()
|
||||
// Fragment constants
|
||||
if (fragment_constants_size)
|
||||
{
|
||||
m_fragment_constants_dynamic_offset = m_fragment_constants_ring_info.alloc<256>(fragment_constants_size);
|
||||
m_fragment_constants_dynamic_offset = m_fragment_constants_allocator->alloc_bytes(fragment_constants_size);
|
||||
auto buf = m_fragment_constants_ring_info.map(m_fragment_constants_dynamic_offset, fragment_constants_size);
|
||||
|
||||
m_prog_buffer->fill_fragment_constants_buffer({ reinterpret_cast<float*>(buf), fragment_constants_size },
|
||||
|
||||
@ -162,6 +162,8 @@ private:
|
||||
u64 m_stipple_array_dynamic_offset = 0;
|
||||
|
||||
std::unique_ptr<rsx::data_heap::bulk_allocator<256, 96>> m_vertex_env_allocator;
|
||||
std::unique_ptr<rsx::data_heap::bulk_allocator<256, 16>> m_transform_constants_allocator;
|
||||
std::unique_ptr<rsx::data_heap::bulk_allocator<256, 16>> m_fragment_constants_allocator;
|
||||
|
||||
std::vector<vk::frame_context_t> m_frame_context_storage;
|
||||
u32 m_max_async_frames = 0u;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user