Android 13 wprowadza pakiet statyczny, który można skonfigurować przez dostawcę
biblioteka o nazwie libtonemap
, która definiuje operacje mapowania tonów i jest udostępniana
z procesem SurfaceFlinger i implementacjami Hardware Composer (HWC).
Ta funkcja umożliwia producentom OEM definiowanie i udostępnianie mapowania tonalnego wyświetlacza
między algorytmami platformy a dostawcami, co ogranicza niezgodności w tonach.
z mapowaniem.
Przed Androidem 13 mapowanie tonów charakterystyczne dla wyświetlaczy między HWC, SurfaceFlinger i aplikacjami. W zależności na ścieżce renderowania, w przypadku treści HDR, co prowadziło do niedopasowań w jakości obrazu. w których kolor treści HDR był zmapowany na przestrzeń wyjściową na różne sposoby. Ten jest zauważalna w takich sytuacjach, jak obrót ekranu, i zmianach strategii między GPU i DPU oraz z różnicami w renderowaniu między właściwościami TextureView i SurfaceView.
Na tej stronie opisujemy interfejs, a także informacje o dostosowywaniu i szczegółach weryfikacji
Biblioteka libtonemap
.
Interfejs z biblioteką mapowania tonów
libtonemap
zawiera implementacje oparte na CPU i cieniowanie SkSL,
został przesłany przez SurfaceFlinger na potrzeby kompozycji backendu dla GPU oraz HWC
generując tabelę wyszukiwania mapowania tonów (LUT). Punkt wejścia do: libtonemap
to android::tonemap::getToneMapper()
, która zwraca obiekt
implementuje interfejs ToneMapper
.
Interfejs ToneMapper
obsługuje te funkcje:
Wygeneruj LUT odzwierciedlający ton
Interfejs
ToneMapper::lookupTonemapGain
jest procesorem implementacja cieniowania zdefiniowanego w tabelilibtonemap_LookupTonemapGain()
. Ten jest używany w testach jednostkowych w ramach platformy. Partnerzy mogą go używać do pomaga wygenerować LUT odwzorowywany w ramach potoku kolorów.libtonemap_LookupTonemapGain()
przyjmuje wartości koloru bezwzględne, nieznormalizowana przestrzeń liniowa, zarówno w liniowej przestrzeni RGB, jak i w XYZ, zwraca liczbę zmiennoprzecinkową określający, jak bardzo należy mnożyć kolory wejściowe w przestrzeni liniowej.Wygeneruj program do cieniowania SkSL
Interfejs
ToneMapper::generateTonemapGainShaderSkSL()
zwraca błąd Ciąg znaków cieniowania SkSL dla źródłowej i docelowej przestrzeni danych. Moduł cieniowania SkSL to w implementacji Skia wRenderEngine
. z komponentem komponowania przyspieszanym za pomocą GPU. Działanie cieniowania podłączone do urządzenialibhwui
, aby możliwe było wydajne mapowanie tonów z HDR na SDR wTextureView
. Wygenerowany ciąg jest wbudowany w inne cieniowanie SkSL używane przez Skia, program do cieniowania musi przestrzegać tych zasad:- Ciąg znaków cieniowania musi mieć punkt wejścia z ciągiem
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
podpis, gdzie:linearRGB
to wartość bezwzględnych nitów pikseli RGB w przestrzeni liniowej axyz
tolinearRGB
przekształcone w XYZ. - Wszystkie metody pomocnicze używane przez ciąg cieniowania muszą mieć prefiks
libtonemap_
, aby nie kolidowały ze sobą definicje funkcji cieniowania platformy. Analogicznie, określenie uniformy wejściowe musi mieć poprzedzony prefiksemin_libtonemap_
.
- Ciąg znaków cieniowania musi mieć punkt wejścia z ciągiem
Wygeneruj stroje SkSL
Interfejs
ToneMapper::generateShaderSkSLUniforms()
zwraca wartość poniżej, biorąc pod uwagę metadanestruct
opisujące metadane z różnych formatów HDR standardów wyświetlania i warunków wyświetlania:Lista uniformów objętych cieniowaniem SkSL.
Jednolite wartości
in_libtonemap_displayMaxLuminance
iin_libtonemap_inputMaxLuminance
Te wartości są używane przez cieniowanie platformy przy skalowaniu danych wejściowych do funkcjilibtonemap
i normalizowaniu danych wyjściowych jako mają zastosowanie.
Obecnie proces generowania uniformów jest niezależny od danych wejściowych wyjściowej przestrzeni danych.
Dostosowywanie
Referencyjna implementacja biblioteki libtonemap
daje akceptowalne wyniki. Pamiętaj jednak:
bo algorytm mapowania tonów używany przez układ GPU może się różnić
stosowane przez kompozycję DPU, użycie implementacji referencyjnej może spowodować,
w niektórych sytuacjach, np. podczas animacji obrotu, migania lub migotania. Personalizacja może
rozwiązywania takich problemów z jakością zdjęć specyficznych dla danego dostawcy.
Zdecydowanie zalecamy producentom OEM zastąpić implementację libtonemap
w
definiują własną podklasę ToneMapper
, która jest zwracana przez funkcję getToneMapper()
.
Podczas dostosowywania implementacji partnerzy muszą wykonać jedną z tych czynności:
:
- Bezpośrednio zmień implementację elementu
libtonemap
. - zdefiniować własną bibliotekę statyczną, skompilować ją jako samodzielną i
zastąp plik
.a
bibliotekilibtonemap
plikiem wygenerowanym na podstawie własnych ustawień bibliotece.
Dostawcy nie muszą modyfikować żadnego kodu jądra, ale wielu z nich musi to robić Podaj szczegółowe informacje o algorytmach mapowania tonów DPU, aby zapewnić implementacji.
Weryfikacja
Aby sprawdzić poprawność implementacji, wykonaj te czynności:
Odtwarzaj filmy HDR na ekranie zgodnie ze standardem HDR, który obsługuje Twój system, takich jak HLG, HDR10, HDR10+ czy DolbyVision.
Włącz lub wyłącz kompozycję GPU, aby mieć pewność, że nie widać migotania.
Aby włączyć lub wyłączyć kompozycję GPU, użyj tego polecenia
adb
:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
Typowe problemy
W przypadku takiej implementacji mogą wystąpić te problemy:
Pasy powstają, gdy cel renderowania używany przez kompozycję GPU jest mniejszy bardziej precyzyjną niż typowa dla treści HDR. Na przykład pasy występują wtedy, gdy implementacja HWC obsługuje nieprzezroczyste 10-bitowe formaty HDR, takie jak RGBA1010102 lub P010, ale wymaga zapisywania kompozycji GPU w formacie 8-bitowym np. RGBA8888 z obsługą wersji alfa.
Subtelne przesunięcie kolorów jest spowodowane różnicami w kwantyzacji, jeśli DPU działa z inną precyzją niż GPU.
Każdy z tych problemów wiąże się ze względnymi różnicami precyzji bazowego sprzętu. Typowym sposobem obejścia tego problemu jest zapewnienie na ścieżkach o niższej precyzji, przez co różnice w precyzji jest zauważalna.