אנדרואיד 13 מציגה ספרייה סטטית הניתנת להגדרה של ספק בשם libtonemap
, המגדירה פעולות מיפוי גוונים ומשותפת עם תהליך SurfaceFlinger והטמעות של Hardware Composer (HWC). תכונה זו מאפשרת ליצרני ציוד מקורי להגדיר ולשתף את אלגוריתמי מיפוי גווני התצוגה שלהם בין המסגרת לבין הספקים, ולצמצם אי התאמה במיפוי הגוונים.
לפני אנדרואיד 13, פעולות מיפוי גוונים ספציפיות לתצוגה לא שותפו בין HWC, SurfaceFlinger ואפליקציות. בהתאם לנתיב הרינדור, עבור תוכן HDR, זה הוביל לאי התאמה באיכות התמונה, כאשר תוכן ה-HDR היה ממופה בטון למרחב פלט בדרכים שונות. זה היה מורגש בתרחישים כמו סיבוב מסך, שבהם אסטרטגיית ההרכב משתנה בין ה-GPU ל-DPU, ובהבדלים בהתנהגות העיבוד בין TextureView ל-SurfaceView.
דף זה מתאר את פרטי הממשק, ההתאמה האישית והאימות של ספריית libtonemap
.
ממשק לספריית מיפוי הגוונים
ספריית libtonemap
מכילה יישומים מגובים CPU ו-SkSL shaders, אותם ניתן לחבר על ידי SurfaceFlinger עבור הרכב GPU-backend ועל ידי ה-HWC ליצירת טבלת חיפוש מיפוי גוונים (LUT). נקודת הכניסה ל- libtonemap
היא android::tonemap::getToneMapper()
, שמחזירה אובייקט שמיישם את ממשק ToneMapper
.
ממשק ToneMapper
תומך ביכולות הבאות:
צור LUT למיפוי גוונים
הממשק
ToneMapper::lookupTonemapGain
הוא מימוש CPU של הצללה המוגדרת ב-libtonemap_LookupTonemapGain()
. זה משמש על ידי בדיקות יחידה במסגרת, והוא יכול לשמש את השותפים לסיוע ביצירת LUT למיפוי גוונים בתוך צינור הצבעים שלהם.libtonemap_LookupTonemapGain()
לוקח ערכי צבע במרחב ליניארי מוחלט, לא מנורמל, הן ב-RGB ליניארי והן ב-XYZ, ומחזיר ציפה המתארת כמה להכפיל את צבעי הקלט במרחב ליניארי.צור הצללה של SkSL
הממשק
ToneMapper::generateTonemapGainShaderSkSL()
מחזיר מחרוזת הצללה SkSL, בהינתן מרחב נתונים של מקור ויעד. ה-SkSL Shader מחובר למימוש Skia עבורRenderEngine
, רכיב ה-GPU המואץ עבור SurfaceFlinger. הצללה מחוברת גם ל-libhwui
, כך שניתן לבצע מיפוי גוונים HDR-to-SDR ביעילות עבורTextureView
. מכיוון שהמחרוזת שנוצרה משולבת בשורה ב-SkSL shaders אחרים המשמשים את Skia, ההצללה חייבת לציית לכללים הבאים:- למחרוזת הצללה חייבת להיות נקודת כניסה עם החתימה
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
, כאשרlinearRGB
הוא הערך של ה-nits המוחלט של פיקסלים RGB במרחב ליניארי ו-xyz
הואlinearRGB
המרה ל-XYZ. - כל שיטות העזר המשמשות את המחרוזת של הצללה חייבת להיות קדומה עם המחרוזת
libtonemap_
כדי שהגדרות הצללה של מסגרת לא יתנגשו. באופן דומה, יש להקדים את מדי הקלט עםin_libtonemap_
.
- למחרוזת הצללה חייבת להיות נקודת כניסה עם החתימה
צור מדי SkSL
הממשק
ToneMapper::generateShaderSkSLUniforms()
מחזיר את הדברים הבאים, בהינתןstruct
מטא נתונים המתאר מטא נתונים מתקני HDR ותנאי תצוגה שונים:רשימה של מדים הכרוכים ב-SkSL shader.
הערכים האחידים
in_libtonemap_displayMaxLuminance
ו-in_libtonemap_inputMaxLuminance
. ערכים אלה משמשים את הצללות המסגרת בעת שינוי קנה המידה של הקלט לתוךlibtonemap
, ומנרמל את הפלט לפי העניין.
נכון לעכשיו, תהליך יצירת המדים הוא אגנוסטי למרחב הנתונים של הקלט והפלט.
התאמה אישית
יישום ההתייחסות של ספריית libtonemap
מייצר תוצאות מקובלות. עם זאת, מכיוון שאלגוריתם מיפוי הגוונים המשמש את הרכב ה-GPU יכול להיות שונה מזה המשמש את הרכב ה-DPU, השימוש ביישום ההפניה עלול לגרום להבהוב בתרחישים מסוימים, כגון אנימציית הסיבוב. התאמה אישית יכולה לפתור בעיות כאלה באיכות תמונה ספציפית לספק.
יצרני OEM מעודדים מאוד לעקוף את היישום של libtonemap
כדי להגדיר תת מחלקה ToneMapper
משלהם, המוחזרת על ידי getToneMapper()
. בעת התאמה אישית של היישום, השותפים צפויים לבצע אחת מהפעולות הבאות:
- שנה את היישום של
libtonemap
ישירות. - הגדירו ספרייה סטטית משלהם, קומפלו את הספרייה כעצמאית והחליפו את קובץ ה-
.a
של ספרייתlibtonemap
בקובץ שנוצר מהספרייה המותאמת אישית שלהם.
ספקים אינם צריכים לשנות שום קוד ליבה, אך ספקים מרובים חייבים למסור פרטים על אלגוריתמי מיפוי הגוונים של DPU לצורך יישום נכון.
מַתַן תוֹקֵף
בצע את השלבים הבאים כדי לאמת את היישום שלך:
הפעל סרטוני HDR על המסך בכל תקני HDR שמערכת התצוגה שלך תומכת בהם , כגון HLG, HDR10, HDR10+ או DolbyVision.
החלף את הרכב ה-GPU כדי להבטיח שאין הבהוב מורגש על ידי המשתמש.
השתמש בפקודת
adb
הבאה כדי לשנות את הרכב ה-GPU:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
בעיות נפוצות
הבעיות הבאות יכולות להתרחש ביישום זה:
פסים נגרמת כאשר יעד העיבוד המשמש את הרכב ה-GPU הוא בעל דיוק נמוך מהערך הטיפוסי לתוכן HDR. לדוגמה, פסים יכולים להתרחש כאשר מימוש HWC תומך בפורמטים אטומים של 10 סיביות עבור HDR כגון RGBA1010102 או P010, אך דורש שהרכב GPU יכתוב לפורמט של 8 סיביות כמו RGBA8888 כדי לתמוך באלפא.
שינוי צבע עדין נגרם על ידי הבדלי קוונטיזציה אם ה-DPU פועל בדיוק שונה מזה של ה-GPU.
כל אחת מהנושאים הללו קשורה להבדלי הדיוק היחסיים של החומרה הבסיסית. דרך טיפוסית לעקיפת הבעיה היא להבטיח שיש שלב חילוף בנתיבי הדיוק הנמוכים יותר, מה שהופך את כל הבדלי הדיוק לפחות אנושיים.