Рамочное приложение Vulkan на MASM x64

Тема в разделе "Vulkan", создана пользователем ml64, 9 май 2026.

  1. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    58
    Vulkan - это не одна dll. Это целая среда со статическими и динамическими библиотеками, хедерами, скриптами и примерами. И кучей утилит. Установщик вносит изменения в реестр и создаёт переменные среды.
     
  2. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    58
    Upd: если положить vulkan-1.dll из пакета VulkanRT-X64-1.4.350.0-Components.zip, то должно работать, если железо поддерживает Vulkan. Но у меня везде SDK, а не RT, поэтому подтвердить не могу
     
    GRAFik нравится это.
  3. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    58

    Одно важное замечание


    Чуйка меня не подвела. В этом дебаггере есть большой подвох.
    Из-за него (а точнее, из-за слоя валидации) Вулкан падает на GPU Intel. В сети есть много жалоб на эту тему.

    Подробнее:
    по результатам vkEnumerateInstanceLayerProperties лог показывает, что Intel(R) Iris(R) Xe Graphics поддерживает слой валидации - VK_LAYER_KHRONOS_validation. Но фактически Intel работает с этим слоем неадекватно. Приложение аварийно завершается.

    Что делать?
    Напрашивается решение: при входе в программу проверять, есть ли в системе дискретная карта.
    Как это сделать? Способов множество, благо, мы все здесь что-то умеем.
    Но самый простой из них (без реестра, без переменных окружения, без портов и без драйверов) - это спросить у Вулкана.

    Допустим. Но в какой момент?
    Мы получаем информацию об устройствах с помощью функции vkEnumeratePhysicalDevices.
    А её первый аргумент - это hVkInstance.
    То есть мы должны вызвать vkCreateInstance, и только после этого мы получим возможность запроса информации об устройствах.
    Всё бы хорошо. Но для вызова этой функции мы должны заполнить структуру VkInstanceCreateInfo, в которой мы указываем enabledLayerCount, т.е. количество включенных (не всех доступных, а именно включенных) слоёв и ppEnabledLayerNames, т.е. указатель на массив указателей на имена включенных слоёв.

    Что это значит?
    Что мы должны не включать VK_LAYER_KHRONOS_validation, если мы не уверены, что в системе дискретная карта.
    Но если мы вызовем vkCreateInstance без этого слоя, то подключить его уже не сможем без полного перезапуска всего контекста Вулкана.

    Вот такая история.
    А решение - типичный вулкановский костыль: делать всё в два прогона.
    Сначала создаём куцый контекст, чтобы вызвать vkEnumerateInstanceLayerProperties,
    выбираем подходящую видеокарту, выходим и заходим заново.
     
  4. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    58
    Реализация сказанного в посте выше:
     

    Вложения: