ב-Android 13 חדש: פריט סטטי שאפשר להגדיר על ידי הספק
ספרייה שנקראת libtonemap
, שמגדירה פעולות של מיפוי טונים, ומשותפת
באמצעות תהליך SurfaceFlinger וההטמעות של Hardware Composer (HWC).
התכונה הזו מאפשרת ליצרני ציוד מקורי להגדיר ולשתף את מיפוי גווני המסך שלהם
אלגוריתמים בין ה-framework לבין הספקים, וכך לצמצם את חוסר ההתאמה בטון
מיפוי.
לפני Android 13, מיפוי גוונים ספציפי למסך הפעולות לא שותפו בין HWC, SurfaceFlinger והאפליקציות. בהתאם בנתיב הרינדור, ובמקרה של תוכן HDR, הדבר גרם לאי-התאמות באיכות התמונה שבו תוכן ה-HDR מופה בטון למרחב פלט בדרכים שונות. הזה היה ניתן להבחין בתרחישים כמו סיבוב מסך, שבהם הקומפוזיציה שינויים באסטרטגיה בין ה-GPU ל-DPU, והבדלים בעיבוד בין TextureView ל-SurfaceView.
בדף זה מתוארים פרטי הממשק, ההתאמה האישית ופרטי האימות של
הספרייה libtonemap
.
ממשק עם ספריית מיפוי הגוונים
libtonemap
מכילה הטמעות שמגובות במעבד (CPU) ורכיבי הצללה (shader) של SkSL,
מחובר על ידי SurfaceFlinger לצורך הרכבה של קצה עורפי של GPU ועל ידי HWC עבור
כדי ליצור טבלת חיפוש מידע של מיפוי טונים (LUT). נקודת הכניסה אל libtonemap
היא android::tonemap::getToneMapper()
, שמחזירה אובייקט
מטמיעים את הממשק ToneMapper
.
הממשק של ToneMapper
תומך ביכולות הבאות:
יצירת טבלת LUT למיפוי גוונים
הממשק
ToneMapper::lookupTonemapGain
הוא מעבד (CPU) של תוכנת ההצללה שהוגדרה ב-libtonemap_LookupTonemapGain()
. הזה משמש לבדיקות יחידה במסגרת ה-framework, ושותפים יכולים להשתמש בו כדי עזרה ביצירת LUT למיפוי גוונים בצינור הצבעים שלהם.libtonemap_LookupTonemapGain()
מקבל ערכי צבע מוחלטים, מרחב ליניארי לא מנורמל, גם ב-RGB ליניארי וגם ב-XYZ, ומחזיר ערך של מספר ממשי (float) שמתארת כמה להכפיל את צבעי הקלט במרחב ליניארי.יצירת תוכנת הצללה (shader) של SkSL
הממשק
ToneMapper::generateTonemapGainShaderSkSL()
מחזיר מחרוזת של תוכנת ההצללה (shader) SkSL, עם מרחב נתונים של מקור ויעד. תוכנת ההצללה של SkSL מחובר להטמעה של Skia עבורRenderEngine
, את רכיב הקומפוזיציה שמואץ באמצעות GPU ל-SurfaceFlinger. גם תוכנת ההצללה מחובר אלlibhwui
, כדי שניתן יהיה לבצע ביעילות מיפוי גוונים של HDR ל-SDR עבורTextureView
. מכיוון שהמחרוזת שנוצרה ממולאת בכלי להצללה (shader) אחרים של SkSL ב-Skia, תוכנת ההצללה חייבת לפעול בהתאם לכללים הבאים:- מחרוזת ההצללה חייבת לכלול נקודת כניסה עם
חתימה אחת (
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
), כאשרlinearRGB
הוא הערך של ערכי ה-nit המוחלטים של הפיקסלים ב-RGB במרחב ליניארי ו-xyz
הואlinearRGB
מומר ל-XYZ. - כל שיטת סיוע שמשמשת את מחרוזת ההצללה חייבת להתחיל בקידומת
המחרוזת
libtonemap_
, כדי שלא תהיה התנגשות בין ההגדרות של תוכנת ההצללה (shader) של framework. באופן דומה, מדי קלט חייב להתחיל ב-in_libtonemap_
.
- מחרוזת ההצללה חייבת לכלול נקודת כניסה עם
חתימה אחת (
יצירה של מדי SkSL
הממשק
ToneMapper::generateShaderSkSLUniforms()
מחזיר את הפונקציה בהמשך, בהינתן מטא-נתוניםstruct
שמתארים מטא-נתונים ממערכות HDR שונות הסטנדרטים ותנאי התצוגה:רשימה של מדים עם תוכנת הצללה (shader) של SkSL.
הערכים האחידים
in_libtonemap_displayMaxLuminance
ו-in_libtonemap_inputMaxLuminance
. הערכים האלה נמצאים בשימוש על ידי תוכנות הצללה (shader) של framework כשמשנים את קנה המידה של הקלט ל-libtonemap
, ומנורמלים את הפלט הרלוונטי.
כיום תהליך יצירת המדים אינו תלוי בקלט במרחב הנתונים של הפלט.
התאמה אישית
הטמעת קובצי העזר של הספרייה libtonemap
מניבה תוצאות מקובלות. אבל, לפעמים
כי האלגוריתם למיפוי טונים שמשמש להרכבת GPU יכול להיות שונה
שבה נעשה שימוש בהרכב ה-DPU, השימוש ביישום ההפניה עלול לגרום
הבהוב בתרחישים מסוימים, כמו אנימציית סיבוב. בהתאמה אישית
ולפתור בעיות כאלה שקשורות לאיכות התמונות שספציפיות לספק.
מומלץ מאוד ליצרני ציוד מקורי לבטל את ההטמעה של libtonemap
כדי
מגדירים תת-מחלקה ToneMapper
משלהם, שמוחזרת באמצעות getToneMapper()
.
בעת התאמה אישית של ההטמעה, השותפים צריכים לבצע אחת מהפעולות הבאות
הבאים:
- יש לשנות את ההטמעה של
libtonemap
ישירות. - להגדיר את הספרייה הסטטית שלהם, להרכיב את הספרייה בנפרד,
להחליף את הקובץ
.a
של הספרייהlibtonemap
בקובץ שנוצר מהתמונה בהתאמה אישית לספרייה.
ספקים לא צריכים לשנות אף קוד ליבה (kernel), אך מספר ספקים צריכים לשנות לספק פרטים על האלגוריתמים למיפוי טונים של 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.
כל אחת מהבעיות האלו קשורה להפרשי הדיוק היחסיים של בחומרה הבסיסית. פתרון זמני בדרך כלל הוא לוודא שיש שילוב בנתיבים עם רמת הדיוק הנמוכה יותר, כך שהבדלים ברמת הדיוק יהיו פחות אנושיים ברור.