vk: Use bulk allocator for FP and VP constant blocks to reduce wastage
This commit is contained in:
@@ -179,16 +179,27 @@ namespace rsx
|
|||||||
, m_batch_size(batch_size)
|
, 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_address = m_container.alloc<Alignment>(ElementSize * m_batch_size);
|
||||||
m_capacity = m_batch_size;
|
m_capacity = m_batch_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_capacity--;
|
m_capacity -= element_count;
|
||||||
return std::exchange(m_address, m_address + ElementSize);
|
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:
|
private:
|
||||||
|
|||||||
@@ -568,6 +568,16 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)
|
|||||||
m_vertex_env_ring_info,
|
m_vertex_env_ring_info,
|
||||||
std::min<u32>(limits.maxUniformBufferRange / 96u, 1024u));
|
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)
|
if (m_texbuffer_view_size < 0x800000)
|
||||||
{
|
{
|
||||||
// Warn, only possibly expected on macOS
|
// Warn, only possibly expected on macOS
|
||||||
@@ -2006,7 +2016,7 @@ void VKGSRender::load_program_env()
|
|||||||
usz mem_offset = 0;
|
usz mem_offset = 0;
|
||||||
auto alloc_storage = [&](usz size) -> std::pair<void*, usz>
|
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);
|
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
|
// Fragment constants
|
||||||
if (fragment_constants_size)
|
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);
|
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 },
|
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;
|
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, 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;
|
std::vector<vk::frame_context_t> m_frame_context_storage;
|
||||||
u32 m_max_async_frames = 0u;
|
u32 m_max_async_frames = 0u;
|
||||||
|
|||||||
Reference in New Issue
Block a user