Skip to content

Commit f97a5cb

Browse files
committed
Added check for whether DataToCopy requires copy.
1 parent 0dae11e commit f97a5cb

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

include/vsg/app/TransferTask.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ namespace vsg
100100
ref_ptr<Semaphore> transferCompleteSemaphore;
101101
ref_ptr<Semaphore> transferConsumerCompletedSemaphore;
102102

103+
bool requiresCopy(uint32_t deviceID) const;
103104
bool containsDataToTransfer() const { return !dataMap.empty() || !imageInfoSet.empty(); }
104105
};
105106

src/vsg/app/TransferTask.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,27 @@ void TransferTask::assign(const BufferInfoList& bufferInfoList)
8080
}
8181
}
8282

83+
bool TransferTask::DataToCopy::requiresCopy(uint32_t deviceID) const
84+
{
85+
for (auto buffer_itr = dataMap.begin(); buffer_itr != dataMap.end(); ++buffer_itr)
86+
{
87+
auto& bufferInfos = buffer_itr->second;
88+
for (auto bufferInfo_itr = bufferInfos.begin(); bufferInfo_itr != bufferInfos.end(); ++bufferInfo_itr)
89+
{
90+
auto& bufferInfo = bufferInfo_itr->second;
91+
if ((bufferInfo->referenceCount() > 1) && bufferInfo->requiresCopy(deviceID)) return true;
92+
}
93+
}
94+
95+
for (auto imageInfo_itr = imageInfoSet.begin(); imageInfo_itr != imageInfoSet.end(); ++imageInfo_itr)
96+
{
97+
auto& imageInfo = *imageInfo_itr;
98+
if ((imageInfo->referenceCount() > 1) && imageInfo->requiresCopy(deviceID)) return true;
99+
}
100+
101+
return false;
102+
}
103+
83104
void TransferTask::_transferBufferInfos(DataToCopy& dataToCopy, VkCommandBuffer vk_commandBuffer, TransferBlock& frame, VkDeviceSize& offset)
84105
{
85106
CPU_INSTRUMENTATION_L1(instrumentation);
@@ -333,6 +354,15 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)
333354

334355
log(level, "TransferTask::_transferData( ", dataToCopy.name, " ) ", this, ", frameIndex = ", dataToCopy.frameIndex);
335356

357+
uint32_t deviceID = device->deviceID;
358+
359+
// check to see if any copies are require.
360+
if (!dataToCopy.requiresCopy(deviceID))
361+
{
362+
return TransferResult{VK_SUCCESS, {}};
363+
}
364+
365+
336366
//
337367
// begin compute total data size
338368
//
@@ -384,7 +414,6 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy)
384414

385415
log(level, " totalSize = ", totalSize);
386416

387-
uint32_t deviceID = device->deviceID;
388417
auto& frame = *(dataToCopy.frames[dataToCopy.frameIndex]);
389418
auto& fence = frame.fence;
390419
auto& staging = frame.staging;

0 commit comments

Comments
 (0)