Управление цветом

Android 8.1 и выше включают поддержку управления цветом, которое может использоваться для обеспечения согласованного опыта при использовании различных технологий отображения. Приложения, работающие на Android, могут получить доступ ко всем возможностям широкоэкранного дисплея, чтобы максимально использовать возможности устройства отображения.

Предыдущие версии Android не включали поддержку управления цветом и вместо этого полагались на совместимость контента и дисплеев (цель, часто поддерживаемая телевизионной индустрией). Однако последние технологии отображения позволяют использовать дисплеи с гораздо большим охватом, которые не отображают существующий контент так, как ожидалось. С Android 8.1 и выше устройства, использующие дисплей с широким охватом (например, активная матрица органических светодиодов или AMOLED, некоторые ЖК-дисплеи), могут видеть контент с широким охватом из приложений.

Определить поддержку устройства

Устройства с широкоцветными дисплеями под управлением Android 8.1 или выше должны поддерживать управление цветом (широкоцветное). Перед включением этой функции убедитесь, что устройство соответствует следующим требованиям:

  • Дисплей устройства соответствует аппаратным требованиям, которые включают хорошо охарактеризованный дисплей, поддерживающий цветовое пространство Display-P3. Если дисплей не соответствует этому требованию, не включайте управление цветом. Для снижения влияния на ЦП и ГП желательна поддержка расширенного sRGB и HDR10 в конвейере дисплея.
  • Устройство поддерживает процесс заводской калибровки, который генерирует данные калибровки (хранящиеся на устройстве) для корректировки производственных отклонений в поведении дисплея. Как минимум, данные калибровки должны позволять дисплею точно отображать содержимое sRGB и белые точки D65 и D73.

Если эти требования соблюдены, вы можете включить функцию управления цветом на устройстве.

Внедрить управление цветом

Для реализации управления цветом сначала обновите драйвер Hardware Composer 2 (HWC2), чтобы он понимал цветовые режимы и применял их к оборудованию. В частности, компоновщик HWC2 должен сообщать о цветовых режимах Display-P3 и sRGB с помощью HWCDisplay::GetColorModes .

Далее включите необходимые расширения OpenGL и поддержку библиотек для перевода цветовых пространств OpenGL в пространства данных HAL. Требуемые расширения OpenGL включают:

  • EGL_EXT_pixel_format_float . Позволяет приложениям создавать презентабельные EGLSurfaces с 16-битными плавающими компонентами цвета. Приоритет: высокий (ожидайте, что это формат пикселей по умолчанию для приложений с широким диапазоном цветов). Требуется поддержка драйвера.
  • EGL_KHR_gl_colorspace . Для приложений, которые хотят использовать буферы кадров формата sRGB по умолчанию для более простого достижения рендеринга sRGB для устройств отображения, это расширение позволяет создавать EGLSurfaces, которые будут рендериться в sRGB с помощью контекстов OpenGL, поддерживающих эту возможность. Требуется поддержка драйвера для поведения sRGB.

Android также предоставляет следующие дополнительные расширения:

  • EGL_EXT_colorspace_scrgb_linear . Это расширение предоставляет новую опцию цветового пространства scRGB, которую приложения могут выбирать при создании EGLSurface. Цветовое пространство scRGB определяет линейное пространство отображения с той же белой точкой и основными цветами, что и sRGB (и, таким образом, обратно совместимо с sRGB). Это не должно требовать поддержки драйвера и может быть реализовано в оболочке Android EGL. Чтобы быть полезным, это расширение требует поддержки 16-битной плавающей точки (FP16).
  • EGL_EXT_gl_colorspace_display_p3 и EGL_EXT_gl_colorspace_display_p3_linear . Для приложений, которые хотят использовать буферы кадров формата Display-P3 по умолчанию для более простого достижения рендеринга sRGB на устройствах отображения, это расширение позволяет создавать EGLSurfaces, которые будут рендериться в Display-P3 контекстами OpenGL, поддерживающими эту возможность. Это можно реализовать в оболочке драйвера EGL.
  • VK_EXT_swapchain_colorspace (Vulkan). Позволяет приложениям помечать цепочки обмена цветовым пространством, которое они используют. Включает ряд распространенных цветовых пространств, таких как DCI-P3, Display-P3, AdobeRGB и BT2020.

Настройка

Вы можете настроить функцию управления цветом, включив поддержку различных цветовых стандартов, таких как DCI-P3, AdobeRGB, Rec709 и Rec2020. Другие настройки включают:

  • Аппаратная поддержка преобразования цветов в конвейере отображения. Обеспечивает поддержку множественных преобразований цветов в оборудовании.
  • Поддержка независимого преобразования цвета на нескольких слоях (например, некоторые слои могут быть sRGB, а другие — расширенным sRGB, каждый со своим собственным цветовым конвейером). Когда видно более одного цветового пространства, некоторые цветовые пространства необходимо преобразовать в цветовое пространство дисплея. В идеале это преобразование лучше всего обеспечивается движком дисплея (в противном случае Android должен выполнить композицию GPU).

Тестирование

Для тестирования управления цветом используйте следующие ресурсы в opengl/tests :

  • gl2_basic — простая демонстрационная версия OpenGL, которая запрашивает цветовое пространство Display-P3.
  • EGL_test проверяет необходимую поддержку расширений и конфигураций (10:10:10:2 и FP16).
  • test_wide_color создает поверхность таким же образом, как и SurfaceFlinger (например, конфигурация, цветовое пространство и формат пикселей).

Референтная реализация

Для эталонной реализации обратитесь к frameworks/native . Для заголовков обратитесь к: