يصف إطار المزامنة بوضوح التبعيات بين مختلف العمليات غير المتزامنة في نظام الرسومات في Android. إطار العمل توفر واجهة برمجة تطبيقات تتيح للمكونات الإشارة إلى وقت إصدار الموارد الاحتياطية. يسمح الإطار أيضًا بتمرير عناصر المزامنة الأساسية بين برامج التشغيل من kernel إلى مساحة المستخدم وبين عمليات مساحة المستخدم نفسها.
على سبيل المثال، قد يضيف التطبيق مهام إلى "قائمة الانتظار" لتنفيذها في وحدة معالجة الرسومات. تبدأ وحدة معالجة الرسومات في رسم هذه الصورة. على الرغم من أنّه لم يتم رسم الصورة في الذاكرة بعد، يتم تمرير مؤشر المخزن المؤقت إلى مؤلف الإطارات للنافذة مع فاصل يشير إلى وقت انتهاء عمل وحدة معالجة الرسومات . يبدأ مركب النوافذ المعالجة مسبقًا ويصعِّد العمل إلى وحدة تحكّم الشاشة. وبطريقة مماثلة، يتم تنفيذ عمل وحدة المعالجة المركزية مسبقًا. بعد انتهاء وحدة معالجة الرسومات، يعرض عنصر التحكّم في الشاشة الصورة على الفور.
ويتيح إطار عمل المزامنة أيضًا للقائمين بالتنفيذ الاستفادة من مزامنة الموارد في مكونات أجهزتها. أخيرًا، رؤية واضحة على مسار الرسومات للمساعدة في تصحيح الأخطاء.
مزامنة صريحة
تمكّن المزامنة الصريحة منتجي المخازن المؤقتة للرسومات ومستهلكيها لإرسال إشارة عند الانتهاء من استخدام مورد احتياطي. المزامنة الصريحة هي تنفيذه في kernel-space.
تشمل مزايا المزامنة الصريحة ما يلي:
- انخفاض في الاختلاف في السلوك بين الأجهزة
- تحسين دعم تصحيح الأخطاء
- مقاييس اختبار محسَّنة
يتضمّن إطار عمل المزامنة ثلاثة أنواع من العناصر:
sync_timeline
sync_pt
sync_fence
sync_timeline
sync_timeline
هو مخطط زمني متزايد بشكل منتظم يجب أن ينفّذه المورّدون لكل مثيل برنامج تشغيل، مثل سياق GL أو وحدة تحكّم في الشاشة أو وحدة تحويل رسومات ثنائية الأبعاد. sync_timeline
عدد
المهام المرسلة إلى النواة لجزء معين من الأجهزة.
تقدم sync_timeline
ضمانات بشأن ترتيب العمليات
وتتيح عمليات التنفيذ الخاصة بالأجهزة.
اتّبِع هذه الإرشادات عند تنفيذ sync_timeline
:
- قدِّم أسماء مفيدة لجميع محركات التشغيل والمخططات الزمنية والحدود لتبسيط تصحيح الأخطاء.
- تنفيذ
timeline_value_str
وpt_value_str
المشغلات في المخططات الزمنية لجعل مخرجات تصحيح الأخطاء أكثر قابلية للقراءة. - نفِّذ عملية التعبئة
driver_data
لمنح مكتبات مساحة المستخدم. مثل مكتبة GL، والوصول إلى بيانات المخطط الزمني الخاص، إذا رغبت في ذلك. يسمحdata_driver
للمورّدين بتمرير معلومات عن العنصر غير القابل للتغييرsync_fence
وsync_pts
لإنشاء خطوط أوامر التي تستند إليها. - لا تسمح لمساحة المستخدم بإنشاء حدود أو الإشارة إليها بشكل صريح. بشكلٍ صريح يؤدي إنشاء الإشارات/الأسوار إلى هجوم الحرمان من الخدمات الذي يوقف وظائف المسار.
- عدم الوصول إلى
sync_timeline
أوsync_pt
أو عناصرsync_fence
بشكل صريح. توفّر واجهة برمجة التطبيقات جميع البيانات المطلوبة الأخرى.
مزامنة_نقطة
sync_pt
هي قيمة مفردة أو نقطة في
sync_timeline
تملك النقطة
ثلاث حالات: نشطة، تم إرسال إشارة لها، خطأ. حالة بدء النقاط نشطة
والانتقال إلى حالة وجود إشارة أو خطأ على سبيل المثال، عندما تكون صورة
لم يعد المستهلك بحاجة إلى مورد احتياطي، تم إرسال إشارة إلى sync_pt
بحيث يعرف منتج الصور أنه من المقبول الكتابة في المخزن المؤقت مرة أخرى.
sync_fence
sync_fence
هي مجموعة من sync_pt
من القيم.
غالبًا
لها sync_timeline
عناصر رئيسية مختلفة (مثلاً، الشاشة الرئيسية)
وحدة التحكم ووحدة معالجة الرسومات). sync_fence
وsync_pt
و
sync_timeline
هي الأساسيات الرئيسية التي تستند إليها برامج التشغيل ومساحة المستخدم
يستخدمونها لتوصيل تبعياتهم. عندما يتم إشارة السياج، فإن جميع
فإن الأوامر الصادرة قبل السياج ستكتمل لأن
يُنفذ برنامج تشغيل kernel أو كتلة الأجهزة الأوامر بالترتيب.
يسمح إطار عمل المزامنة للعديد من المستهلكين أو المنتجين بالإشارة إلى
الانتهاء من استخدام مورد احتياطي، وتوصيل معلومات التبعية بدالة واحدة
. يتم دعم الحدود بواصف ملف ويتم تمريرها من
مساحة kernel على مساحة المستخدم. على سبيل المثال، يمكن أن يحتوي الفاصل على قيمتين
sync_pt
تشيران إلى انتهاء مستخدِمي الصور المنفصلَين من قراءة ملف التخزين المؤقت. عندما يتم إرسال إشارة الحدود، يعرف صنّاع الصور أنّ كلاً من
المستهلكين قد انتهى من الاستهلاك.
تبدأ الحدود، مثل قيم sync_pt
، نشطة وتغيّر الحالة بناءً على
حالة نقاطه. إذا تم إرسال إشارة لجميع قيم sync_pt
، يتم إرسال إشارة
sync_fence
. إذا تم تسجيل خطأ في أحد sync_pt
، ستظهر حالة خطأ في sync_fence
بأكمله.
لا يمكن تغيير العضوية في sync_fence
بعد
إنشاء السياج. للحصول على أكثر من نقطة واحدة في السياج، يكون الدمج
أجريناها حيث تتم إضافة نقاط من سورين متميزين إلى سياج ثالث.
إذا تمت الإشارة إلى إحدى هذه النقاط في السياج الأصلي ولم تكن هناك إشارة إلى الأخرى،
لن يكون السياج الثالث أيضًا في حالة إشارة.
لتنفيذ المزامنة الصريحة، قدِّم ما يلي:
- نظام فرعي في مساحة النواة ينفذ إطار عمل المزامنة
لبرنامج تشغيل جهاز معيّن إن السائقين الذين يحتاجون إلى الوعي بسياج هم هم
وبشكل عام أي شيء يدخل إلى أداة إنشاء الأجهزة أو يتصل بها.
تشمل الملفات الرئيسية ما يلي:
- التنفيذ الأساسي:
kernel/common/include/linux/sync.h
kernel/common/drivers/base/sync.c
- المستندات في
kernel/common/Documentation/sync.txt
- مكتبة للتواصل مع مساحة النواة في
platform/system/core/libsync
- التنفيذ الأساسي:
- على المورّد توفير حدود
المزامنة المناسبة كمَعلمات لدوالّ
validateDisplay()
وpresentDisplay()
في HAL. - إضافتا GL المرتبطتان بالسياج (
EGL_ANDROID_native_fence_sync
) وEGL_ANDROID_wait_sync
) ودعم السياج في الرسومات السائق.
دراسة حالة: استخدام برنامج تشغيل شاشة
لاستخدام واجهة برمجة التطبيقات المتوافقة مع وظيفة المزامنة،
طوِّر برنامج تشغيل شاشة يتضمّن وظيفة لتخزين البيانات في ذاكرة العرض. قبل أن يتوفّر إطار عمل
المزامنة، كانت هذه الوظيفة تتلقّى dma-buf
عناصر وتضع هذه المخزنات المؤقتة على الشاشة وتحظرها عندما يكون المخزن المؤقت مرئيًا. بالنسبة
مثال:
/* * assumes buffer is ready to be displayed. returns when buffer is no longer on * screen. */ void display_buffer(struct dma_buf *buffer);
من خلال إطار عمل المزامنة، تستخدم الدالة display_buffer
أكثر تعقيدًا. أثناء عرض المخزن المؤقت، يتم ربطه
بحدود تشير إلى وقت استعداد المخزن المؤقت. يمكنك إضافة المحتوى إلى "قائمة المحتوى التالي"
وبدء العمل بعد إزالة المحتوى غير المرغوب فيه.
لا يؤدي وضع العمل في "قائمة الانتظار" وبدء العمل بعد إزالة المحتوى المحظور إلى حظر أي محتوى. وتعود على الفور السياج الخاص بك، مما يضمن وقت وصول المورد الاحتياطي ستظهر خارج الشاشة. أثناء إضافة المخزن المؤقت إلى "قائمة الانتظار"، يُدرج "النواة" التبعيات في إطار عمل المزامنة:
/* * displays buffer when fence is signaled. returns immediately with a fence * that signals when buffer is no longer displayed. */ struct sync_fence* display_buffer(struct dma_buf *buffer, struct sync_fence *fence);
دمج المزامنة
يوضح هذا القسم كيفية دمج إطار عمل مزامنة kernel-space مع مساحة المستخدم لإطار عمل Android وعوامل التشغيل التي يجب أن توضح مع بعضنا البعض. يتم تمثيل عناصر مساحة النواة كأوصاف ملفات في مساحة المستخدم.
اصطلاحات الدمج
اتّبِع اصطلاحات واجهة HAL لنظام التشغيل Android:
- إذا كانت واجهة برمجة التطبيقات توفّر واصفًا للملفات يشير إلى السمة
sync_pt
، يجب أن يغلق برنامج تشغيل المورد أو HAL باستخدام واجهة برمجة التطبيقات واصف الملف. - إذا مرر برنامج تشغيل المورد أو HAL واصف ملف يحتوي على
sync_pt
إلى دالة واجهة برمجة التطبيقات، يجب ألا يكون برنامج تشغيل المورد أو HAL لإغلاق واصف الملف. - لمواصلة استخدام وصف ملف السياج، يجب أن يكرّر برنامج تشغيل المورّد أو HAL الوصف.
تتم إعادة تسمية كائن السياج في كل مرة يمر فيها عبر Buffer playlist.
يتيح دعم سياج النواة للأسوار وجود سلاسل للأسماء، لذا فإن المزامنة
اسم النافذة وفهرس المخزن المؤقت الذي يتم وضعه في قائمة الانتظار لتسمية
السياج، مثل SurfaceView:0
. ويُعدّ ذلك مفعّلاً في تصحيح الأخطاء لتحديد مصدر حالة التوقف المفاجئ، لأنّ الأسماء تظهر في مخرجات /d/sync
وتقارير الأخطاء.
دمج ANativeWindow
ANativeWindow على علم بسياج. dequeueBuffer
,
وqueueBuffer
وcancelBuffer
تتضمنان معلَمات سياج.
دمج OpenGL ES
يعتمد دمج مزامنة OpenGL ES على إضافتَين EGL:
- يوفّر
EGL_ANDROID_native_fence_sync
وسيلة إنشاء واصفات ملفات سياج Android الأصلية أو التفافها فيEGLSyncKHR
عناصر - تسمح سياسة
EGL_ANDROID_wait_sync
بالأكشاك من جانب وحدة معالجة الرسومات بدلاً من وحدة المعالجة المركزية (CPU)، ما يجعل وحدة معالجة الرسومات تنتظرEGLSyncKHR
. إضافةEGL_ANDROID_wait_sync
هي نفسها إضافةEGL_KHR_wait_sync
.
لاستخدام هذه الإضافات بشكل مستقل، يجب تنفيذ
إضافة واحدة (EGL_ANDROID_native_fence_sync
) مع الإضافة المرتبطة
دعم النواة (النواة). الخطوة التالية هي تفعيل EGL_ANDROID_wait_sync
الإضافة في برنامج التشغيل. EGL_ANDROID_native_fence_sync
تتكوّن الإضافة من كائن EGLSyncKHR
قائم على سياج أصلي مميّز
الكتابة. ونتيجةً لذلك، لا تنطبق بالضرورة الإضافات التي تنطبق على أنواع EGLSyncKHR
العناصر الحالية على عناصر EGL_ANDROID_native_fence
، ما يتجنّب التفاعلات غير المرغوب فيها.
تستخدِم إضافة EGL_ANDROID_native_fence_sync
سمة وصف ملف
fence الأصلية المقابلة التي لا يمكن ضبطها إلا في وقت الإنشاء
ولا يمكن الاستعلام عنها مباشرةً من عنصر مزامنة حالي. هذه السمة
يمكن ضبطها على أحد الوضعين التاليين:
- يُغلِّف ملف وصف سياج صالح ملف وصف سياج Android أصليًا في عنصر
EGLSyncKHR
. - يُنشئ -1 واصفًا أصليًا لملف السياجات لنظام Android من
كائن
EGLSyncKHR
.
استخدِم طلب الدالة DupNativeFenceFD()
لاستخراج العنصر
EGLSyncKHR
من وصف ملف السياج الأصلي في Android.
يؤدي ذلك إلى النتيجة نفسها التي يؤدي إليها طلب البحث عن السمة set، ولكنه يلتزم
بالمعيار الذي يقضي بأن يغلق المستلِم السياج (من هنا عملية تكرار
). أخيرًا، يتم إنهاء عملية تدمير العنصر EGLSyncKHR
تصنيف السياج الداخلي.
دمج Machine Composer
تتعامل أداة إنشاء الأجهزة مع ثلاثة أنواع من سياجات المزامنة:
- يتم تمرير حدود الاكتساب مع الموارد الاحتياطية للإدخال إلى
مكالمتا
setLayerBuffer
وsetClientTarget
. وهي تمثل كتابة معلقة في المخزن المؤقت ويجب أن تشير قبل SurfaceFlinger أو HWC يحاول القراءة من المخزن المؤقت المرتبط إلى لأداء التركيب. - يتم استرداد إزالة الحدود بعد الاتصال
presentDisplay
باستخدام مكالمةgetReleaseFences
. ويمثّل ذلك عملية قراءة في انتظار المراجعة من المخزن المؤقت السابق في الطبقة نفسها. يشير رمز إشارة التحرير إلى أنّ وحدة التحكّم في الأجهزة لم تعُد تستخدم المخزن المؤقت السابق لأنّ المخزن المؤقت الحالي قد حلّ محلّ المخزن المؤقت السابق على الشاشة. يتم تمرير حدود الإصدار مرة أخرى إلى التطبيق مع الموارد الاحتياطية السابقة التي سيتم استبداله أثناء المقطوعة الحالية. على التطبيق الانتظار إلى أن يتم تلقّي إشارات بدء الإصدار قبل كتابة محتوى جديد في المخزن المؤقت الذي تم إرجاعه إليه. - يتم عرض الأساور الحالية، بمعدل عنصر واحد لكل إطار، كجزء من
المكالمة إلى
presentDisplay
. تمثل الأسوار الحالية متى قد اكتملت تركيبة هذا الإطار أو بالتناوب عند لم تعد هناك حاجة إلى نتيجة تركيب الإطار السابق. بالنسبة إلى الشاشات الفعلية، تعرضpresentDisplay
الأسوار الحالية عندما يظهر الإطار الحالي على الشاشة. بعد إرجاع الأسوار الحالية، من الآمن الكتابة إلى المخزن المؤقت المستهدف في SurfaceFlinger مرة أخرى، إذا كان ذلك منطبقًا. بالنسبة إلى الشاشات الافتراضية، يتم عرض الأسوار الحالية عندما يكون من الآمن القراءة من مخزن الإخراج.