diff --git a/include/vsg/app/TransferTask.h b/include/vsg/app/TransferTask.h index b098bbb0b..d783bf60f 100644 --- a/include/vsg/app/TransferTask.h +++ b/include/vsg/app/TransferTask.h @@ -17,6 +17,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #include #include #include +#include namespace vsg { @@ -97,6 +98,8 @@ namespace vsg VkDeviceSize dataTotalSize = 0; VkDeviceSize imageTotalSize = 0; + ref_ptr transferCompleteFence; + bool waitOnTransferFence = false; ref_ptr transferCompleteSemaphore; ref_ptr transferConsumerCompletedSemaphore; diff --git a/src/vsg/app/TransferTask.cpp b/src/vsg/app/TransferTask.cpp index cf320b2a5..c7b0d8e54 100644 --- a/src/vsg/app/TransferTask.cpp +++ b/src/vsg/app/TransferTask.cpp @@ -415,7 +415,7 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy) log(level, " totalSize = ", totalSize); auto& frame = *(dataToCopy.frames[dataToCopy.frameIndex]); - auto& fence = frame.fence; + auto& fence = dataToCopy.transferCompleteFence; auto& staging = frame.staging; auto& commandBuffer = frame.transferCommandBuffer; auto& newSignalSemaphore = dataToCopy.transferCompleteSemaphore; @@ -432,13 +432,13 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy) log(level, " newSignalSemaphore = ", newSignalSemaphore, ", ", newSignalSemaphore ? newSignalSemaphore->vk() : VK_NULL_HANDLE); log(level, " copyRegions.size() = ", copyRegions.size()); - if (frame.waitOnFence && fence) + if (dataToCopy.waitOnTransferFence && fence) { uint64_t timeout = std::numeric_limits::max(); if (VkResult result = fence->wait(timeout); result != VK_SUCCESS) return TransferResult{result, {}}; fence->resetFenceAndDependencies(); } - frame.waitOnFence = false; + dataToCopy.waitOnTransferFence = false; // advance frameIndex dataToCopy.frameIndex = (dataToCopy.frameIndex + 1) % dataToCopy.frames.size(); @@ -545,7 +545,7 @@ TransferTask::TransferResult TransferTask::_transferData(DataToCopy& dataToCopy) result = transferQueue->submit(submitInfo, fence); - frame.waitOnFence = true; + dataToCopy.waitOnTransferFence = true; dataToCopy.transferConsumerCompletedSemaphore.reset(); diff --git a/src/vsg/vk/RenderPass.cpp b/src/vsg/vk/RenderPass.cpp index 40d448ee1..7cf0f88fd 100644 --- a/src/vsg/vk/RenderPass.cpp +++ b/src/vsg/vk/RenderPass.cpp @@ -333,7 +333,7 @@ ref_ptr vsg::createRenderPass(Device* device, VkFormat imageFormat, colorDependency.dstSubpass = 0; colorDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; colorDependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - colorDependency.srcAccessMask = 0; + colorDependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; colorDependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; colorDependency.dependencyFlags = 0; @@ -341,10 +341,13 @@ ref_ptr vsg::createRenderPass(Device* device, VkFormat imageFormat, SubpassDependency depthDependency = {}; depthDependency.srcSubpass = VK_SUBPASS_EXTERNAL; depthDependency.dstSubpass = 0; - depthDependency.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - depthDependency.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + depthDependency.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + depthDependency.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; depthDependency.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - depthDependency.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + depthDependency.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; depthDependency.dependencyFlags = 0; RenderPass::Dependencies dependencies{colorDependency, depthDependency}; @@ -444,15 +447,19 @@ ref_ptr vsg::createMultisampledRenderPass(Device* device, VkFormat i dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; SubpassDependency dependency2 = {}; dependency2.srcSubpass = 0; dependency2.dstSubpass = VK_SUBPASS_EXTERNAL; - dependency2.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency2.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependency2.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + dependency2.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dependency2.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency2.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; dependency2.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;