सिंक्रोनाइज़ेशन फ़्रेमवर्क

सिंक्रोनाइज़ेशन फ़्रेमवर्क, इनके बीच की डिपेंडेंसी के बारे में साफ़ तौर पर बताता है जिसमें अलग-अलग तरह के एसिंक्रोनस प्रोसेस इस्तेमाल किए गए हैं. फ़्रेमवर्क इस एपीआई से एक ऐसा एपीआई मिलता है जो बफ़र रिलीज़ होने पर, कॉम्पोनेंट को सूचित करने में मदद करता है. यह फ़्रेमवर्क भी शामिल है सिंक्रोनाइज़ेशन प्रिमिटिव को कर्नेल से ड्राइवर के बीच पास करने की अनुमति देता है उपयोगकर्तास्पेस और यूज़रस्पेस खुद प्रोसेस होते हैं.

उदाहरण के लिए, कोई ऐप्लिकेशन जीपीयू में किए जाने वाले काम को सूची में जोड़ सकता है. जीपीयू वह इमेज बनाना शुरू कर देता है. हालांकि इमेज बनाई नहीं गई है अभी तक मेमोरी में, बफ़र पॉइंटर को विंडो को पास कर दिया गया है कंपोज़िटर के साथ फ़ेंस मौजूद है, जिससे पता चलता है कि जीपीयू कब काम करेगा समाप्त करें. विंडो कंपोज़िटर समय से पहले प्रोसेस करना शुरू कर देता है और यह काम डिसप्ले कंट्रोलर को करता है. इसी तरह, सीपीयू भी काम करता है समय से पहले किया जाता है. जीपीयू का सेट अप पूरा हो जाने के बाद, डिसप्ले कंट्रोलर तुरंत इमेज दिखाता है.

सिंक करने के फ़्रेमवर्क की मदद से, लागू करने वाले लोग सिंक करने की सुविधा देता है. आख़िर में, फ़्रेमवर्क आपकी मदद करने के लिए, ग्राफ़िक पाइपलाइन में डीबग करना.

एक्सप्लिसिट सिंकिंग

एक्सप्लिसिट सिंक, ग्राफ़िक्स बफ़र के प्रोड्यूसर और उपभोक्ताओं को उपलब्ध कराता है ताकि बफ़र का इस्तेमाल पूरा हो जाने पर उन्हें सिग्नल दिया जा सके. एक्सप्लिसिट सिंकिंग यह है कर्नेल-स्पेस में लागू किया गया है.

सिंक करने के ये फ़ायदे हैं:

  • डिवाइसों के काम करने के तरीके में कम बदलाव
  • डीबग करने की बेहतर सुविधा
  • बेहतर टेस्टिंग मेट्रिक

सिंक फ़्रेमवर्क में तीन ऑब्जेक्ट टाइप होते हैं:

  • sync_timeline
  • sync_pt
  • sync_fence

Sync_timeline

sync_timeline एक बेहद तेज़ी से बढ़ रही टाइमलाइन है, वेंडर को हर ड्राइवर इंस्टेंस के लिए लागू करना चाहिए, जैसे कि जीएल कॉन्टेक्स्ट, डिसप्ले कंट्रोलर या 2D ब्लिटर का इस्तेमाल किया जा सकता है. sync_timeline की संख्या हार्डवेयर के किसी खास हिस्से के लिए कर्नेल को सबमिट किए गए जॉब. sync_timeline, कार्रवाइयों के ऑर्डर के बारे में गारंटी देता है और हार्डवेयर के हिसाब से लागू करने की सुविधा देता है.

sync_timeline लागू करते समय इन दिशा-निर्देशों का पालन करें:

  • आसान बनाने के लिए सभी ड्राइवरों, टाइमलाइन, और फ़ेंस के नाम बताएं डीबग करना.
  • timeline_value_str और pt_value_str लागू करना ऑपरेटर का इस्तेमाल करें, ताकि डीबग करने के आउटपुट को पढ़ने में आसानी हो.
  • यूज़रस्पेस लाइब्रेरी देने के लिए, फ़िल driver_data को लागू करें. जैसे कि जीएल लाइब्रेरी, निजी टाइमलाइन डेटा का ऐक्सेस, अगर ज़रूरत हो. data_driver की मदद से वेंडर, ऐसे एलिमेंट के बारे में जानकारी भेज सकते हैं जिन्हें बदला नहीं जा सकता कमांड लाइन बनाने के लिए sync_fence और sync_pts इन कैटगरी के बारे में बताया जा सकता है.
  • यूज़रस्पेस को साफ़ तौर पर बाड़ बनाने या सिग्नल देने की अनुमति न दें. साफ़ तौर पर जानकारी देना सिग्नल/फ़ेंस बनाने से, डिनायल ऑफ़ सर्विस अटैक होता है, जो पाइपलाइन की सुविधाओं को रोकता है.
  • sync_timeline, sync_pt या sync_fence एलिमेंट साफ़ तौर पर बताया गया है. एपीआई सभी ज़रूरी सुविधाएं देता है फ़ंक्शन.

