Перенос скриптов в Vulkan,Перенос скриптов в Vulkan

Для рабочих нагрузок, где идеально подходят вычисления на графическом процессоре, перенос сценариев RenderScript на вычисления Vulkan дает вашему приложению более прямой контроль над оборудованием графического процессора, потенциально открывая дополнительную производительность по сравнению с другими API.

Ниже приводится общий обзор, который поможет вам использовать вычислительные шейдеры Vulkan для замены сценариев RenderScript.

Инициализация Вулкана

Вместо создания объекта контекста RenderScript в Kotlin или Java выполните следующие шаги, чтобы создать контекст Vulkan с помощью NDK.

  1. Создайте экземпляр Vulkan.

  2. Выберите физическое устройство Vulkan, поддерживающее очередь вычислений.

  3. Создайте логическое устройство Vulkan и получите очередь вычислений.

При желании вы можете настроить уровни проверки Vulkan на Android, чтобы ускорить разработку приложений Vulkan.

Пример приложения демонстрирует, как инициализировать контекст Vulkan в VulkanContext.h . Дополнительные сведения см. в разделах «Инициализация» и «Устройства и очереди» спецификации Vulkan.

Распределения Вулкана

Распределение RenderScript можно перенести в образ хранилища Vulkan или в буфер хранилища Vulkan . Для повышения производительности с изображениями, доступными только для чтения, используйте выборочное изображение с операциями выборки либо как комбинированный сэмплер изображения , либо с отдельными привязками сэмплера и выборочного изображения .

Ресурсы Vulkan распределяются внутри Vulkan. Чтобы избежать накладных расходов на копирование памяти при взаимодействии с другими компонентами Android, рассмотрите возможность использования расширения VK_ANDROID_external_memory_android_hardware_buffer для импорта Android AHardwareBuffer в Vulkan. Это расширение доступно на всех устройствах Android, поддерживающих Vulkan 1.1. Дополнительную информацию см. в FEATURE_VULKAN_HARDWARE_VERSION .

Пример приложения демонстрирует, как создавать ресурсы Vulkan в VulkanResources.h . Чтобы узнать больше, см. разделы создания ресурсов и дескрипторов ресурсов спецификации Vulkan.

Преобразование в вычислительные шейдеры Vulkan

Ваши сценарии RenderScript необходимо преобразовать в вычислительные шейдеры Vulkan. Вам также может потребоваться адаптировать свой код в зависимости от использования глобальных переменных RenderScript.

Напишите вычислительный шейдер Vulkan.

Вычислительный шейдер Vulkan обычно пишется на языке шейдеров OpenGL (GLSL), а затем компилируется в формат Standard Portable Intermediate Representation-V (SPIR-V).

Подробную информацию и инструкции по интеграции шейдеров в ваше приложение см. в разделе Компиляторы шейдеров Vulkan для Android .

Адаптация глобальных переменных скрипта

Основываясь на характеристиках глобальных переменных скрипта, мы рекомендуем использовать константы специализации, константы push или объекты универсального буфера для глобальных переменных, которые не изменяются в шейдере:

  • Константы специализации : рекомендуется для глобальных переменных сценария, которые в основном согласованы при вызовах ядра. Изменение значения констант специализации потребует воссоздания вычислительного конвейера.
  • Push-константы : рекомендуется для часто изменяемых глобальных переменных сценария, размер которых меньше maxPushConstantsSize (гарантированный минимум: 128 байт).
  • Единый буфер : рекомендуется для часто изменяемых глобальных переменных скрипта, размеры которых превышают предел push-константы.

Для глобальных переменных, которые изменяются внутри шейдера, вы можете использовать либо образ хранилища Vulkan , либо буфер хранения Vulkan .

Вычисления

Вам необходимо создать вычислительный конвейер Vulkan, чтобы графический процессор выполнял ваш вычислительный шейдер.

Создайте вычислительный конвейер Vulkan.

Файл ComputePipeline.h в примере приложения демонстрирует, как создать вычислительный конвейер Vulkan.

Чтобы использовать скомпилированный шейдер SPIR-V в Vulkan, создайте вычислительный конвейер Vulkan следующим образом:

  1. Создайте шейдерный модуль с скомпилированным шейдером SPIR-V.
  2. Создайте макет набора дескрипторов, указав привязки ресурсов (дополнительную информацию см. в разделе Распределение ).
  3. Создайте набор дескрипторов из макета набора дескрипторов.
  4. Создайте макет конвейера на основе макета набора дескрипторов.
  5. Создайте вычислительный конвейер с шейдерным модулем и макетом конвейера.

