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