vk: Initialize queries before use

- The spec does not guarantee that queries are initialized. In fact, it
now says all queries must be reset before they are used for the first
time.
This commit is contained in:
kd-11 2019-11-10 11:27:22 +03:00 committed by kd-11
parent 8ea9bc9874
commit 5968427a2f
2 changed files with 17 additions and 6 deletions

View File

@ -528,6 +528,8 @@ VKGSRender::VKGSRender() : GSRender()
m_ui_renderer = std::make_unique<vk::ui_overlay_renderer>();
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

View File

@ -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])