Дополнительные сведения см. в разделе «Вычислительные конвейеры» спецификации Vulkan.

Начать расчет

Чтобы начать вычисление с помощью вычислительного конвейера:

  1. Обновите набор дескрипторов, используя ресурсы Vulkan.
  2. Создайте буфер команд Vulkan и запишите следующие команды:
    1. Свяжите конвейер и набор дескрипторов.
    2. Распределение вычислительных рабочих групп.
  3. Отправьте буфер команд в очередь вычислений.
  4. Подождите в очереди или, при необходимости, верните границу синхронизации.

Чтобы связать несколько ядер вместе (например, для миграции кодов с помощью ScriptGroup ), запишите их в один командный буфер и синхронизируйте с барьерами памяти.

Пример приложения демонстрирует две вычислительные задачи:

  • Вращение HUE: простая вычислительная задача с одним вычислительным шейдером. См. пример кода в ImageProcessor::rotateHue .
  • Размытие: более сложная вычислительная задача, в которой последовательно выполняются два вычислительных шейдера. См. пример кода в ImageProcessor::blur .

Чтобы узнать больше о буферах команд или барьерах памяти, обратитесь к разделам спецификации Vulkan, которые называются «Буферы команд и барьеры памяти» .

,

Для рабочих нагрузок, где идеально подходят вычисления на графическом процессоре, перенос сценариев RenderScript на вычисления Vulkan дает вашему приложению более прямой контроль над оборудованием графического процессора, потенциально открывая дополнительную производительность по сравнению с другими API.

Ниже приводится общий обзор, который поможет вам использовать вычислительные шейдеры Vulkan для замены сценариев RenderScript.

Инициализация Вулкана

Вместо создания объекта контекста RenderScript в Kotlin или Java выполните следующие шаги, чтобы создать контекст Vulkan с помощью NDK.

  1. Создайте экземпляр Vulkan.

  2. Выберите физическое устройство Vulkan, поддерживающее очередь вычислений.

  3. Создайте логическое устройство Vulkan и получите очередь вычислений.

При желании вы можете настроить уровни проверки Vulkan на Android, чтобы ускорить разработку приложений Vulkan.

Пример приложения демонстрирует, как инициализировать контекст Vulkan в VulkanContext.h . Дополнительные сведения см. в разделах «Инициализация» и «Устройства и очереди» спецификации Vulkan.

Распределения Вулкана

Распределение RenderScript можно перенести в образ хранилища Vulkan или в буфер хранилища Vulkan . Для повышения производительности с изображениями, доступными только для чтения, используйте выборочное изображение с операциями выборки либо как комбинированный сэмплер изображения , либо с отдельными привязками сэмплера и выборочного изображения .

Ресурсы Vulkan распределяются внутри Vulkan. Чтобы избежать накладных расходов на копирование памяти при взаимодействии с другими компонентами Android, рассмотрите возможность использования расширения VK_ANDROID_external_memory_android_hardware_buffer для импорта Android AHardwareBuffer в Vulkan. Это расширение доступно на всех устройствах Android, поддерживающих Vulkan 1.1. Дополнительную информацию см. в FEATURE_VULKAN_HARDWARE_VERSION .

Пример приложения демонстрирует, как создавать ресурсы Vulkan в VulkanResources.h . Чтобы узнать больше, см. разделы создания ресурсов и дескрипторов ресурсов спецификации Vulkan.

Преобразование в вычислительные шейдеры Vulkan

Ваши сценарии RenderScript необходимо преобразовать в вычислительные шейдеры Vulkan. Вам также может потребоваться адаптировать свой код в зависимости от использования глобальных переменных RenderScript.

Напишите вычислительный шейдер Vulkan.

Вычислительный шейдер Vulkan обычно пишется на языке шейдеров OpenGL (GLSL), а затем компилируется в формат Standard Portable Intermediate Representation-V (SPIR-V).

Подробную информацию и инструкции по интеграции шейдеров в ваше приложение см. в разделе Компиляторы шейдеров Vulkan для Android .

Адаптация глобальных переменных скрипта

