Skip to content

Commit c401c0f

Browse files
committed
vk: Get rid of multidraw indirection buffer
1 parent a152bb1 commit c401c0f

File tree

3 files changed

+11
-26
lines changed

3 files changed

+11
-26
lines changed

rpcs3/Emu/RSX/VK/VKDraw.cpp

+10-19
Original file line numberDiff line numberDiff line change
@@ -939,17 +939,8 @@ void VKGSRender::emit_geometry(u32 sub_index)
939939
else if (m_device->get_multidraw_support())
940940
{
941941
const auto subranges = draw_call.get_subranges();
942-
const auto subranges_count = ::size32(subranges);
943-
auto [offset, ptr] = m_draw_indirect_count_ring_info.alloc_and_map<4, VkMultiDrawInfoEXT>(subranges_count);
944-
945-
auto _ptr = ptr;
946-
for (const auto& range : subranges)
947-
{
948-
_ptr->firstVertex = range.first;
949-
_ptr->vertexCount = range.count;
950-
_ptr++;
951-
}
952-
_vkCmdDrawMultiEXT(*m_current_command_buffer, subranges_count, ptr, 1, 0, sizeof(VkMultiDrawInfoEXT));
942+
auto ptr = reinterpret_cast<const VkMultiDrawInfoEXT*>(& subranges.front().first);
943+
_vkCmdDrawMultiEXT(*m_current_command_buffer, ::size32(subranges), ptr, 1, 0, sizeof(rsx::draw_range_t));
953944
}
954945
else
955946
{
@@ -981,21 +972,21 @@ void VKGSRender::emit_geometry(u32 sub_index)
981972
{
982973
const auto subranges = draw_call.get_subranges();
983974
const auto subranges_count = ::size32(subranges);
984-
auto [offset, ptr] = m_draw_indirect_count_ring_info.alloc_and_map<4, VkMultiDrawIndexedInfoEXT>(subranges_count);
975+
const auto allocation_size = subranges_count * 3;
985976

986-
auto _ptr = ptr;
977+
m_multidraw_parameters_buffer.resize(allocation_size);
978+
auto _ptr = m_multidraw_parameters_buffer.data();
987979
u32 vertex_offset = 0;
980+
988981
for (const auto& range : subranges)
989982
{
990983
const auto count = get_index_count(draw_call.primitive, range.count);
991-
_ptr->vertexOffset = 0;
992-
_ptr->firstIndex = vertex_offset;
993-
_ptr->indexCount = count;
994-
995-
_ptr++;
984+
*_ptr++ = 0;
985+
*_ptr++ = vertex_offset;
986+
*_ptr++ = count;
996987
vertex_offset += count;
997988
}
998-
_vkCmdDrawMultiIndexedEXT(*m_current_command_buffer, subranges_count, ptr, 1, 0, sizeof(VkMultiDrawIndexedInfoEXT), nullptr);
989+
_vkCmdDrawMultiIndexedEXT(*m_current_command_buffer, subranges_count, reinterpret_cast<const VkMultiDrawIndexedInfoEXT*>(_ptr), 1, 0, sizeof(u32) * 3, nullptr);
999990
}
1000991
else
1001992
{

rpcs3/Emu/RSX/VK/VKGSRender.cpp

-6
Original file line numberDiff line numberDiff line change
@@ -558,12 +558,6 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)
558558
});
559559
}
560560

561-
if (m_device->get_multidraw_support().supported)
562-
{
563-
m_draw_indirect_count_ring_info.create(VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, 16 * 0x100000, "multidraw indirect buffer", 1024);
564-
vk::data_heap_manager::register_ring_buffer(m_draw_indirect_count_ring_info);
565-
}
566-
567561
// Initialize optional allocation information with placeholders
568562
m_vertex_env_buffer_info = { m_vertex_env_ring_info.heap->value, 0, 16 };
569563
m_vertex_constants_buffer_info = { m_transform_constants_ring_info.heap->value, 0, 16 };

rpcs3/Emu/RSX/VK/VKGSRender.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ class VKGSRender : public GSRender, public ::rsx::reports::ZCULL_control
130130
vk::data_heap m_texture_upload_buffer_ring_info; // Texture upload heap
131131
vk::data_heap m_raster_env_ring_info; // Raster control such as polygon and line stipple
132132
vk::data_heap m_instancing_buffer_ring_info; // Instanced rendering data (constants indirection table + instanced constants)
133-
vk::data_heap m_draw_indirect_count_ring_info; // Buffer holding first-count data for multidraw support
134133

135134
vk::data_heap m_fragment_instructions_buffer;
136135
vk::data_heap m_vertex_instructions_buffer;
@@ -148,6 +147,7 @@ class VKGSRender : public GSRender, public ::rsx::reports::ZCULL_control
148147
VkDescriptorBufferInfo m_vertex_instructions_buffer_info {};
149148
VkDescriptorBufferInfo m_fragment_instructions_buffer_info {};
150149

150+
rsx::simple_array<u32> m_multidraw_parameters_buffer;
151151
u64 m_xform_constants_dynamic_offset = 0; // We manage transform_constants dynamic offset manually to alleviate performance penalty of doing a hot-patch of constants.
152152

153153
std::array<vk::frame_context_t, VK_MAX_ASYNC_FRAMES> frame_context_storage;

0 commit comments

Comments
 (0)