@@ -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+
83104void 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