diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index ce50a28523..5dc34cbd48 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -528,6 +528,8 @@ VKGSRender::VKGSRender() : GSRender() m_ui_renderer = std::make_unique(); m_ui_renderer->create(*m_current_command_buffer, m_texture_upload_buffer_ring_info); + m_occlusion_query_pool.initialize(*m_current_command_buffer); + backend_config.supports_multidraw = true; // NOTE: We do not actually need multiple sample support for A2C to work diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index c479b4e115..b16578520f 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -2912,12 +2912,8 @@ public: CHECK_RESULT(vkCreateQueryPool(dev, &info, nullptr, &query_pool)); owner = &dev; - query_active_status.resize(num_entries, false); - - for (u32 n = 0; n < num_entries; ++n) - { - available_slots.push(n); - } + // From spec: "After query pool creation, each query must be reset before it is used." + query_active_status.resize(num_entries, true); } void destroy() @@ -2931,6 +2927,19 @@ public: } } + void initialize(vk::command_buffer &cmd) + { + const u32 count = (u32)query_active_status.size(); + vkCmdResetQueryPool(cmd, query_pool, 0, count); + + std::fill(query_active_status.begin(), query_active_status.end(), false); + + for (u32 n = 0; n < count; ++n) + { + available_slots.push(n); + } + } + void begin_query(vk::command_buffer &cmd, u32 index) { if (query_active_status[index])