Основываясь на характеристиках глобальных переменных скрипта, мы рекомендуем использовать константы специализации, константы push или объекты универсального буфера для глобальных переменных, которые не изменяются в шейдере:

  • Константы специализации : рекомендуется для глобальных переменных сценария, которые в основном согласованы при вызовах ядра. Изменение значения констант специализации потребует воссоздания вычислительного конвейера.
  • Push-константы : рекомендуется для часто изменяемых глобальных переменных сценария, размер которых меньше maxPushConstantsSize (гарантированный минимум: 128 байт).
  • Единый буфер : рекомендуется для часто изменяемых глобальных переменных сценария, размеры которых превышают предел push-константы.

Для глобальных переменных, которые изменяются внутри шейдера, вы можете использовать либо образ хранилища Vulkan , либо буфер хранения Vulkan .

Вычисления

Вам необходимо создать вычислительный конвейер Vulkan, чтобы графический процессор выполнял ваш вычислительный шейдер.

Создайте вычислительный конвейер Vulkan.

Файл ComputePipeline.h в примере приложения демонстрирует, как создать вычислительный конвейер Vulkan.

Чтобы использовать скомпилированный шейдер SPIR-V в Vulkan, создайте вычислительный конвейер Vulkan следующим образом:

  1. Создайте шейдерный модуль с скомпилированным шейдером SPIR-V.
  2. Создайте макет набора дескрипторов, указав привязки ресурсов (дополнительную информацию см. в разделе Распределение ).
  3. Создайте набор дескрипторов из макета набора дескрипторов.
  4. Создайте макет конвейера на основе макета набора дескрипторов.
  5. Создайте вычислительный конвейер с шейдерным модулем и макетом конвейера.

Дополнительные сведения см. в разделе «Вычислительные конвейеры» спецификации Vulkan.

Начать расчет

Чтобы начать вычисление с помощью вычислительного конвейера:

  1. Обновите набор дескрипторов, используя ресурсы Vulkan.
  2. Создайте буфер команд Vulkan и запишите следующие команды:
    1. Свяжите конвейер и набор дескрипторов.
    2. Распределение вычислительных рабочих групп.
  3. Отправьте буфер команд в очередь вычислений.
  4. Подождите в очереди или, при необходимости, верните границу синхронизации.

Чтобы связать несколько ядер вместе (например, для миграции кодов с помощью ScriptGroup ), запишите их в один командный буфер и синхронизируйте с барьерами памяти.

Пример приложения демонстрирует две вычислительные задачи:

  • Вращение HUE: простая вычислительная задача с одним вычислительным шейдером. См. пример кода в ImageProcessor::rotateHue .
  • Размытие: более сложная вычислительная задача, в которой последовательно выполняются два вычислительных шейдера. См. пример кода в ImageProcessor::blur .

Чтобы узнать больше о буферах команд или барьерах памяти, обратитесь к разделам спецификации Vulkan, которые называются «Буферы команд и барьеры памяти» .

,

Для рабочих нагрузок, где идеально подходят вычисления на графическом процессоре, перенос сценариев RenderScript на вычисления Vulkan дает вашему приложению более прямой контроль над оборудованием графического процессора, потенциально открывая дополнительную производительность по сравнению с другими API.

Ниже приводится общий обзор, который поможет вам использовать вычислительные шейдеры Vulkan для замены сценариев RenderScript.

Инициализация Вулкана

Вместо создания объекта контекста RenderScript в Kotlin или Java выполните следующие шаги, чтобы создать контекст Vulkan с помощью NDK.

  1. Создайте экземпляр Vulkan.

  2. Выберите физическое устройство Vulkan, поддерживающее очередь вычислений.

  3. Создайте логическое устройство Vulkan и получите очередь вычислений.

При желании вы можете настроить уровни проверки Vulkan на Android, чтобы ускорить разработку приложений Vulkan.

Пример приложения демонстрирует, как инициализировать контекст Vulkan в VulkanContext.h . Дополнительные сведения см. в разделах «Инициализация» и «Устройства и очереди» спецификации Vulkan.

Распределения Вулкана

Распределение RenderScript можно перенести в образ хранилища Vulkan или в буфер хранилища Vulkan . Для повышения производительности с изображениями, доступными только для чтения, используйте выборочное изображение с операциями выборки либо как комбинированный сэмплер изображения , либо с отдельными привязками сэмплера и выборочного изображения .

