يقدّم نظام التشغيل Android 13 مكتبة static
ثابتة يمكن لموفّري الأجهزة ضبطها تُسمى libtonemap
، وهي تحدّد عمليات تحويل النغمات وتتم مشاركتها
مع عملية SurfaceFlinger وعمليات Hardware Composer (HWC).
تتيح هذه الميزة لمصنّعي المعدّات الأصلية تحديد ومشاركة خوارزميات تحويل نغمة الشاشة
بين إطار العمل والمورّدين، ما يقلل من عدم التطابق في تحويل نغمة
الشاشة.
قبل الإصدار Android 13، لم تتم مشاركة عمليات ربط تدرّج الألوان الخاصة بالشاشة بين أجهزة HWC وSurfaceFlinger والتطبيقات. حسب مسار العرض، نتج عن ذلك عدم تطابق في جودة الصورة مع المحتوى بتقنية HDR، حيث تم ربط درجات هذا المحتوى بمساحة عرض مختلفة بطُرق مختلفة. وقد كان ذلك ملحوظًا في سيناريوهات مثل تدوير الشاشة، حيث تتغيّر استراتيجية التركيب بين وحدة معالجة الرسومات ووحدة معالجة البيانات (DPU)، والاختلافات في سلوك العرض بين TextureView وSurfaceView.
توضّح هذه الصفحة تفاصيل الواجهة والتخصيص والتحقّق من صحة
مكتبة libtonemap
.
واجهة مكتبة ربط درجات الألوان
تحتوي مكتبة libtonemap
على عمليات تنفيذ مستندة إلى وحدة المعالجة المركزية (CPU) وأدوات تظليل SkSL، والتي يمكن
توصيلها بواسطة SurfaceFlinger لتكوين الواجهة الخلفية لوحدة معالجة الرسومات، ومن خلال HWC
لإنشاء جدول بحث لتحديد الألوان (LUT). نقطة الدخول إلى libtonemap
هي android::tonemap::getToneMapper()
، وتعرض كائنًا ينفّذ واجهة ToneMapper
.
تتيح واجهة ToneMapper
الإمكانات التالية:
إنشاء جدول بحث للتحويل اللوني
الواجهة
ToneMapper::lookupTonemapGain
هي عملية تنفيذ لوحدة المعالجة المركزية لتأثيرات التشويش المحدّدة فيlibtonemap_LookupTonemapGain()
. ويتم استخدام ذلك من خلال اختبارات الوحدات في إطار العمل، ويمكن للشركاء استخدامه للمساعدة في إنشاء جدول بحث لتحديد الألوان ضمن مسار الألوان الخاص بهم.تأخذ
libtonemap_LookupTonemapGain()
قيم اللون في الفراغ الخطي المطلق وغير الطبيعي، في كل من نموذج أحمر أخضر أزرق (RGB) خطي أو XYZ، وترجع قيمة عائمة تصف مقدار ضرب ألوان الإدخال في الفراغ الخطي.إنشاء برنامج تشويش SkSL
تعرض الواجهة
ToneMapper::generateTonemapGainShaderSkSL()
سلسلة ملفّ shader لـ SkSL، استنادًا إلى مساحة بيانات المصدر والوجهة. يتم توصيل برنامج تشويش SkSL بتطبيق Skia لـRenderEngine
، وهو مكوّن الدمج المُسرَّع بوحدة معالجة الرسومات لـ SurfaceFlinger. يتم أيضًا توصيل أداة التظليل فيlibhwui
، لإتاحة ربط درجات اللون من HDR إلى SDR بفعالية بالنسبة إلىTextureView
. بما أنّ السلسلة التي تم إنشاؤها مضمّنة في تأثيرات SkSL الأخرى التي تستخدمها Skia، يجب أن يلتزم تأثير التلوين بالقواعد التالية:- يجب أن تتضمّن سلسلة أداة التظليل نقطة دخول تتضمّن التوقيع
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
، حيث تمثّلlinearRGB
قيمة وحدات النِت المطلقة بنموذج أحمر أخضر أزرق في المساحة الخطية، والقيمةxyz
هيlinearRGB
، ويتم تحويلها إلى XYZ. - يجب أن تكون أي طرق مساعدة تستخدمها سلسلة ملفات التظليل مسبوقة بسلسلة
libtonemap_
كي لا تتعارض مع تعريفات ملفات التظليل في إطار العمل. وبالمثل، يجب أن تسبق البادئةin_libtonemap_
نماذج الإدخال.
- يجب أن تتضمّن سلسلة أداة التظليل نقطة دخول تتضمّن التوقيع
إنشاء تنسيقات SkSL
تعرض الواجهة
ToneMapper::generateShaderSkSLUniforms()
ما يلي، استنادًا إلىstruct
بيانات وصفية تصف البيانات الوصفية من معايير HDR المختلفة وظروف العرض:قائمة بالزيّات التي تم ربطها بتأثير SkSL
القيم الموحّدة
in_libtonemap_displayMaxLuminance
وin_libtonemap_inputMaxLuminance
وتستخدم أدوات تظليل الإطارات هذه القيم عند توسيع نطاق الإدخال إلىlibtonemap
وتسوية الإخراج عند الاقتضاء.
في الوقت الحالي، لا تعتمد عملية إنشاء الأشكال الموحدة على مساحة بيانات الإدخال والإخراج.
التخصيص
ينتج عن التنفيذ المرجعي لمكتبة libtonemap
نتائج مقبولة. مع ذلك،
قد تختلف خوارزمية ربط الدرجات اللونية المستخدَمة في تركيب وحدة معالجة الرسومات عن تلك المستخدَمة في تركيبة وحدة معالجة الرسومات، لذلك قد يؤدي استخدام تطبيق المرجع إلى وميض في بعض السيناريوهات مثل حركة الدوران. يمكن أن يؤدي التخصيص إلى حلّ هذه المشاكل المتعلّقة بجودة الصور والتي تخصّ المورّد.
ننصح المصنّعين الأصليين للأجهزة بشدة بإلغاء تنفيذ 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) تعمل بدقة مختلفة عن وحدة معالجة الرسومات.
ترتبط كل مشكلة من هذه المشاكل بالاختلافات النسبية في الدقة بين الأجهزة الأساسية. ومن الحلول الشائعة للتغلب على هذه المشكلة التأكّد من تضمين خطوة dither في مسارات الدقة المنخفضة، ما يجعل أي اختلافات في الدقة أقل وضوحًا للعيان.