mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[dxvk] Use synchronization2 functions for queue submissions
This commit is contained in:
parent
0c79882e84
commit
330ff8fa48
@ -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) {
|
||||||
|
@ -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];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user