إطار التزامن

يصف إطار عمل المزامنة بوضوح التبعيات بين العمليات غير المتزامنة المختلفة في نظام رسومات Android. يوفر إطار العمل واجهة برمجة تطبيقات تمكن المكونات من الإشارة إلى وقت إصدار المخازن المؤقتة. يسمح إطار العمل أيضًا بتمرير أساسيات المزامنة بين السائقين من النواة إلى مساحة المستخدمين وبين عمليات مساحة المستخدمين نفسها.

على سبيل المثال ، قد يصطف أحد التطبيقات العمل المطلوب تنفيذه في وحدة معالجة الرسومات. يبدأ GPU في رسم تلك الصورة. على الرغم من عدم رسم الصورة في الذاكرة حتى الآن ، يتم تمرير مؤشر المخزن المؤقت إلى مكون النافذة جنبًا إلى جنب مع السياج الذي يشير إلى وقت انتهاء عمل وحدة معالجة الرسومات. يبدأ مُنشئ النافذة في المعالجة مسبقًا ويمرر العمل إلى وحدة التحكم في الشاشة. بطريقة مماثلة ، يتم عمل وحدة المعالجة المركزية في وقت مبكر. بمجرد انتهاء GPU ، تعرض وحدة التحكم في الشاشة الصورة على الفور.

يتيح إطار عمل المزامنة أيضًا للمنفذين الاستفادة من موارد المزامنة في مكونات الأجهزة الخاصة بهم. أخيرًا ، يوفر الإطار رؤية في خط أنابيب الرسومات للمساعدة في تصحيح الأخطاء.

تزامن صريح

تتيح المزامنة الصريحة للمنتجين والمستهلكين للمخازن المؤقتة للرسومات الإشارة عند الانتهاء من استخدام المخزن المؤقت. يتم تنفيذ المزامنة الصريحة في مساحة kernel.

تشمل مزايا المزامنة الصريحة ما يلي:

  • تباين أقل في السلوك بين الأجهزة
  • دعم أفضل لتصحيح الأخطاء
  • مقاييس الاختبار المحسنة

يحتوي إطار عمل المزامنة على ثلاثة أنواع من الكائنات:

  • sync_timeline
  • sync_pt
  • sync_fence

sync_timeline

sync_timeline هو وضع جدول زمني زيادة monotonically أن البائعين ينبغي أن تنفذ لكل مثيل سائق، مثل السياق GL، تحكم العرض، أو 2D blitter. 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 عناصر صراحة. يوفر API جميع الوظائف المطلوبة.

sync_pt

sync_pt هو قيمة واحدة أو نقطة على sync_timeline . النقطة لها ثلاث حالات: نشطة ، ومشار إليها ، وخطأ. تبدأ النقاط في الحالة النشطة وتنتقل إلى حالات الإشارة أو الخطأ. على سبيل المثال، عندما يكون المستهلك صورة لم يعد يحتاج إلى العازلة، و sync_pt وأشار لذلك يعرف منتج الصورة أنه لا بأس أن يكتب في المخزن المؤقت مرة أخرى.

sync_fence

sync_fence هو عبارة عن مجموعة من sync_pt القيم التي غالبا ما يكون مختلفا sync_timeline الوالدين (مثل وحدة تحكم العرض وGPU). 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 وظيفة أكثر تعقيدا. أثناء عرض المخزن المؤقت على الشاشة ، يرتبط المخزن المؤقت بسياج يشير إلى متى سيكون المخزن المؤقت جاهزًا. يمكنك الانتظار وبدء العمل بعد إزالة السياج.

الطابور وبدء العمل بعد إزالة السياج لا يمنع أي شيء. تقوم على الفور بإرجاع السياج الخاص بك ، مما يضمن متى يكون المخزن المؤقت خارج العرض. أثناء قيامك بوضع قائمة انتظار للمخازن المؤقتة ، يسرد kernel التبعيات مع إطار عمل المزامنة:

