Google 致力于为黑人社区推动种族平等。查看具体举措
इस पेज का अनुवाद Cloud Translation API से किया गया है.
Switch to English

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

सिंक्रनाइज़ेशन फ्रेमवर्क स्पष्ट रूप से एंड्रॉइड ग्राफिक्स सिस्टम में विभिन्न अतुल्यकालिक संचालन के बीच निर्भरता का वर्णन करता है। फ्रेमवर्क एक एपीआई प्रदान करता है जो घटकों को इंगित करने के लिए सक्षम करता है जब बफर जारी किए जाते हैं। यह फ्रेमवर्क कर्नेल से यूजर्स के बीच और यूजरस्पेस प्रोसेस के बीच सिंक्रोनाइज़ेशन प्रिमिटिव को भी पास करने की अनुमति देता है।

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

सिंक्रोनाइज़ेशन फ्रेमवर्क भी कार्यान्वयनकर्ताओं को अपने स्वयं के हार्डवेयर घटकों में सिंक्रोनाइज़ेशन संसाधनों का लाभ उठाने देता है। अंत में, फ्रेमवर्क डिबगिंग में मदद करने के लिए ग्राफिक्स पाइपलाइन में दृश्यता प्रदान करता है।

स्पष्ट सिंक्रनाइज़ेशन

स्पष्ट तुल्यकालन ग्राफिक्स बफ़र्स के उत्पादकों और उपभोक्ताओं को संकेत करने में सक्षम बनाता है कि जब वे एक बफर का उपयोग कर रहे हैं स्पष्ट सिंक्रनाइज़ेशन कर्नेल-स्थान में कार्यान्वित किया जाता है।

स्पष्ट तुल्यकालन के लाभों में शामिल हैं:

  • उपकरणों के बीच कम व्यवहार भिन्नता
  • बेहतर डिबगिंग समर्थन
  • बेहतर परीक्षण मेट्रिक्स

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

  • sync_timeline
  • sync_pt
  • sync_fence

sync_timeline

sync_timeline एक sync_timeline रूप से बढ़ती समयरेखा है जिसे विक्रेताओं को प्रत्येक ड्राइवर उदाहरण के लिए लागू करना चाहिए, जैसे GL संदर्भ, प्रदर्शन नियंत्रक, या 2D ब्लिटर। sync_timeline हार्डवेयर के एक विशेष टुकड़े के लिए कर्नेल को प्रस्तुत नौकरियों को sync_timelinesync_timeline परिचालन के आदेश के बारे में गारंटी प्रदान करता है और हार्डवेयर-विशिष्ट कार्यान्वयन को सक्षम बनाता है।

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

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

sync_pt

sync_pt एक एकल मान या बिंदु है जो sync_timeline पर है। एक बिंदु में तीन अवस्थाएँ होती हैं: सक्रिय, संकेतित और त्रुटि। अंक सक्रिय अवस्था में शुरू होते हैं और संकेतित या त्रुटि वाले राज्यों में संक्रमण करते हैं। उदाहरण के लिए, जब एक छवि उपभोक्ता को अब बफर की आवश्यकता नहीं होती है, तो sync_pt को संकेतित किया जाता है ताकि एक छवि निर्माता को पता sync_pt कि यह फिर से बफर में लिखना ठीक है।

sync_fence

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

सिंक फ्रेमवर्क कई उपभोक्ताओं या उत्पादकों को संकेत देने की अनुमति देता है जब वे एक फ़ंक्शन पैरामीटर के साथ निर्भरता की जानकारी का संचार करते हुए एक बफर का उपयोग कर समाप्त कर लेते हैं। बाड़ एक फ़ाइल डिस्क्रिप्टर द्वारा समर्थित हैं और कर्नेल स्थान से उपयोगकर्तास्पेस में पारित किए जाते हैं। उदाहरण के लिए, एक बाड़ में दो sync_pt मान हो सकते हैं जो यह संकेत sync_pt हैं कि जब दो अलग-अलग छवि उपभोक्ता बफर पढ़ रहे हैं। जब बाड़ का संकेत दिया जाता है, तो छवि उत्पादकों को पता होता है कि दोनों उपभोक्ता उपभोग कर रहे हैं।

बाड़, 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() एचएएल में कार्य करता है।
  • दो बाड़ से संबंधित जीएल एक्सटेंशन ( 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 HAL इंटरफ़ेस सम्मेलनों का पालन करें:

  • यदि API एक फ़ाइल डिस्क्रिप्टर प्रदान करता है जो एक sync_pt को संदर्भित करता है, तो विक्रेता का ड्राइवर या API का उपयोग करने वाला HAL फ़ाइल डिस्क्रिप्टर को बंद करना चाहिए।
  • यदि विक्रेता ड्राइवर या HAL किसी फ़ाइल डिस्क्रिप्टर को पास करता है जिसमें एक API फ़ंक्शन के लिए sync_pt होता है, तो वेंडर ड्राइवर या HAL को फाइल डिस्क्रिप्टर को बंद नहीं करना चाहिए।
  • बाड़ फ़ाइल डिस्क्रिप्टर का उपयोग जारी रखने के लिए, विक्रेता ड्राइवर या एचएएल को डिस्क्रिप्टर की नकल करनी चाहिए।

बफ़रक्यू के माध्यम से गुजरने पर हर बार एक बाड़ वस्तु का नाम बदल दिया जाता है। कर्नेल बाड़ समर्थन बाड़ के नाम के लिए तार की अनुमति देता है, इसलिए सिंक फ्रेमवर्क विंडो नाम और बफर इंडेक्स का उपयोग करता है जिसे बाड़ का नाम देने के लिए कतारबद्ध किया जा रहा है, जैसे कि SurfaceView:0 । यह डेडलॉक के स्रोत की पहचान करने के लिए डिबगिंग में सहायक है क्योंकि नाम /d/sync और बग रिपोर्ट के आउटपुट में दिखाई देते हैं।

ANativeWindow एकीकरण

ANativeWindow बाड़ से अवगत है। dequeueBuffer , queueBuffer , और cancelBuffer में बाड़ पैरामीटर हैं।

OpenGL ES एकीकरण

OpenGL ES सिंक एकीकरण दो ईजीएल एक्सटेंशन पर निर्भर करता है:

  • EGL_ANDROID_native_fence_sync EGLSyncKHR ऑब्जेक्ट्स में देशी एंड्रॉइड बाड़ फ़ाइल डिस्क्रिप्टर को लपेटने या बनाने का एक तरीका प्रदान करता है।
  • EGL_ANDROID_wait_sync CPU-side के बजाय GPU- साइड स्टॉल की अनुमति देता है, जिससे GPU, EGLSyncKHR प्रतीक्षा EGLSyncKHREGL_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 एक्सटेंशन एक संबंधित देशी बाड़ फ़ाइल डिस्क्रिप्टर विशेषता को सृजित करता है जिसे केवल निर्माण समय पर सेट किया जा सकता है और मौजूदा सिंक ऑब्जेक्ट से सीधे आगे EGL_ANDROID_native_fence_sync नहीं जा सकता है। इस विशेषता को दो में से एक मोड पर सेट किया जा सकता है:

  • मान्य बाड़ फ़ाइल विवरणक एक मौजूदा देशी Android बाड़ फ़ाइल EGLSyncKHR ऑब्जेक्ट में EGLSyncKHR है।
  • -1 एक EGLSyncKHR ऑब्जेक्ट से एक देशी एंड्रॉइड बाड़ फ़ाइल डिस्क्रिप्टर बनाता है।

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

हार्डवेयर संगीतकार एकीकरण

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

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