Использование VkSubpassDependency против семафора? - PullRequest
0 голосов
/ 11 января 2020

Я слежу за этим уроком на вулканском языке: https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation В настоящее время я нахожусь в подразделе по зависимостям подземных переходов. В нем автор говорит, что, поскольку переход макета изображения может произойти до того, как мы получим изображение из цепочки подкачки, нам нужно использовать VkSubpassDependency, как показано ниже, так что renderpass будет ожидать на этапе вывода фрагментного шейдера.

VkSubpassDependency dependency = {};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.srcAccessMask = 0;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;

Однако у автора также есть этот код до

vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphore, VK_NULL_HANDLE, &imageIndex);
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
VkSemaphore waitSemaphores[] = { imageAvailableSemaphore };
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffers[imageIndex];
VkSemaphore signalSemaphores[] = { renderFinishedSemaphore };
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {
    throw std::runtime_error("failed to submit command buffer");
}

. Этот код делает то, что этап фрагментного шейдера не начнется, пока мы не сможем фактически получить изображение из swapchain (в этом уверен imageAvailableSemaphore). Для меня эти два фрагмента кода делают одно и то же, чтобы убедиться, что этап фрагментного шейдера не начинается, пока мы не сможем получить изображение. Это почему?

PS: У меня также возникают проблемы с пониманием маски сцены и маски доступа.

1 Ответ

1 голос
/ 11 января 2020

Зависимость subpass говорит о том, что переход от initialLayout к первому макету происходит между srcStageMask и dstStageMask соответствующих областей синхронизации.

Ожидание семафора с pWaitDstStageMask говорит, что семафор будет следует ожидать не позднее стадии (и по природе блока ожидания семафора любое последующее выполнение, пока не закончится ожидание.

Вы не можете пропустить семафор, потому что vkAcquireNextImageKHR не является операцией очереди и семафором (или забор) - единственный способ узнать, что движку представления больше не нужно изображение.

И вы не можете пропустить зависимость подпроцесса, потому что пропуск ее эквивалентен предоставлению srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT. Это означает переход макета ( который может иметь права на запись) может быть выполнен в любой момент. И если ваш pWaitDstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, это означает, что механизм представления все еще читает изображение, в то время как ваша работа уже пытается изменить макет изображения.

Вы можете использовать pWaitDstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT (соответственно VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT) без барьера \ зависимости. Но это означает "подождите" Во-первых, семафор, который затем блокирует все. Включая части, которые даже не нуждаются в образе подкачки (например, обработка вершин). Это может быть неоптимальным на некоторых платформах, и нет причин делать это.

Я должен добавить, что команды синхронизации на самом деле не go через стадии конвейера. Они только определяют зависимость между своими областями синхронизации. То, что происходит между ожиданием семафора и зависимостью Subpass, представляет собой цепочку зависимостей выполнения . Семафор определяет зависимость между PE и этапом COLOR. Зависимость Subpass определяет зависимость между этапом COLOR и переходом макета. Выбранные таким образом этапы do образуют цепочку зависимостей выполнения между этими двумя примитивами syn c. И такая цепь образует переходное свойство; то есть он действует как одна особая зависимость между PE и переходом макета.

...