/*
 * 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 مع أجزاء مساحة المستخدمين في إطار عمل Android وبرامج التشغيل التي يجب أن تتواصل مع بعضها البعض. يتم تمثيل كائنات Kernel-space كأوصاف ملفات في مساحة المستخدمين.

اتفاقيات التكامل

اتبع اصطلاحات واجهة Android HAL:

  • إذا كان API يوفر واصف الملف الذي يشير إلى sync_pt ، سائق البائع أو HAL باستخدام API يجب إغلاق واصف الملف.
  • إذا كان السائق بائع أو HAL يمر واصف ملف يحتوي على sync_pt إلى وظيفة API، سائق بائع أو HAL يجب ألا قريبة واصف الملف.
  • للاستمرار في استخدام واصف ملف السياج ، يجب أن يقوم برنامج تشغيل البائع أو HAL بتكرار الوصف.

تتم إعادة تسمية كائن السياج في كل مرة يمر فيها من خلال BufferQueue. نواة الدعم السياج يسمح الأسوار لديها سلاسل للأسماء، لذلك يستخدم إطار متزامنة اسم الإطار والعازلة المؤشر الذي يتم في قائمة الانتظار لتسمية السور، مثل SurfaceView:0 . وهذا مفيد في تصحيح لتحديد مصدر طريق مسدود كما تظهر أسماء في إخراج /d/sync وعلة التقارير.

ANativeWindow التكامل

ANativeWindow مدرك للسياج. dequeueBuffer ، queueBuffer ، و cancelBuffer هناك معلمات السياج.

تكامل OpenGL ES

يعتمد تكامل مزامنة OpenGL ES على امتدادات EGL:

  • EGL_ANDROID_native_fence_sync يوفر وسيلة للالتفاف أو إنشاء الأم الروبوت واصفات ملف الجدار في EGLSyncKHR الكائنات.
  • EGL_ANDROID_wait_sync يسمح الأكشاك GPU-الجانب بدلا من جنب وحدة المعالجة المركزية، مما يجعل الانتظار GPU ل 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 تمديد توظف المقابلة ملف الجدار الأصلي السمة واصف التي يمكن تعيينها فقط في وقت إنشاء ولا يمكن الاستعلام مباشرة فصاعدا من كائن تزامن القائمة. يمكن تعيين هذه السمة على أحد الوضعين:

  • واصف ملف السياج صحيح يلتف على الأم الروبوت اصف ملف السياج الموجودة في EGLSyncKHR الكائن.
  • -1 يخلق الروبوت اصف ملف الجدار الأصلي من EGLSyncKHR الكائن.

استخدام DupNativeFenceFD() استدعاء دالة لاستخراج EGLSyncKHR كائن من الروبوت اصف ملف الجدار الأصلي. هذا له نفس نتيجة الاستعلام عن سمة المجموعة ، لكنه يلتزم بالاتفاقية القائلة بأن المستلم يغلق السياج (ومن هنا جاءت العملية المكررة). وأخيرا، وتدمير EGLSyncKHR الكائن يغلق السمة السياج الداخلية.

تكامل مؤلف الأجهزة

يتعامل مؤلف الأجهزة مع ثلاثة أنواع من أسوار المزامنة:

  • يتم تمرير الأسوار اكتساب جنبا إلى جنب مع مخازن مساهمة في setLayerBuffer و setClientTarget المكالمات. هذه تمثل كتابة معلقة في المخزن المؤقت ويجب أن تشير قبل SurfaceFlinger أو يحاول HWC القراءة من المخزن المؤقت المرتبط لإجراء التكوين.
  • يتم استرداد الأسوار الإصدار بعد استدعاء presentDisplay باستخدام getReleaseFences المكالمة. هذه تمثل قراءة معلقة من المخزن المؤقت السابق على نفس الطبقة. يشير سياج التحرير عندما لا يستخدم HWC المخزن المؤقت السابق لأن المخزن المؤقت الحالي قد حل محل المخزن المؤقت السابق على الشاشة. يتم تمرير أسوار التحرير مرة أخرى إلى التطبيق جنبًا إلى جنب مع المخازن المؤقتة السابقة التي سيتم استبدالها أثناء التكوين الحالي. يجب أن ينتظر التطبيق حتى يشير سياج التحرير قبل كتابة محتويات جديدة في المخزن المؤقت الذي تم إرجاعه إليها.
  • يتم إرجاع الأسوار الحالية، واحد لكل إطار، كجزء من الدعوة إلى presentDisplay . تمثل الأسوار الحالية وقت اكتمال تكوين هذا الإطار ، أو بالتناوب ، عندما لم تعد هناك حاجة إلى نتيجة تكوين الإطار السابق. للحصول على عروض البدنية، presentDisplay يعود الأسوار الحالية عندما يظهر الإطار الحالي على الشاشة. بعد إرجاع الأسوار الحالية ، من الآمن الكتابة إلى المخزن المؤقت الهدف SurfaceFlinger مرة أخرى ، إن أمكن. بالنسبة لشاشات العرض الافتراضية ، يتم إرجاع الأسوار الحالية عندما يكون من الآمن قراءتها من المخزن المؤقت للإخراج.