Ресурсы Vulkan распределяются внутри Vulkan. Чтобы избежать накладных расходов на копирование памяти при взаимодействии с другими компонентами Android, рассмотрите возможность использования расширения VK_ANDROID_external_memory_android_hardware_buffer для импорта Android AHardwareBuffer в Vulkan. Это расширение доступно на всех устройствах Android, поддерживающих Vulkan 1.1. Дополнительную информацию см. в FEATURE_VULKAN_HARDWARE_VERSION .

Пример приложения демонстрирует, как создавать ресурсы Vulkan в VulkanResources.h . Чтобы узнать больше, см. разделы создания ресурсов и дескрипторов ресурсов спецификации Vulkan.

Преобразование в вычислительные шейдеры Vulkan

Ваши сценарии RenderScript необходимо преобразовать в вычислительные шейдеры Vulkan. Вам также может потребоваться адаптировать свой код в зависимости от использования глобальных переменных RenderScript.

Напишите вычислительный шейдер Vulkan.

Вычислительный шейдер Vulkan обычно пишется на языке шейдеров OpenGL (GLSL), а затем компилируется в формат Standard Portable Intermediate Representation-V (SPIR-V).

Подробную информацию и инструкции по интеграции шейдеров в ваше приложение см. в разделе Компиляторы шейдеров Vulkan для Android .

Адаптация глобальных переменных скрипта

Основываясь на характеристиках глобальных переменных скрипта, мы рекомендуем использовать константы специализации, константы push или объекты универсального буфера для глобальных переменных, которые не изменяются в шейдере:

  • Константы специализации : рекомендуется для глобальных переменных сценария, которые в основном согласованы при вызовах ядра. Изменение значения констант специализации потребует воссоздания вычислительного конвейера.
  • Push-константы : рекомендуется для часто изменяемых глобальных переменных сценария, размер которых меньше maxPushConstantsSize (гарантированный минимум: 128 байт).
  • Единый буфер : рекомендуется для часто изменяемых глобальных переменных скрипта, размеры которых превышают предел push-константы.

Для глобальных переменных, которые изменяются внутри шейдера, вы можете использовать либо образ хранилища Vulkan , либо буфер хранения Vulkan .

Вычисления

Вам необходимо создать вычислительный конвейер Vulkan, чтобы графический процессор выполнял ваш вычислительный шейдер.

Создайте вычислительный конвейер Vulkan.

Файл ComputePipeline.h в примере приложения демонстрирует, как создать вычислительный конвейер Vulkan.

Чтобы использовать скомпилированный шейдер SPIR-V в Vulkan, создайте вычислительный конвейер Vulkan следующим образом:

  1. Создайте шейдерный модуль с скомпилированным шейдером SPIR-V.
  2. Создайте макет набора дескрипторов, указав привязки ресурсов (дополнительную информацию см. в разделе Распределение ).
  3. Создайте набор дескрипторов из макета набора дескрипторов.
  4. Создайте макет конвейера на основе макета набора дескрипторов.
  5. Создайте вычислительный конвейер с шейдерным модулем и макетом конвейера.

Дополнительные сведения см. в разделе «Вычислительные конвейеры» спецификации Vulkan.

Начать расчет

Чтобы начать вычисление с помощью вычислительного конвейера:

  1. Обновите набор дескрипторов, используя ресурсы Vulkan.
  2. Создайте буфер команд Vulkan и запишите следующие команды:
    1. Свяжите конвейер и набор дескрипторов.
    2. Распределение вычислительных рабочих групп.
  3. Отправьте буфер команд в очередь вычислений.
  4. Подождите в очереди или, при необходимости, верните границу синхронизации.

Чтобы связать несколько ядер вместе (например, для миграции кодов с помощью ScriptGroup ), запишите их в один командный буфер и синхронизируйте с барьерами памяти.

Пример приложения демонстрирует две вычислительные задачи:

  • Вращение HUE: простая вычислительная задача с одним вычислительным шейдером. См. пример кода в ImageProcessor::rotateHue .
  • Размытие: более сложная вычислительная задача, в которой последовательно выполняются два вычислительных шейдера. См. пример кода в ImageProcessor::blur .

Чтобы узнать больше о буферах команд или барьерах памяти, обратитесь к разделам спецификации Vulkan, которые называются «Буферы команд и барьеры памяти» .