1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Use synchronization2 functions for queue submissions

This commit is contained in:
Philip Rebohle 2022-07-18 19:35:12 +02:00
parent 0c79882e84
commit 330ff8fa48
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 50 additions and 34 deletions

View File

@ -87,35 +87,55 @@ namespace dxvk {
DxvkQueueSubmission info = DxvkQueueSubmission(); DxvkQueueSubmission info = DxvkQueueSubmission();
if (m_cmdBuffersUsed.test(DxvkCmdBuffer::SdmaBuffer)) { if (m_cmdBuffersUsed.test(DxvkCmdBuffer::SdmaBuffer)) {
info.cmdBuffers[info.cmdBufferCount++] = m_sdmaBuffer; auto& cmdInfo = info.cmdBuffers[info.cmdBufferCount++];
cmdInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO };
cmdInfo.commandBuffer = m_sdmaBuffer;
if (m_device->hasDedicatedTransferQueue()) { if (m_device->hasDedicatedTransferQueue()) {
info.wakeSync[info.wakeCount++] = m_sdmaSemaphore; auto& signalInfo = info.wakeSync[info.wakeCount++];
signalInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO };
signalInfo.semaphore = m_sdmaSemaphore;
signalInfo.stageMask = VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT;
VkResult status = submitToQueue(transfer.queueHandle, VK_NULL_HANDLE, info); VkResult status = submitToQueue(transfer.queueHandle, VK_NULL_HANDLE, info);
if (status != VK_SUCCESS) if (status != VK_SUCCESS)
return status; return status;
info = DxvkQueueSubmission(); info = DxvkQueueSubmission();
info.waitSync[info.waitCount] = m_sdmaSemaphore;
info.waitMask[info.waitCount] = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; auto& waitInfo = info.waitSync[info.waitCount++];
info.waitCount += 1; waitInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO };
waitInfo.semaphore = m_sdmaSemaphore;
waitInfo.stageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
} }
} }
if (m_cmdBuffersUsed.test(DxvkCmdBuffer::InitBuffer)) if (m_cmdBuffersUsed.test(DxvkCmdBuffer::InitBuffer)) {
info.cmdBuffers[info.cmdBufferCount++] = m_initBuffer; auto& cmdInfo = info.cmdBuffers[info.cmdBufferCount++];
if (m_cmdBuffersUsed.test(DxvkCmdBuffer::ExecBuffer)) cmdInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO };
info.cmdBuffers[info.cmdBufferCount++] = m_execBuffer; cmdInfo.commandBuffer = m_initBuffer;
if (waitSemaphore) {
info.waitSync[info.waitCount] = waitSemaphore;
info.waitMask[info.waitCount] = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
info.waitCount += 1;
} }
if (wakeSemaphore) if (m_cmdBuffersUsed.test(DxvkCmdBuffer::ExecBuffer)) {
info.wakeSync[info.wakeCount++] = wakeSemaphore; auto& cmdInfo = info.cmdBuffers[info.cmdBufferCount++];
cmdInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO };
cmdInfo.commandBuffer = m_execBuffer;
}
if (waitSemaphore) {
auto& waitInfo = info.waitSync[info.waitCount++];
waitInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO };
waitInfo.semaphore = waitSemaphore;
waitInfo.stageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
}
if (wakeSemaphore) {
auto& signalInfo = info.wakeSync[info.wakeCount++];
signalInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO };
signalInfo.semaphore = wakeSemaphore;
signalInfo.stageMask = VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT;
}
return submitToQueue(graphics.queueHandle, m_fence, info); return submitToQueue(graphics.queueHandle, m_fence, info);
} }
@ -194,18 +214,15 @@ namespace dxvk {
VkQueue queue, VkQueue queue,
VkFence fence, VkFence fence,
const DxvkQueueSubmission& info) { const DxvkQueueSubmission& info) {
VkSubmitInfo submitInfo; VkSubmitInfo2 submitInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO_2 };
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.waitSemaphoreInfoCount = info.waitCount;
submitInfo.pNext = nullptr; submitInfo.pWaitSemaphoreInfos = info.waitSync;
submitInfo.waitSemaphoreCount = info.waitCount; submitInfo.commandBufferInfoCount = info.cmdBufferCount;
submitInfo.pWaitSemaphores = info.waitSync; submitInfo.pCommandBufferInfos = info.cmdBuffers;
submitInfo.pWaitDstStageMask = info.waitMask; submitInfo.signalSemaphoreInfoCount = info.wakeCount;
submitInfo.commandBufferCount = info.cmdBufferCount; submitInfo.pSignalSemaphoreInfos = info.wakeSync;
submitInfo.pCommandBuffers = info.cmdBuffers;
submitInfo.signalSemaphoreCount = info.wakeCount;
submitInfo.pSignalSemaphores = info.wakeSync;
return m_vkd->vkQueueSubmit(queue, 1, &submitInfo, fence); return m_vkd->vkQueueSubmit2(queue, 1, &submitInfo, fence);
} }
void DxvkCommandList::cmdBeginDebugUtilsLabel(VkDebugUtilsLabelEXT *pLabelInfo) { void DxvkCommandList::cmdBeginDebugUtilsLabel(VkDebugUtilsLabelEXT *pLabelInfo) {

View File

@ -38,13 +38,12 @@ namespace dxvk {
* only, array sizes are based on need. * only, array sizes are based on need.
*/ */
struct DxvkQueueSubmission { struct DxvkQueueSubmission {
uint32_t waitCount; uint32_t waitCount;
VkSemaphore waitSync[2]; VkSemaphoreSubmitInfo waitSync[2];
VkPipelineStageFlags waitMask[2]; uint32_t wakeCount;
uint32_t wakeCount; VkSemaphoreSubmitInfo wakeSync[2];
VkSemaphore wakeSync[2]; uint32_t cmdBufferCount;
uint32_t cmdBufferCount; VkCommandBufferSubmitInfo cmdBuffers[4];
VkCommandBuffer cmdBuffers[4];
}; };
/** /**