Sync_pt

sync_pt sync_timeline. पॉइंट तीन स्थितियां होती हैं: ऐक्टिव, सिग्नल, और गड़बड़ी. पॉइंट ऐक्टिव स्टेटस में शुरू होते हैं और सिग्नल या गड़बड़ी की स्थिति में ट्रांज़िशन करें. उदाहरण के लिए, जब कोई इमेज उपभोक्ता को अब बफ़र की ज़रूरत नहीं है और sync_pt सिग्नल दिया जा रहा है इसलिए इमेज प्रोड्यूसर को पता चल जाता है कि बफ़र में फिर से लिखना सही है.

सिंक_फ़ेंस

sync_fence, sync_pt वैल्यू का कलेक्शन है अक्सर इनके sync_timeline पैरंट हैं (जैसे कि डिसप्ले के लिए कंट्रोलर और जीपीयू का ऐक्सेस मिलता है. sync_fence, sync_pt, और sync_timeline ड्राइवर और यूज़रस्पेस के लिए मुख्य बातें हैं का इस्तेमाल उनकी डिपेंडेंसी के बारे में बताने के लिए किया जाता है. बाड़ को सिग्नल मिलने पर, बाड़ लगाने से पहले जारी किए गए आदेश पूरे होने की गारंटी दी जाती है, क्योंकि कर्नेल ड्राइवर या हार्डवेयर ब्लॉक, निर्देशों को क्रम से चलाता है.

सिंक फ़्रेमवर्क की मदद से, कई उपभोक्ता या प्रोड्यूसर उन्हें बफ़र का इस्तेमाल करके पूरा किया गया और एक ही फ़ंक्शन के साथ डिपेंडेंसी की जानकारी दी गई पैरामीटर. फ़ेंस, फ़ाइल डिस्क्रिप्टर पर आधारित होते हैं और इन्हें यहां से पास किया जाता है कर्नेल स्पेस को यूज़रस्पेस में बदलें. उदाहरण के लिए, एक बाड़ में दो 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() और HAL में presentDisplay() फ़ंक्शन.
  • दो बाड़ से संबंधित 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);

सिंक इंटिग्रेशन

यह सेक्शन बताता है कि कर्नेल-स्पेस सिंक फ़्रेमवर्क को, Android फ़्रेमवर्क के यूज़रस्पेस वाले हिस्से और ड्राइवर की जानकारी एक-दूसरे के साथ शेयर करें. Kernel-space ऑब्जेक्ट को फ़ाइल डिस्क्रिप्टर के तौर पर दिखाया जाता है उपयोगकर्ता स्पेस का इस्तेमाल करें.

इंटिग्रेशन कन्वेंशन

Android HAL इंटरफ़ेस के तौर-तरीकों का पालन करें:

  • अगर एपीआई ऐसा फ़ाइल डिस्क्रिप्टर देता है जो sync_pt से जुड़ा है, वेंडर के ड्राइवर या एपीआई का इस्तेमाल करने वाले HAL को फ़ाइल डिस्क्रिप्टर को बंद करना होगा.
  • अगर वेंडर ड्राइवर या एचएएल ऐसा फ़ाइल डिस्क्रिप्टर पास करते हैं, जिसमें एपीआई फ़ंक्शन को sync_pt करने पर, वेंडर ड्राइवर या HAL को ये काम नहीं करने चाहिए फ़ाइल डिस्क्रिप्टर बंद करें.
  • फ़ेंस फ़ाइल डिस्क्रिप्टर, वेंडर ड्राइवर या HAL को डिस्क्रिप्टर का डुप्लीकेट बनाना चाहिए.

