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