diff --git a/src/vsg/app/CompileTraversal.cpp b/src/vsg/app/CompileTraversal.cpp index 8d847d92e..7edf4418c 100644 --- a/src/vsg/app/CompileTraversal.cpp +++ b/src/vsg/app/CompileTraversal.cpp @@ -60,6 +60,7 @@ CompileTraversal::~CompileTraversal() void CompileTraversal::add(ref_ptr device, const ResourceRequirements& resourceRequirements) { + // TODO : need to ensure queueFamily matches the main queue's queueFamily, or implement queue family ownership transfer, or defer copy and transfer commands to TransferTask? auto queueFamily = device->getPhysicalDevice()->getQueueFamily(queueFlags); auto context = Context::create(device, resourceRequirements); context->commandPool = CommandPool::create(device, queueFamily, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); @@ -71,6 +72,7 @@ void CompileTraversal::add(Window& window, ref_ptr viewport, cons { auto device = window.getOrCreateDevice(); auto renderPass = window.getOrCreateRenderPass(); + // TODO : need to ensure queueFamily matches the main queue's queueFamily, or implement queue family ownership transfer, or defer copy and transfer commands to TransferTask? auto queueFamily = device->getPhysicalDevice()->getQueueFamily(queueFlags); auto context = Context::create(device, resourceRequirements); context->renderPass = renderPass; @@ -91,6 +93,7 @@ void CompileTraversal::add(Window& window, ref_ptr view, const ResourceReq { auto device = window.getOrCreateDevice(); auto renderPass = window.getOrCreateRenderPass(); + // TODO : need to ensure queueFamily matches the main queue's queueFamily, or implement queue family ownership transfer, or defer copy and transfer commands to TransferTask? auto queueFamily = device->getPhysicalDevice()->getQueueFamily(queueFlags); auto context = Context::create(device, resourceRequirements); context->renderPass = renderPass; @@ -117,6 +120,7 @@ void CompileTraversal::add(Framebuffer& framebuffer, ref_ptr view, const R { auto device = framebuffer.getDevice(); auto renderPass = framebuffer.getRenderPass(); + // TODO : need to ensure queueFamily matches the main queue's queueFamily, or implement queue family ownership transfer, or defer copy and transfer commands to TransferTask? auto queueFamily = device->getPhysicalDevice()->getQueueFamily(VK_QUEUE_GRAPHICS_BIT); auto context = Context::create(device, resourceRequirements); context->renderPass = renderPass; diff --git a/src/vsg/app/Viewer.cpp b/src/vsg/app/Viewer.cpp index 4e273d01f..31f5a77b5 100644 --- a/src/vsg/app/Viewer.cpp +++ b/src/vsg/app/Viewer.cpp @@ -475,7 +475,7 @@ void Viewer::assignRecordAndSubmitTaskAndPresentation(CommandGraphs in_commandGr // get main queue used for RecordAndSubmitTask ref_ptr mainQueue = device->getQueue(deviceQueueFamily.queueFamily); - // get presentat queue if required/supported + // get presentation queue if required/supported ref_ptr presentQueue; if (deviceQueueFamily.presentFamily >= 0) presentQueue = device->getQueue(deviceQueueFamily.presentFamily); @@ -485,6 +485,12 @@ void Viewer::assignRecordAndSubmitTaskAndPresentation(CommandGraphs in_commandGr VkQueueFlags transferQueueFlags = VK_QUEUE_TRANSFER_BIT | VK_QUEUE_GRAPHICS_BIT; // use VK_QUEUE_GRAPHICS_BIT to ensure we can blit images for (auto& queue : device->getQueues()) { + if (mainQueue->queueFamilyIndex() != queue->queueFamilyIndex()) + { + // need to implement queue family ownership transfer to use a different queue family + // see Vulkan spec 7.4.4, "Queue Family Ownership Transfer" + continue; + } if ((queue->queueFlags() & transferQueueFlags) == transferQueueFlags) { if (queue != mainQueue)