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