diff --git a/include/vsg/vk/Device.h b/include/vsg/vk/Device.h index 5e514ddfc..f4f77ed17 100644 --- a/include/vsg/vk/Device.h +++ b/include/vsg/vk/Device.h @@ -25,6 +25,7 @@ namespace vsg class WindowTraits; class MemoryBufferPools; class DescriptorPools; + class TransferTask; struct QueueSetting { @@ -87,10 +88,11 @@ namespace vsg /// return the amount of memory available in deviceMemoryBufferPools and allocatable on device VkDeviceSize availableMemory(bool includeMemoryPools = true) const; - // provide observer_ptr to memory buffer and descriptor pools so that these can be accessed when required + // provide observer_ptr to memory buffer, descriptor pools and transferTask so that these can be accessed when required observer_ptr deviceMemoryBufferPools; observer_ptr stagingMemoryBufferPools; observer_ptr descriptorPools; + observer_ptr transferTask; protected: virtual ~Device(); diff --git a/src/vsg/app/RecordAndSubmitTask.cpp b/src/vsg/app/RecordAndSubmitTask.cpp index 39fc66f13..8aa2a3053 100644 --- a/src/vsg/app/RecordAndSubmitTask.cpp +++ b/src/vsg/app/RecordAndSubmitTask.cpp @@ -39,6 +39,8 @@ RecordAndSubmitTask::RecordAndSubmitTask(Device* in_device, uint32_t numBuffers) earlyTransferConsumerCompletedSemaphore = Semaphore::create(in_device); lateTransferConsumerCompletedSemaphore = Semaphore::create(in_device); + + if (!device->transferTask) device->transferTask = transferTask; } void RecordAndSubmitTask::advance() diff --git a/src/vsg/state/BufferInfo.cpp b/src/vsg/state/BufferInfo.cpp index a0d460d55..38dd2340f 100644 --- a/src/vsg/state/BufferInfo.cpp +++ b/src/vsg/state/BufferInfo.cpp @@ -113,12 +113,19 @@ void BufferInfo::copyDataToBuffer(uint32_t deviceID) { if ((dm->getMemoryPropertyFlags() & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0) { - warn("BufferInfo::copyDataToBuffer() cannot copy data. DeviceMemory does not support direct memory mapping."); + if (auto transferTask = dm->getDevice()->transferTask.ref_ptr()) + { + transferTask->assign(BufferInfoList{ref_ptr(this)}); + } + else + { + warn("BufferInfo::copyDataToBuffer() cannot copy data. DeviceMemory does not support direct memory mapping."); - // you can use dynamic data updates provided by vsg::TransferTask or alternatively, you can implement the following steps: - // 1. allocate staging buffer - // 2. copy to staging buffer - // 3. transfer from staging buffer to device local buffer - use CopyAndReleaseBuffer + // you can use dynamic data updates provided by vsg::TransferTask or alternatively, you can implement the following steps: + // 1. allocate staging buffer + // 2. copy to staging buffer + // 3. transfer from staging buffer to device local buffer - use CopyAndReleaseBuffer + } return; }