[dxvk] Reset query pools on the init buffer

This commit is contained in:
Philip Rebohle 2018-05-12 19:45:42 +02:00
parent 3135359ee9
commit 5f3b65014f
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 33 additions and 7 deletions

View File

@ -7,9 +7,10 @@ namespace dxvk {
const Rc<vk::DeviceFn>& vkd, const Rc<vk::DeviceFn>& vkd,
DxvkDevice* device, DxvkDevice* device,
uint32_t queueFamily) uint32_t queueFamily)
: m_vkd (vkd), : m_vkd (vkd),
m_descAlloc (vkd), m_cmdBuffersUsed(0),
m_stagingAlloc(device) { m_descAlloc (vkd),
m_stagingAlloc (device) {
VkFenceCreateInfo fenceInfo; VkFenceCreateInfo fenceInfo;
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fenceInfo.pNext = nullptr; fenceInfo.pNext = nullptr;
@ -52,8 +53,13 @@ namespace dxvk {
VkQueue queue, VkQueue queue,
VkSemaphore waitSemaphore, VkSemaphore waitSemaphore,
VkSemaphore wakeSemaphore) { VkSemaphore wakeSemaphore) {
std::array<VkCommandBuffer, 2> cmdBuffers std::array<VkCommandBuffer, 2> cmdBuffers;
= {{ m_initBuffer, m_execBuffer }}; uint32_t cmdBufferCount = 0;
if (m_cmdBuffersUsed.test(DxvkCmdBufferFlag::InitBuffer))
cmdBuffers[cmdBufferCount++] = m_initBuffer;
if (m_cmdBuffersUsed.test(DxvkCmdBufferFlag::ExecBuffer))
cmdBuffers[cmdBufferCount++] = m_execBuffer;
const VkPipelineStageFlags waitStageMask const VkPipelineStageFlags waitStageMask
= VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
@ -64,7 +70,7 @@ namespace dxvk {
info.waitSemaphoreCount = waitSemaphore == VK_NULL_HANDLE ? 0 : 1; info.waitSemaphoreCount = waitSemaphore == VK_NULL_HANDLE ? 0 : 1;
info.pWaitSemaphores = &waitSemaphore; info.pWaitSemaphores = &waitSemaphore;
info.pWaitDstStageMask = &waitStageMask; info.pWaitDstStageMask = &waitStageMask;
info.commandBufferCount = cmdBuffers.size(); info.commandBufferCount = cmdBufferCount;
info.pCommandBuffers = cmdBuffers.data(); info.pCommandBuffers = cmdBuffers.data();
info.signalSemaphoreCount = wakeSemaphore == VK_NULL_HANDLE ? 0 : 1; info.signalSemaphoreCount = wakeSemaphore == VK_NULL_HANDLE ? 0 : 1;
info.pSignalSemaphores = &wakeSemaphore; info.pSignalSemaphores = &wakeSemaphore;
@ -102,6 +108,10 @@ namespace dxvk {
if (m_vkd->vkResetFences(m_vkd->device(), 1, &m_fence) != VK_SUCCESS) if (m_vkd->vkResetFences(m_vkd->device(), 1, &m_fence) != VK_SUCCESS)
Logger::err("DxvkCommandList: Failed to reset fence"); Logger::err("DxvkCommandList: Failed to reset fence");
// Unconditionally mark the exec buffer as used. There
// is virtually no use case where this isn't correct.
m_cmdBuffersUsed.set(DxvkCmdBufferFlag::ExecBuffer);
} }

View File

@ -16,6 +16,19 @@
namespace dxvk { namespace dxvk {
/**
* \brief Command buffer flags
*
* A set of flags used to specify which of
* the command buffers need to be submitted.
*/
enum class DxvkCmdBufferFlag : uint32_t {
InitBuffer = 0,
ExecBuffer = 1,
};
using DxvkCmdBufferFlags = Flags<DxvkCmdBufferFlag>;
/** /**
* \brief DXVK command list * \brief DXVK command list
* *
@ -468,7 +481,9 @@ namespace dxvk {
VkQueryPool queryPool, VkQueryPool queryPool,
uint32_t firstQuery, uint32_t firstQuery,
uint32_t queryCount) { uint32_t queryCount) {
m_vkd->vkCmdResetQueryPool(m_execBuffer, m_cmdBuffersUsed.set(DxvkCmdBufferFlag::InitBuffer);
m_vkd->vkCmdResetQueryPool(m_initBuffer,
queryPool, firstQuery, queryCount); queryPool, firstQuery, queryCount);
} }
@ -564,6 +579,7 @@ namespace dxvk {
VkCommandBuffer m_execBuffer; VkCommandBuffer m_execBuffer;
VkCommandBuffer m_initBuffer; VkCommandBuffer m_initBuffer;
DxvkCmdBufferFlags m_cmdBuffersUsed;
DxvkLifetimeTracker m_resources; DxvkLifetimeTracker m_resources;
DxvkDescriptorAlloc m_descAlloc; DxvkDescriptorAlloc m_descAlloc;
DxvkStagingAlloc m_stagingAlloc; DxvkStagingAlloc m_stagingAlloc;