Уровни валидации LunarG Vulkan SDK не работают должным образом с внешними семафорами - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать взаимодействие Vulkan с видеокодом nVidia c SDK. В основном я выполняю рендеринг вне экрана (а также дублирую закадровое изображение на экране, чтобы увидеть, что рендерится) и пытаюсь передать рендеринг внеэкранного изображения в NvEncoderCuda. Я использую AppMotionEstimationVkCuda в качестве справочного материала для дальнейших действий. Необходимо отобразить изображение Vulkan на массив Cuda (все прошло нормально), а также отобразить семафор Vulkan на семафор Cuda. Сопоставление семафоров также прошло нормально, за исключением одной детали - валидационных уровней Vulkan SDK. Чтобы иметь возможность отображать семафор, он должен быть создан как внешний, указав vk::ExportSemaphoreCreateInfo при его создании. Похоже, что уровни валидации на самом деле не готовы иметь дело с этим типом семафоров. Я отправляю свою графическую очередь следующим образом:

void Render()
        {
            std::vector<vk::PipelineStageFlags> waitStages = { vk::PipelineStageFlagBits::eColorAttachmentOutput };

            vk::SubmitInfo submitInfo;
            submitInfo.waitSemaphoreCount = 1;
            submitInfo.pWaitSemaphores = &waitSemaphore.get();

            submitInfo.pWaitDstStageMask = waitStages.data();
            submitInfo.commandBufferCount = 1;
            submitInfo.pCommandBuffers = &commandBuffer;

            submitInfo.signalSemaphoreCount = 1;
            submitInfo.pSignalSemaphores = &signalSemaphoreExternal.get();

            vulkan.d.resetFences(1, &fence.get());
            vulkan.device.getGraphicsQueue().q.submit(submitInfo, fence.get());
        }

Проверка сообщает, что signalSemaphoreExternal не может быть сигнализировано. Об этой ошибке проверки сообщается, только когда я звоню getSemaphoreWin32HandleKHR. Я углубился в код уровня проверки и обнаружил, что средство отслеживания состояния регистрирует семафоры как сигнальные, только если они являются внутренними. Ошибка проверки выдается проверкой отправки очереди представления, потому что внешний семафор не отслеживается как сигнализируемый. Мой вопрос на самом деле не в том, в чем проблема (я ясно видел это в источнике уровня проверки), а скорее в том, что я делаю что-то, чего не ожидал? Я что-то упускаю? Информации (примеров) о практическом использовании внешних семафоров в Vulkan очень мало. Образец проекта nVidia, кажется, избегает этой проблемы только потому, что это простой пример, и их синхронизация вообще не требует обработки очереди представления.

Я попытался обойти это, создав два сигнальных семафора, один внутренний и один внешний (который будет использоваться исключительно Cuda), но на удивление ничего не решает. Такая же ошибка выдается для внутреннего (!) Семафора, опять же, только после выполнения вызова getSemaphoreWin32HandleKHR. Более того, появляется одна дополнительная ошибка, заключающаяся в том, что внешний семафор нигде в Vulkan не ожидается, что имеет смысл, но Vulkan SDK не должен выполнять такие проверки внешних семафоров, потому что они ожидаются вне Vulkan. Пошаговое прохождение источника проверки предполагает, что отслеживание очереди сбрасывается при выполнении вызова getSemaphoreWin32HandleKHR, поэтому SemaphoreWasSignaled возвращает false для внутреннего семафора, что неверно.

...