В Android 13 представлена настраиваемая производителем статическая библиотека libtonemap , которая определяет операции тонального отображения и используется совместно с процессом SurfaceFlinger и реализациями Hardware Composer (HWC). Эта функция позволяет производителям оборудования определять и совместно использовать свои алгоритмы тонального отображения дисплея между фреймворком и поставщиками, уменьшая несоответствие в тональном отображении.
До Android 13 операции тонального отображения, специфичные для каждого дисплея, не использовались совместно HWC, SurfaceFlinger и приложениями. В зависимости от пути рендеринга, для HDR-контента это приводило к несоответствиям в качестве изображения, поскольку HDR-контент тонально отображался в выходное пространство по-разному. Это было заметно в таких сценариях, как поворот экрана, где стратегия композиции меняется между GPU и DPU, а также в различиях в поведении рендеринга между TextureView и SurfaceView.
На этой странице описаны интерфейс, возможности настройки и проверки данных в библиотеке libtonemap .
Интерфейс к библиотеке тонального отображения
Библиотека libtonemap содержит реализации, работающие на ЦП, и шейдеры SkSL, которые могут быть подключены SurfaceFlinger для композиции на ГП и HWC для генерации таблицы поиска тонального отображения (LUT). Точкой входа в libtonemap является android::tonemap::getToneMapper() , которая возвращает объект, реализующий интерфейс ToneMapper .
Интерфейс ToneMapper поддерживает следующие возможности:
Сгенерируйте LUT-таблицу для тонального отображения.
Интерфейс
ToneMapper::lookupTonemapGainпредставляет собой реализацию шейдера, определенного в функцииlibtonemap_LookupTonemapGain()для ЦП. Он используется модульными тестами во фреймворке и может быть использован партнерами для помощи в генерации таблицы преобразования тонов (LUT) внутри их цветового конвейера.libtonemap_LookupTonemapGain()принимает значения цвета в абсолютном, ненормализованном линейном пространстве, как в линейном RGB, так и в XYZ, и возвращает число с плавающей запятой, описывающее, насколько следует умножить входные цвета в линейном пространстве.Сгенерировать шейдер SkSL
Интерфейс
ToneMapper::generateTonemapGainShaderSkSL()возвращает строку шейдера SkSL, заданную исходным и целевым пространством данных. Шейдер SkSL интегрируется в реализацию Skia дляRenderEngine, компонента композитинга с ускорением на GPU для SurfaceFlinger. Шейдер также интегрируется вlibhwui, что позволяет эффективно выполнять тональное отображение HDR в SDR дляTextureView. Поскольку сгенерированная строка встраивается в другие шейдеры SkSL, используемые Skia, шейдер должен соответствовать следующим правилам:- Строка шейдера должна иметь точку входа с сигнатурой типа
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz), гдеlinearRGB— значение абсолютных нит пикселей RGB в линейном пространстве, аxyz—linearRGBпреобразованный в XYZ. - Любые вспомогательные методы, используемые строкой шейдера, должны иметь префикс
libtonemap_чтобы избежать конфликтов в определениях шейдеров фреймворка. Аналогично, входные униформы должны иметь префиксin_libtonemap_.
- Строка шейдера должна иметь точку входа с сигнатурой типа
Сгенерировать униформу SkSL
Интерфейс
ToneMapper::generateShaderSkSLUniforms()возвращает следующее, если ему предоставленаstructметаданных, описывающая метаданные из различных стандартов HDR и условий отображения:Список униформ, к которым привязан шейдер SkSL.
Универсальные значения
in_libtonemap_displayMaxLuminanceиin_libtonemap_inputMaxLuminance. Эти значения используются шейдерами фреймворка при масштабировании входного изображения вlibtonemapи нормализации выходного изображения, если это необходимо.
В настоящее время процесс генерации униформ не зависит от входного и выходного пространства данных.
Настройка
Эталонная реализация библиотеки libtonemap дает приемлемые результаты. Однако, поскольку алгоритм тонального отображения, используемый при композиции на GPU, может отличаться от алгоритма, используемого при композиции на DPU, использование эталонной реализации может вызывать мерцание в некоторых сценариях, например, при анимации вращения. Настройка может решить подобные проблемы качества изображения, специфичные для конкретного производителя.
Производителям оборудования настоятельно рекомендуется переопределить реализацию libtonemap , чтобы определить собственный подкласс ToneMapper , который возвращается функцией getToneMapper() . При настройке реализации партнеры должны выполнить одно из следующих действий:
- Измените реализацию
libtonemapнапрямую. - Определите собственную статическую библиотеку, скомпилируйте её как отдельный файл и замените файл
.aбиблиотекиlibtonemapфайлом, сгенерированным из их собственной библиотеки.
Производителям не нужно модифицировать какой-либо код ядра, но для корректной реализации несколько производителей должны обмениваться информацией об алгоритмах тонального отображения DPU.
Проверка
Выполните следующие шаги для проверки вашей реализации:
Воспроизводите на экране HDR-видео, поддерживающие любые стандарты HDR, которые поддерживает ваша система отображения , такие как HLG, HDR10, HDR10+ или DolbyVision.
Включите режим композиции с использованием графического процессора, чтобы исключить заметное для пользователя мерцание.
Для переключения режима работы с графическим процессором используйте следующую команду
adb:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
Общие проблемы
При данной реализации могут возникнуть следующие проблемы:
Полосатость возникает, когда целевой формат рендеринга, используемый при композиции на графическом процессоре, имеет более низкую точность, чем типичное значение для HDR-контента. Например, полосатость может возникнуть, когда реализация HWC поддерживает непрозрачные 10-битные форматы для HDR, такие как RGBA1010102 или P010, но требует, чтобы композиция на графическом процессоре записывала данные в 8-битный формат, например RGBA8888, для поддержки альфа-канала.
Незначительное изменение цвета может быть вызвано различиями в квантовании, если DPU работает с другой точностью, чем GPU.
Каждая из этих проблем связана с относительными различиями в точности используемого оборудования. Типичным обходным путем является обеспечение наличия этапа дизеринга в путях с более низкой точностью, что делает любые различия в точности менее заметными для человека.