जब भी बफ़र क्यू से होकर, किसी फ़ेंस ऑब्जेक्ट का नाम बदला जाता है, तो उसका नाम बदल दिया जाता है. कर्नेल फ़ेंस सपोर्ट, बाड़ों में नामों के लिए स्ट्रिंग रखने की अनुमति देता है, ताकि फ़्रेमवर्क उस विंडो के नाम और बफ़र इंडेक्स का इस्तेमाल करता है जिसे नाम के लिए सूची में जोड़ा जा रहा है बाड़, जैसे कि 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 में जीपीयू के किनारे स्टॉल लगते हैं सीपीयू-साइड की जगह सही नहीं है. इसकी वजह से जीपीयू को 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 ऑब्जेक्ट में Android फ़ेंस फ़ाइल डिस्क्रिप्टर.
  • -1, EGLSyncKHR ऑब्जेक्ट.

एक्सट्रैक्ट करने के लिए DupNativeFenceFD() फ़ंक्शन कॉल का इस्तेमाल करें नेटिव Android फ़ेंस फ़ाइल डिस्क्रिप्टर से लिया गया EGLSyncKHR ऑब्जेक्ट. इसका नतीजा वही है जो सेट एट्रिब्यूट को क्वेरी करता है, लेकिन इस तरीके का पालन करता है: वह तरीका जिसमें मैसेज पाने वाला व्यक्ति बाड़ को बंद कर देता है (इसलिए, डुप्लीकेट ऑपरेशन). आखिर में, EGLSyncKHR ऑब्जेक्ट को बंद करना बंद हो जाता है इंंटरनल फ़ेंस एट्रिब्यूट.

हार्डवेयर कंपोज़र इंटिग्रेशन

हार्डवेयर कंपोज़र, तीन तरह की सिंक फ़ेंस हैंडल करता है:

  • अक्वायर फ़ेंस, इनपुट बफ़र के साथ पास किए जाते हैं, ताकि setLayerBuffer और setClientTarget कॉल. ये बफ़र में एक रुके हुए लेखन को दिखाते हैं और इन्हें SurfaceFlinger या HWT, जुड़े हुए बफ़र से पढ़ने की कोशिश करता है कंपोज़िशन इस्तेमाल करते हैं.
  • इस नंबर पर कॉल करने के बाद, रिलीज़ फ़ेंस फिर से मिल जाते हैं getReleaseFences कॉल का इस्तेमाल करके presentDisplay. ये उसी लेयर पर मौजूद पिछले बफ़र की रीड रीड के बारे में बताते हैं जिसे मंज़ूरी मिलना बाकी है. ऐप्लिकेशन जब एचडब्ल्यूसी पिछले बफ़र का इस्तेमाल न कर रहा हो, तब फ़ेंस सिग्नल रिलीज़ करें क्योंकि मौजूदा बफ़र ने डिसप्ले पर पिछले बफ़र की जगह ले ली है. रिलीज़ फ़ेंस उन पिछले बफ़र के साथ ऐप्लिकेशन में वापस पास हो जाते हैं जो को मौजूदा कंपोज़िशन के दौरान बदल दिया जाएगा. ऐप्लिकेशन को बफ़र में नया कॉन्टेंट लिखने से पहले, फ़ेंस के सिग्नल रिलीज़ करें. उसे लौटा दिया गया था.
  • प्रज़ेंट फ़ेंस को हर फ़्रेम के हिसाब से एक दिखाया जाता है. presentDisplay को किया गया कॉल. वर्तमान फ़ेंस से पता चलता है कि इस फ़्रेम की कंपोज़िशन पूरी हो गई है या वैकल्पिक तौर पर, जब कंपोज़िशन के नतीजे की ज़रूरत नहीं है. फ़िज़िकल चीज़ों के लिए दिखाता है, तो presentDisplay मौजूदा फ़ेंस दिखाता है. ऐसा तब होता है, जब वर्तमान फ़्रेम स्क्रीन पर दिखाई देता है. मौजूदा बाड़ों को वापस करने के बाद, तो, SurfaceFlinger टारगेट बफ़र में फिर से लिखना सुरक्षित है लागू. वर्चुअल डिसप्ले के लिए, मौजूदा बाड़ तब वापस लौटा दी जाती है, जब यह आउटपुट बफ़र में सुरक्षित रहती है.