Класс QVulkanWindow
Класс QVulkanWindow является удобным подклассом QWindow для выполнения рендеринга Vulkan. Подробнее...
| Заголовок: | #include <QVulkanWindow> |
| qmake: | QT += gui |
| С версии: | Qt 5.10 |
| Наследует: | QWindow |
Этот класс был введен в Qt 5.10.
Открытые типы
| enum | Flag { PersistentResources } |
| flags | Flags |
Открытые функции
| QVulkanWindow(QWindow *parent = nullptr) | |
| virtual | ~QVulkanWindow() |
| int | availablePhysicalDevices() |
| QMatrix4x4 | clipCorrectionMatrix() |
| int | colorFormat() const |
| int | concurrentFrameCount() const |
| virtual QVulkanWindowRenderer * | createRenderer() |
| int | currentCommandBuffer() const |
| int | currentFrame() const |
| int | currentFramebuffer() const |
| int | currentSwapChainImageIndex() const |
| int | defaultRenderPass() const |
| int | depthStencilFormat() const |
| VkImage | depthStencilImage() const |
| VkImageView | depthStencilImageView() const |
| int | device() const |
| uint32_t | deviceLocalMemoryIndex() const |
| QVulkanWindow::Flags | flags() const |
| void | frameReady() |
| QImage | grab() |
| int | graphicsCommandPool() const |
| int | graphicsQueue() const |
| uint32_t | hostVisibleMemoryIndex() const |
| bool | isValid() const |
| VkImage | msaaColorImage(int idx) const |
| VkImageView | msaaColorImageView(int idx) const |
| int | physicalDevice() const |
| const int * | physicalDeviceProperties() const |
| int | sampleCountFlagBits() const |
| void | setDeviceExtensions(const QByteArrayList &extensions) |
| void | setFlags(QVulkanWindow::Flags flags) |
| void | setPhysicalDeviceIndex(int idx) |
| void | setPreferredColorFormats(const int &formats) |
| void | setSampleCount(int sampleCount) |
| QVulkanInfoVector<QVulkanExtension> | supportedDeviceExtensions() |
| QVector<int> | supportedSampleCounts() |
| bool | supportsGrab() const |
| VkImage | swapChainImage(int idx) const |
| int | swapChainImageCount() const |
| QSize | swapChainImageSize() const |
| VkImageView | swapChainImageView(int idx) const |
Статические открытые члены
| const int | MAX_CONCURRENT_FRAME_COUNT |
Подробное описание
QVulkanWindow — это поддерживающее Vulkan QWindow, которое управляет устройством Vulkan, графической очередью, пулом и буфером команд, изображением глубины/трафарета и двукратно буферизованным FIFO swapchain, одновременно обеспечивая корректное поведение в отношении событий, таких как изменение размера, специальные ситуации, такие как отсутствие очереди устройств, поддерживающей как графику, так и презентацию, сценарии потери устройства, и дополнительный функционал, например, считывание обратно отрендеренного контента. Концептуально это аналог QOpenGLWindow в мире Vulkan.
Примечание: QVulkanWindow не всегда устраняет необходимость реализации полностью настраиваемого подкласса QWindow, поскольку он не всегда будет достаточным в сложных случаях использования.
QVulkanWindow может быть встроен в пользовательские интерфейсы на основе QWidget с помощью QWidget::createWindowContainer(). Однако этот подход имеет ряд ограничений. Обязательно изучите документацию сначала.
Типичное приложение, использующее QVulkanWindow, может выглядеть следующим образом:
class VulkanRenderer : public QVulkanWindowRenderer
{
public:
VulkanRenderer(QVulkanWindow *w) : m_window(w) { }
void initResources() override
{
m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device());
...
}
void initSwapChainResources() override { ... }
void releaseSwapChainResources() override { ... }
void releaseResources() override { ... }
void startNextFrame() override
{
VkCommandBuffer cmdBuf = m_window->currentCommandBuffer();
...
m_devFuncs->vkCmdBeginRenderPass(...);
...
m_window->frameReady();
}
private:
QVulkanWindow *m_window;
QVulkanDeviceFunctions *m_devFuncs;
};
class VulkanWindow : public QVulkanWindow
{
public:
QVulkanWindowRenderer *createRenderer() override {
return new VulkanRenderer(this);
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
// enable the standard validation layers, when available
inst.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
if (!inst.create())
qFatal("Failed to create Vulkan instance: %d", inst.errorCode());
VulkanWindow w;
w.setVulkanInstance(&inst);
w.showMaximized();
return app.exec();
} Как видно из примера, основные шаблоны использования QVulkanWindow следующие:
- Объект QVulkanInstance ассоциируется с помощью QWindow::setVulkanInstance(). После этого его можно получить через QWindow::vulkanInstance() из любого места и на любом потоке.
- Аналогично QVulkanInstance, расширения устройства можно запросить через supportedDeviceExtensions() до фактической инициализации. Запрос на включение расширения выполняется через setDeviceExtensions(). Такие вызовы должны выполняться до того, как окно станет видимым, то есть до вызова show() или аналогичных функций. Запросы на недопустимые расширения игнорируются.
- Рендерер реализован в подклассе QVulkanWindowRenderer, экземпляр которого создается в фабричной функции createRenderer().
- Основные команды Vulkan экспонируются через объект QVulkanFunctions, который можно получить, вызвав QVulkanInstance::functions(). Функции уровня устройства доступны после создания VkDevice вызовом QVulkanInstance::deviceFunctions().
- Составление вызовов отрисовки для следующего кадра происходит в QVulkanWindowRenderer::startNextFrame(). Ожидается, что реализация добавит команды в буфер команд, возвращённый из currentCommandBuffer(). Возврат из функции не означает, что команды готовы к отправке. Вместо этого требуется явный вызов frameReady(). Это позволяет асинхронно генерировать команды, возможно, на нескольких потоках. Простые реализации просто вызовут frameReady() в конце QVulkanWindowRenderer::startNextFrame().
- Базовые ресурсы Vulkan (физическое устройство, графический очередь, пул команд, основной буфер команд окна, форматы изображений и т.д.) доступны в QVulkanWindow через лёгкие функции-получатели. Некоторые из них предназначены только для удобства, и приложения всегда могут запросить, создать и управлять дополнительными ресурсами напрямую через API Vulkan.
- Рендерер живёт в потоке gui/main, как и само окно. Этот поток затем ограничивается скоростью отображения, аналогично тому, как ведёт себя OpenGL с интервалом подмены 1. Однако реализация рендерера свободна использовать несколько потоков любым удобным ей способом. Доступ к данным, таким как vulkanInstance(), currentCommandBuffer() и т.д., можно получить с любого потока. Отправка основного буфера команд, очереди отображения и построение следующего кадра не начинаются до тех пор, пока frameReady() не будет вызвана в потоке gui/main.
- Когда окно становится видимым, содержимое обновляется автоматически. Дальнейшие обновления можно запросить, вызвав QWindow::requestUpdate(). Для непрерывной отрисовки вызовите requestUpdate() после frameReady().
Для отладки включите категорию логирования qt.vulkan. Критические ошибки выводятся через qWarning() автоматически.
Отличия систем координат OpenGL и Vulkan
Следует знать о двух заметных отличиях: во-первых, в Vulkan ось Y в пространстве клипа направлена вниз, в то время как OpenGL использует ось Y, направленную вверх. Во-вторых, стандартная матрица проекции OpenGL предполагает значения ближней и дальней плоскостей -1 и 1, в то время как Vulkan предпочитает 0 и 1.
Для помощи приложениям в миграции из кода на основе OpenGL без необходимости переворачивать координаты Y в данных вершин и для возможности использования функций QMatrix4x4, таких как QMatrix4x4::perspective(), при сохранении значений minDepth и maxDepth вьюпорта Vulkan равными 0 и 1, QVulkanWindow предоставляет матрицу коррекции, доступную по вызову clipCorrectionMatrix().
Многократная выборка
Хотя по умолчанию отключен, многократная выборка для сглаживания является полностью поддерживаемой QVulkanWindow. Дополнительные буферы цветов и разрешение в буферы без многократной выборки цепочки обмена управляются автоматически.
Для запроса поддерживаемых значений выборки вызовите supportedSampleCounts(). При наличии значения 4, 8, … в возвращаемом наборе передача одного из этих значений в setSampleCount() запрашивает рендеринг с многократной выборкой.
Примечание: в отличие от QSurfaceFormat::setSamples(), список поддерживаемых значений выборки предоставляется приложениям заранее, и в setSampleCount() не происходит автоматического перехода к меньшим значениям выборки. Если запрошенное значение не поддерживается, отображается предупреждение, и многократная выборка не будет использоваться.
Чтение изображений обратно
Если supportsGrab() возвращает true, QVulkanWindow может выполнять чтение из буфера цвета в QImage. grab() — медленная и неэффективная операция, поэтому следует избегать её частого использования. Тем не менее, она полезна, так как позволяет приложениям делать скриншоты или инструментам и тестам обрабатывать и проверять выходные данные рендеринга графического процессора.
Поддержка sRGB
Хотя многие приложения могут работать нормально с поведением по умолчанию QVulkanWindow в отношении форматов изображений цепочки обмена, setPreferredColorFormats() позволяет запросить предварительно определённый формат. Это особенно полезно при работе в цветовом пространстве sRGB. Передача формата, такого как VK_FORMAT_B8G8R8A8_SRGB, приводит к выбору формата sRGB, если он доступен.
Слои проверки
Во время разработки приложений крайне полезно иметь включённые слои проверки Vulkan. Как показано в примере кода выше, вызов QVulkanInstance::setLayers() в QVulkanInstance перед QVulkanInstance::create() включает проверку, предполагая, что стековая структура драйвера Vulkan в системе содержит необходимые слои.
Примечание: Учитывайте платформозависимые различия. На настольных платформах установка Vulkan SDK обычно достаточна. Однако, например, для Android требуется развертывание дополнительных общих библиотек вместе с приложением, а также назначается другой список имён слоев проверки. Для получения дополнительной информации см. страницы разработки Vulkan для Android.
Примечание: QVulkanWindow не экспонирует слои устройства, так как эта функциональность устарела начиная с версии 1.0.13 API Vulkan.
См. также QVulkanInstance и QWindow.
Документация по типам членов
перечисление QVulkanWindow::Flagфлаги QVulkanWindow::Flags
Это перечисление описывает флаги, которые можно передать в setFlags().
| Константа | Значение | Описание |
|---|---|---|
QVulkanWindow::PersistentResources |
0x01 |
Обеспечивает, что графические ресурсы не будут освобождены при том, как окно перестаёт быть отображаемым. По умолчанию поведение заключается в освобождении всего, и повторной инициализации позже при повторном отображении. |
Тип Flags — это псевдоним для QFlags<Flag>. Он хранит комбинацию значений Flag через операцию ИЛИ.
Документация по функциям членов
QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
Создаёт новый QVulkanWindow с заданным parent.
Тип поверхности задаётся как QSurface::VulkanSurface.
[virtual] QVulkanWindow::~QVulkanWindow()
Деструктор.
int QVulkanWindow::availablePhysicalDevices()
Возвращает список свойств поддерживаемых физических устройств в системе.
Примечание: Эту функцию можно вызвать до того, как окно станет видимым.
QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()
Возвращает QMatrix4x4, которую можно использовать для исправления отличий систем координат OpenGL и Vulkan.
Умножение матрицы проекции на эту матрицу позволяет приложениям продолжать предполагать, что ось Y направлена вверх, и устанавливать значения minDepth и maxDepth в ьюпорте равными 0 и 1 соответственно, без необходимости дальнейшего исправления позиций Z вершин. Геометрические данные из приложений OpenGL могут использоваться как есть, при условии что состояние растрирования соответствует настройкам обрезки и лицевой стороны OpenGL.
int QVulkanWindow::colorFormat() const
Возвращает формат буфера цвета, используемый цепочкой обмена.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() и до QVulkanWindowRenderer::releaseResources().
См. также setPreferredColorFormats().
int QVulkanWindow::concurrentFrameCount() const
Возвращает количество кадров, которые могут быть потенциально активными одновременно.
Примечание: Значение постоянно в течение всего жизненного цикла QVulkanWindow.
class Renderer {
...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
};
void Renderer::startNextFrame()
{
const int count = m_window->concurrentFrameCount();
for (int i = 0; i < count; ++i)
m_uniformBufInfo[i] = ...
...
} См. также currentFrame().
[virtual] QVulkanWindowRenderer *QVulkanWindow::createRenderer()
Возвращает новый экземпляр QVulkanWindowRenderer.
Эта виртуальная функция вызывается один раз в течение жизненного цикла окна, в какой-то момент после того, как оно станет видимым в первый раз.
Реализация по умолчанию возвращает null, и поэтому отрисовка не будет выполняться, кроме очистки буферов.
Окно принимает во владение возвращённый объект рендерера.
int QVulkanWindow::currentCommandBuffer() const
Возвращает активный буфер команд для текущего изображения обменной цепочки. Реализации QVulkanWindowRenderer::startNextFrame() ожидают добавления команд в этот буфер.
Примечание: Данную функцию следует вызывать только внутри startNextFrame() и, в случае асинхронного генерирования команд, до вызова frameReady().
int QVulkanWindow::currentFrame() const
Возвращает индекс текущего кадра в диапазоне [0, concurrentFrameCount() - 1].
Реализации рендерера должны гарантировать, что данные униформ и другие динамические ресурсы существуют в нескольких копиях, чтобы предотвратить изменение данных, используемых по-прежнему активными кадрами N - 1, N - 2, ... N - concurrentFrameCount() + 1, кадром N.
Для избежания зависимости от размеров динамических массивов, приложения могут использовать MAX_CONCURRENT_FRAME_COUNT при объявлении массивов. Это гарантированно всегда будет равно или больше значения, возвращаемого concurrentFrameCount(). Такие массивы могут быть индексированы значением, возвращаемым этой функцией.
class Renderer {
...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
};
void Renderer::startNextFrame()
{
VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
...
} Примечание: Данную функцию следует вызывать только внутри startNextFrame() и, в случае асинхронного генерирования команд, до вызова frameReady().
См. также concurrentFrameCount().
int QVulkanWindow::currentFramebuffer() const
Возвращает VkFramebuffer для текущего изображения обменной цепочки, используя стандартный рендер-пас.
Фреймбуфер имеет два атрибута (цвет, глубина-шаблон), когда не используется многократная выборка, и три (разрешение цвета, глубина-шаблон, многократная выборка цвета), когда sampleCountFlagBits() больше, чем VK_SAMPLE_COUNT_1_BIT. Рендереры должны учесть это, например, при предоставлении значений очистки.
Примечание: Приложениям не требуется использовать этот фреймбуфер, если они предоставляют собственный рендер-пас вместо того, что возвращается defaultRenderPass().
Примечание: Данную функцию следует вызывать только внутри startNextFrame() и, в случае асинхронного генерирования команд, до вызова frameReady().
См. также defaultRenderPass().
int QVulkanWindow::currentSwapChainImageIndex() const
Возвращает индекс текущего изображения обменной цепочки в диапазоне [0, swapChainImageCount() - 1].
Примечание: Данную функцию следует вызывать только внутри startNextFrame() и, в случае асинхронного генерирования команд, до вызова frameReady().
int QVulkanWindow::defaultRenderPass() const
Возвращает типовой рендер-пас с одним под-пасом.
Примечание: Приложениям не требуется использовать этот рендер-пас. Однако в этом случае они несут ответственность за обеспечение того, чтобы текущие изображения обменной цепочки и глубина-шаблон перешли из VK_IMAGE_LAYOUT_UNDEFINED в VK_IMAGE_LAYOUT_PRESENT_SRC_KHR и VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL либо через собственный рендер-пас приложения, либо другими средствами.
Примечание: Чтение/запись маски не включено в этом рендер-пасе.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
См. также currentFramebuffer().
int QVulkanWindow::depthStencilFormat() const
Возвращает формат, используемый буфером(ами) глубины-шаблона.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
VkImage QVulkanWindow::depthStencilImage() const
Возвращает изображение глубины-шаблона.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::depthStencilImageView() const
Возвращает представление изображения глубины-шаблона.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
int QVulkanWindow::device() const
Возвращает активное логическое устройство.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
uint32_t QVulkanWindow::deviceLocalMemoryIndex() const
Возвращает индекс типа локальной памяти устройства, подходящий для общего использования.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
Примечание: Нет гарантии, что этот тип памяти всегда подходит. Правильное решение, кросс-реализуемое, — особенно для локальных изображений — вручную выбрать тип памяти после проверки маски, возвращаемой vkGetImageMemoryRequirements.
QVulkanWindow::Flags QVulkanWindow::flags() const
Возвращает запрошенные флаги.
См. также setFlags().
void QVulkanWindow::frameReady()
Эта функция должна вызываться ровно один раз в ответ на каждый вызов реализации QVulkanWindowRenderer::startNextFrame(). В момент этого вызова основной буфер команд, доступный через currentCommandBuffer(), должен содержать все необходимые команды рендеринга, добавленные с момента вызова, поскольку эта функция инициирует отправку команд и помещает команду отображения в очередь.
Примечание: Данная функция должна вызываться только из потока gui/главного потока, где вызываются функции QVulkanWindowRenderer и где находится экземпляр QVulkanWindow.
См. также QVulkanWindowRenderer::startNextFrame().
QImage QVulkanWindow::grab()
Создаёт и рендерит следующий кадр без отображения, затем выполняет блокирующее чтение содержимого изображения.
Возвращает изображение, если реализация startNextFrame() рендерера вызывает обратный вызов frameReady() напрямую. В противном случае возвращает неполное изображение, имеющее правильный размер, но не содержимое пока. Содержимое будет доставлено через сигнал frameGrabbed() в последнем случае.
Примечание: Эта функция не должна вызываться, когда кадр находится в процессе обработки (то есть, frameReady() ещё не был вызван обратно приложением).
Примечание: Эта функция потенциально затратна из-за дополнительного блокирующего чтения.
Примечание: Эта функция в настоящее время требует, чтобы обменная цепочка поддерживала использование в качестве источника передачи (VK_IMAGE_USAGE_TRANSFER_SRC_BIT), и в противном случае завершится неудачно.
int QVulkanWindow::graphicsCommandPool() const
Возвращает активный графический пул команд.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
int QVulkanWindow::graphicsQueue() const
Возвращает активную графическую очередь.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
uint32_t QVulkanWindow::hostVisibleMemoryIndex() const
Возвращает индекс типа памяти, видимой для хоста, подходящий для общего использования.
Возвращаемый тип памяти будет одновременно видимым для хоста и согласованным. Кроме того, он также будет кэширован, если это возможно.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
bool QVulkanWindow::isValid() const
Возвращает true, если это окно успешно инициализировало все ресурсы Vulkan, включая обменную цепочку.
Примечание: Инициализация происходит в первый момент экспонирования после того, как окно станет видимым.
VkImage QVulkanWindow::msaaColorImage(int idx) const
Возвращает указанное изображение цвета многократной выборки или VK_NULL_HANDLE если многократная выборка не используется.
idx должен находиться в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::msaaColorImageView(int idx) const
Возвращает указанную многообразную цветную картинку представления, или VK_NULL_HANDLE если многообразная выборка не используется.
idx должен находиться в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
int QVulkanWindow::physicalDevice() const
Возвращает активное физическое устройство.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::preInitResources() до QVulkanWindowRenderer::releaseResources().
const int *QVulkanWindow::physicalDeviceProperties() const
Возвращает указатель на свойства активного физического устройства.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::preInitResources() до QVulkanWindowRenderer::releaseResources().
int QVulkanWindow::sampleCountFlagBits() const
Возвращает текущее количество выборок в виде VkSampleCountFlagBits значения.
При нацеливании на целевой рендеринг, поле rasterizationSamples в VkPipelineMultisampleStateCreateInfo должно быть установлено в это значение.
См. также setSampleCount() и supportedSampleCounts().
void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)
Устанавливает список расширений устройств, которые должны быть включены.
Неподдерживаемые расширения игнорируются.
Расширение swapchain всегда будет автоматически добавлено, нет необходимости включать его в этот список.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет никакого эффекта, если вызвана после этого.
void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)
Конфигурирует поведение на основе предоставленных флагов.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет никакого эффекта, если вызвана после этого.
См. также flags().
void QVulkanWindow::setPhysicalDeviceIndex(int idx)
Запрашивает использование физического устройства с индексом idx. Индекс соответствует списку, возвращаемому из availablePhysicalDevices().
По умолчанию используется первое физическое устройство.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет никакого эффекта, если вызвана после этого.
void QVulkanWindow::setPreferredColorFormats(const int &formats)
Устанавливает предпочтительные форматы swapchain.
По умолчанию не устанавливается предпочтительный формат приложения. В этом случае будет использоваться предпочтительный формат поверхности или, в отсутствии такового, VK_FORMAT_B8G8R8A8_UNORM.
Список в formats упорядочен. Если первый формат не поддерживается, будет рассмотрен второй и так далее. Если ни один из форматов в списке не поддерживается, поведение аналогично поведению по умолчанию.
Для запроса фактического формата после инициализации вызовите colorFormat().
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет никакого эффекта, если вызвана после этого.
Примечание: Переопределение QVulkanWindowRenderer::preInitResources() позволяет динамически просматривать список поддерживаемых форматов, если это необходимо. Там поверхность доступна через QVulkanInstace::surfaceForWindow(), а эта функция по-прежнему может безопасно вызываться, чтобы повлиять на более поздние этапы инициализации.
См. также colorFormat().
void QVulkanWindow::setSampleCount(int sampleCount)
Запрашивает многообразную антиалиасингу с заданным sampleCount. Допустимые значения 1, 2, 4, 8 и т. д. до максимального значения, поддерживаемого физическим устройством.
Когда количество выборок больше 1, QVulkanWindow создаст буфер цвета с многообразной выборкой вместо простого нацеливания на изображения swapchain. Рендеринг в буфере с многообразной выборкой будет разрешен в не-многообразные буферы в конце каждого кадра.
Для просмотра списка поддерживаемых значений выборок вызовите supportedSampleCounts().
При настройке рендерингового конвейера, вызовите sampleCountFlagBits() для запроса активного количества выборок в виде VkSampleCountFlagBits значения.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет никакого эффекта, если вызвана после этого.
См. также supportedSampleCounts() и sampleCountFlagBits().
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
Возвращает список расширений, поддерживаемых логическими устройствами, созданными из физического устройства, выбранного с помощью setPhysicalDeviceIndex().
Примечание: Эта функция может быть вызвана до того, как окно станет видимым.
QVector<int> QVulkanWindow::supportedSampleCounts()
Возвращает набор поддерживаемых значений выборок при использовании физического устройства, выбранного с помощью setPhysicalDeviceIndex(), как отсортированный вектор.
По умолчанию QVulkanWindow использует количество выборок 1. Вызывая setSampleCount() с другим значением (2, 4, 8, ...) из набора, возвращаемого этой функцией, можно запросить многообразную антиалиасингу.
Примечание: Эта функция может быть вызвана до того, как окно станет видимым.
См. также setSampleCount().
bool QVulkanWindow::supportsGrab() const
Возвращает true, если swapchain поддерживает использование в качестве источника передачи, что означает, что grab() функционален.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImage QVulkanWindow::swapChainImage(int idx) const
Возвращает указанное изображение swap chain.
idx должен находиться в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
int QVulkanWindow::swapChainImageCount() const
Возвращает количество изображений в swap chain.
Примечание: Доступ к этому необходимо при предоставлении пользовательского рендерингового пасса и фреймбуфера. Фреймбуфер специфичен для текущего изображения swapchain, и поэтому приложение должно предоставить несколько фреймбуферов.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
QSize QVulkanWindow::swapChainImageSize() const
Возвращает размер изображения swapchain.
Обычно совпадает с размером окна, но может отличаться, если vkGetPhysicalDeviceSurfaceCapabilitiesKHR сообщает о фиксированном размере.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::swapChainImageView(int idx) const
Возвращает указанное представление изображения swap chain.
idx должен находиться в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
Документация по переменным-членам
const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT
Эта переменная хранит постоянное значение, которое всегда равно или больше максимального значения concurrentFrameCount.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qvulkanwindow.html