Skip to content

Commit

Permalink
Changed to use a single semaphore per DataToCopy.
Browse files Browse the repository at this point in the history
  • Loading branch information
robertosfield committed Sep 10, 2024
1 parent ffcd724 commit 80370b9
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/vsg/app/TransferTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ namespace vsg
VkDeviceSize dataTotalSize = 0;
VkDeviceSize imageTotalSize = 0;

ref_ptr<Semaphore> semaphore;

bool containsDataToTransfer() const { return !dataMap.empty() || !imageInfoSet.empty(); }
};

Expand Down
39 changes: 34 additions & 5 deletions src/vsg/app/TransferTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI

using namespace vsg;

#define SINGLE_SEMEPHORE_PER_DATATOCOPY 1

TransferTask::TransferTask(Device* in_device, uint32_t numBuffers) :
device(in_device)
{
Expand Down Expand Up @@ -420,17 +422,25 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)
auto& frame = *(dataToCopy.frames[frameIndex]);
auto& staging = frame.staging;
auto& commandBuffer = frame.transferCommandBuffer;
#if SINGLE_SEMEPHORE_PER_DATATOCOPY==0
auto& signalSemaphore = frame.transferCompleteSemaphore;
auto& waitSemaphore = frame.consumerCompleteSemaphore;
#else
auto& semaphore = dataToCopy.semaphore;
#endif
const auto& copyRegions = frame.copyRegions;
auto& buffer_data = frame.buffer_data;

log(level, " frameIndex = ", frameIndex);
log(level, " frame = ", &frame);
log(level, " transferQueue = ", transferQueue);
log(level, " staging = ", staging);
#if SINGLE_SEMEPHORE_PER_DATATOCOPY==0
log(level, " signalSemaphore = ", signalSemaphore, ", ", signalSemaphore ? signalSemaphore->vk() : VK_NULL_HANDLE);
log(level, " waitSemaphore = ", waitSemaphore, ", ", waitSemaphore ? waitSemaphore->vk() : VK_NULL_HANDLE);
#else
log(level, " semaphore = ", semaphore, ", ", semaphore ? semaphore->vk() : VK_NULL_HANDLE);
#endif
log(level, " copyRegions.size() = ", copyRegions.size());

if (!commandBuffer)
Expand All @@ -443,12 +453,14 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)
commandBuffer->reset();
}

#if SINGLE_SEMEPHORE_PER_DATATOCOPY==0
if (!signalSemaphore)
{
// signal transfer submission has completed
signalSemaphore = Semaphore::create(device, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
log(level, " signalSemaphore created ", signalSemaphore, ", ", signalSemaphore->vk());
}
#endif

VkResult result = VK_SUCCESS;

Expand Down Expand Up @@ -505,17 +517,36 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)
// set up vulkan wait semaphore
std::vector<VkSemaphore> vk_waitSemaphores;
std::vector<VkPipelineStageFlags> vk_waitStages;
#if SINGLE_SEMEPHORE_PER_DATATOCOPY==0
if (waitSemaphore)
{
vk_waitSemaphores.emplace_back(waitSemaphore->vk());
vk_waitStages.emplace_back(waitSemaphore->pipelineStageFlags());

info("TransferTask::_transferData( ",dataToCopy.name," ) submit waitSemaphore = ", waitSemaphore);
}
#else
if (semaphore)
{
vk_waitSemaphores.emplace_back(semaphore->vk());
vk_waitStages.emplace_back(semaphore->pipelineStageFlags());

// set up the vulkan signal sempahore
info("TransferTask::_transferData( ",dataToCopy.name," ) submit waitSemaphore = ", semaphore);
}
#endif
// set up the vulkan signal semaphore
std::vector<VkSemaphore> vk_signalSemaphores;
#if SINGLE_SEMEPHORE_PER_DATATOCOPY==0
vk_signalSemaphores.push_back(*signalSemaphore);
#else
if (!semaphore)
{
// for next submission we want to wait till the consume has signalled completion
semaphore = Semaphore::create(device, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
log(level, " semaphore created ", semaphore, ", ", semaphore->vk());
}
vk_signalSemaphores.push_back(*semaphore);
#endif

submitInfo.waitSemaphoreCount = static_cast<uint32_t>(vk_waitSemaphores.size());
submitInfo.pWaitSemaphores = vk_waitSemaphores.data();
Expand All @@ -534,7 +565,7 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)

if (result != VK_SUCCESS) return TransferResult{result, {}, {}};

#if 0
#if SINGLE_SEMEPHORE_PER_DATATOCOPY==0
if (!waitSemaphore)
{
// for next submission we want to wait till the consume has signalled completion
Expand All @@ -544,9 +575,7 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)

return TransferResult{VK_SUCCESS, signalSemaphore, waitSemaphore};
#else
if (!waitSemaphore) waitSemaphore = signalSemaphore;

return TransferResult{VK_SUCCESS, signalSemaphore, signalSemaphore};
return TransferResult{VK_SUCCESS, semaphore, semaphore};
#endif
}
else
Expand Down

0 comments on commit 80370b9

Please sign in to comment.