हार्डवेयर कंपोज़र एचएएल लागू करें

सरफेसफ्लिंगर से प्राप्त हार्डवेयर कंपोजर (एचडब्ल्यूसी) एचएएल कंपोजिट परतें, ओपनजीएल ईएस (जीएलईएस) और जीपीयू के प्रदर्शन की मात्रा को कम करती हैं।

एचडब्ल्यूसी समग्र सतहों पर ओवरले और 2डी ब्लिटर जैसी वस्तुओं को अमूर्त करता है और विशेष विंडो कंपोजिशन हार्डवेयर के साथ समग्र विंडो में संचार करता है। जीपीयू के साथ सर्फेसफ्लिंगर कंपोजिट के बजाय विंडोज़ को कंपोजिट करने के लिए एचडब्ल्यूसी का उपयोग करें। अधिकांश GPU संरचना के लिए अनुकूलित नहीं होते हैं, और जब GPU SurfaceFlinger से परतें बनाता है, तो ऐप्स अपने स्वयं के रेंडरिंग के लिए GPU का उपयोग नहीं कर सकते हैं।

HWC कार्यान्वयन को समर्थन देना चाहिए:

  • कम से कम चार ओवरले:
    • स्टेटस बार
    • सिस्टम बार
    • अनुप्रयोग
    • वॉलपेपर/पृष्ठभूमि
  • परतें जो डिस्प्ले से बड़ी हैं (उदाहरण के लिए, वॉलपेपर)
  • प्रति-पिक्सेल अल्फा सम्मिश्रण और प्रति-प्लेन अल्फा सम्मिश्रण एक साथ पूर्वगुणित
  • संरक्षित वीडियो प्लेबैक के लिए हार्डवेयर पथ
  • आरजीबीए पैकिंग ऑर्डर, वाईयूवी प्रारूप, और टाइलिंग, स्विज़लिंग और स्ट्राइड गुण

एचडब्ल्यूसी को लागू करने के लिए:

  1. एक गैर-संचालित एचडब्ल्यूसी लागू करें और सभी कंपोजीशन कार्य जीएलईएस को भेजें।
  2. एचडब्ल्यूसी को क्रमिक रूप से रचना सौंपने के लिए एक एल्गोरिदम लागू करें। उदाहरण के लिए, HWC के ओवरले हार्डवेयर को केवल पहली तीन या चार सतहों को सौंपें।
  3. HWC को अनुकूलित करें. इसमें शामिल हो सकते हैं:
    • उन सतहों का चयन करना जो GPU से अधिकतम भार उठाते हैं और उन्हें HWC में भेजते हैं।
    • यह पता लगाना कि स्क्रीन अपडेट हो रही है या नहीं। यदि ऐसा नहीं है, तो बिजली बचाने के लिए एचडब्ल्यूसी के बजाय जीएलईएस को संरचना सौंपें। जब स्क्रीन दोबारा अपडेट हो जाए, तो कंपोज़िशन को HWC पर ऑफ़लोड करना जारी रखें।
    • सामान्य उपयोग के मामलों की तैयारी जैसे:
      • होम स्क्रीन, जिसमें स्टेटस बार, सिस्टम बार, ऐप विंडो और लाइव वॉलपेपर शामिल हैं
      • पोर्ट्रेट और लैंडस्केप मोड में फ़ुल-स्क्रीन गेम
      • बंद कैप्शनिंग और प्लेबैक नियंत्रण के साथ फ़ुल-स्क्रीन वीडियो
      • संरक्षित वीडियो प्लेबैक
      • स्प्लिट-स्क्रीन मल्टीविंडो

एचडब्ल्यूसी आदिम

एचडब्ल्यूसी कंपोजिशन कार्य और डिस्प्ले हार्डवेयर के साथ इसके इंटरेक्शन को दर्शाने के लिए दो प्रिमिटिव, परतें और डिस्प्ले प्रदान करता है। HWC VSYNC पर नियंत्रण भी प्रदान करता है और VSYNC घटना होने पर इसे सूचित करने के लिए SurfaceFlinger को कॉलबैक भी प्रदान करता है।

एचआईडीएल इंटरफ़ेस

एंड्रॉइड 8.0 और उच्चतर एचडब्ल्यूसी और सरफेसफ्लिंगर के बीच बाइंडराइज्ड आईपीसी के लिए कंपोजर एचएएल नामक एक एचआईडीएल इंटरफ़ेस का उपयोग करता है। कंपोज़र HAL पुराने hwcomposer2.h इंटरफ़ेस को प्रतिस्थापित करता है। यदि विक्रेता एचडब्ल्यूसी का कंपोजर एचएएल कार्यान्वयन प्रदान करते हैं, तो कंपोजर एचएएल सीधे सरफेसफ्लिंगर से एचआईडीएल कॉल स्वीकार करता है। यदि विक्रेता HWC का एक विरासत कार्यान्वयन प्रदान करते हैं, तो कंपोज़र HAL hwcomposer2.h से फ़ंक्शन पॉइंटर्स को लोड करता है, HIDL कॉल को फ़ंक्शन पॉइंटर कॉल में अग्रेषित करता है।

एचडब्ल्यूसी किसी दिए गए डिस्प्ले के गुणों को निर्धारित करने के लिए कार्य प्रदान करता है; विभिन्न डिस्प्ले कॉन्फ़िगरेशन (जैसे 4k या 1080p रिज़ॉल्यूशन) और रंग मोड (जैसे मूल रंग या असली sRGB) के बीच स्विच करने के लिए; और यदि समर्थित हो तो डिस्प्ले को चालू, बंद या कम-पावर मोड में बदलना।

फ़ंक्शन सूचक

यदि विक्रेता सीधे कंपोजर एचएएल को लागू करते हैं, तो सर्फेसफ्लिंगर एचआईडीएल आईपीसी के माध्यम से अपने कार्यों को कॉल करता है। उदाहरण के लिए, एक परत बनाने के लिए, SurfaceFlinger कंपोज़र HAL पर createLayer() को कॉल करता है।

यदि विक्रेता hwcomposer2.h इंटरफ़ेस लागू करते हैं, तो कंपोज़र HAL hwcomposer2.h फ़ंक्शन पॉइंटर्स में कॉल करता है। hwcomposer2.h टिप्पणियों में, HWC इंटरफ़ेस फ़ंक्शंस को लोअरकैमलकेस नामों से संदर्भित किया जाता है जो इंटरफ़ेस में नामित फ़ील्ड के रूप में मौजूद नहीं हैं। लगभग हर फ़ंक्शन hwc2_device_t द्वारा प्रदान किए गए getFunction उपयोग करके फ़ंक्शन पॉइंटर का अनुरोध करके लोड किया जाता है। उदाहरण के लिए, फ़ंक्शन createLayer HWC2_PFN_CREATE_LAYER प्रकार का एक फ़ंक्शन पॉइंटर है, जो तब लौटाया जाता है जब प्रगणित मान HWC2_FUNCTION_CREATE_LAYER को getFunction में पास किया जाता है।

कंपोजर एचएएल फ़ंक्शंस और एचडब्ल्यूसी फ़ंक्शन पासथ्रू फ़ंक्शंस पर विस्तृत दस्तावेज़ीकरण के लिए, composer देखें। HWC फ़ंक्शन पॉइंटर्स पर विस्तृत दस्तावेज़ीकरण के लिए, hwcomposer2.h देखें।

परत और डिस्प्ले हैंडल

HWC द्वारा उत्पन्न हैंडल द्वारा परतों और डिस्प्ले में हेरफेर किया जाता है। सरफेसफ्लिंगर के लिए हैंडल अपारदर्शी हैं।

जब सरफेसफ्लिंगर एक नई परत बनाता है, तो यह createLayer कॉल करता है, जो सीधे कार्यान्वयन के लिए Layer या पासथ्रू कार्यान्वयन के लिए hwc2_layer_t प्रकार का रिटर्न देता है। जब SurfaceFlinger उस परत की एक संपत्ति को संशोधित करता है, तो SurfaceFlinger संशोधन करने के लिए आवश्यक किसी भी अन्य जानकारी के साथ hwc2_layer_t मान को उचित संशोधन फ़ंक्शन में पास करता है। hwc2_layer_t प्रकार किसी पॉइंटर या इंडेक्स को रखने के लिए पर्याप्त बड़ा है।

भौतिक डिस्प्ले हॉटप्लग करके बनाए जाते हैं। जब एक भौतिक डिस्प्ले को हॉटप्लग किया जाता है, तो HWC एक हैंडल बनाता है और हैंडल को हॉटप्लग कॉलबैक के माध्यम से सरफेसफ्लिंगर तक भेजता है। वर्चुअल डिस्प्ले सरफेसफ्लिंगर द्वारा डिस्प्ले का अनुरोध करने के लिए createVirtualDisplay() को कॉल करके बनाए जाते हैं। यदि HWC वर्चुअल डिस्प्ले कंपोज़िशन का समर्थन करता है, तो यह एक हैंडल लौटाता है। फिर, SurfaceFlinger डिस्प्ले की संरचना को HWC को सौंपता है। यदि HWC वर्चुअल डिस्प्ले कंपोज़िशन का समर्थन नहीं करता है, तो SurfaceFlinger हैंडल बनाता है और डिस्प्ले को कंपोज़ करता है।

रचना संचालन प्रदर्शित करें

एक बार वीएसवाईएनसी के अनुसार, सर्फेसफ्लिंगर सक्रिय हो जाता है यदि उसके पास मिश्रित करने के लिए नई सामग्री है। यह नई सामग्री ऐप्स से नई छवि बफ़र्स या एक या अधिक परतों के गुणों में बदलाव हो सकती है। जब SurfaceFlinger इसे जगाता है:

  1. यदि मौजूद हो तो लेन-देन संभालता है।
  2. यदि मौजूद हो तो नए ग्राफ़िक बफ़र्स को लैच करता है।
  3. यदि चरण 1 या 2 के परिणामस्वरूप प्रदर्शन सामग्री में परिवर्तन होता है, तो एक नई रचना निष्पादित करता है।

एक नई रचना करने के लिए, SurfaceFlinger परतों को बनाता और नष्ट करता है या परत की स्थिति को संशोधित करता है, जैसा लागू हो। यह setLayerBuffer या setLayerColor जैसी कॉलों का उपयोग करके परतों को उनकी वर्तमान सामग्री के साथ अद्यतन भी करता है। सभी परतें अपडेट होने के बाद, सरफेसफ्लिंगर validateDisplay कॉल करता है, जो एचडब्ल्यूसी को परतों की स्थिति की जांच करने और यह निर्धारित करने के लिए कहता है कि संरचना कैसे आगे बढ़ेगी। डिफ़ॉल्ट रूप से, SurfaceFlinger प्रत्येक परत को इस प्रकार कॉन्फ़िगर करने का प्रयास करता है कि परत HWC द्वारा संयोजित हो; हालाँकि कुछ परिस्थितियों में, SurfaceFlinger GPU फ़ॉलबैक के माध्यम से परतों को संयोजित करता है।

validateDisplay पर कॉल करने के बाद, SurfaceFlinger getChangedCompositionTypes यह देखने के लिए कॉल करता है कि क्या HWC कंपोजिशन करने से पहले किसी लेयर कंपोजिशन प्रकार को बदलना चाहता है। परिवर्तनों को स्वीकार करने के लिए, सरफेसफ्लिंगर acceptDisplayChanges को कॉल करता है।

यदि कोई परत SurfaceFlinger संरचना के लिए चिह्नित की जाती है, तो SurfaceFlinger उन्हें लक्ष्य बफर में संयोजित करता है। SurfaceFlinger फिर डिस्प्ले को बफ़र देने के लिए setClientTarget कॉल करता है ताकि बफ़र को स्क्रीन पर प्रदर्शित किया जा सके या उन परतों के साथ संयोजित किया जा सके जिन्हें SurfaceFlinger संरचना के लिए चिह्नित नहीं किया गया है। यदि SurfaceFlinger रचना के लिए कोई परत चिह्नित नहीं है, तो SurfaceFlinger रचना चरण को बायपास कर देता है।

अंत में, SurfaceFlinger HWC को रचना प्रक्रिया को पूरा करने और अंतिम परिणाम प्रदर्शित करने के लिए बताने के लिए presentDisplay को कॉल करता है।

एकाधिक प्रदर्शन

एंड्रॉइड 10 मल्टीपल फिजिकल डिस्प्ले को सपोर्ट करता है। एंड्रॉइड 7.0 और उच्चतर पर उपयोग के लिए एचडब्ल्यूसी कार्यान्वयन को डिज़ाइन करते समय, कुछ प्रतिबंध हैं जो एचडब्ल्यूसी परिभाषा में मौजूद नहीं हैं:

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

जबकि ऊपर वर्णित सरफेसफ्लिंगर ऑपरेशन प्रति-डिस्प्ले पर किए जाते हैं, वे सभी सक्रिय डिस्प्ले के लिए क्रमिक रूप से किए जाते हैं, भले ही केवल एक डिस्प्ले की सामग्री अपडेट की गई हो।

उदाहरण के लिए, यदि बाहरी डिस्प्ले अपडेट किया गया है, तो अनुक्रम है:

// In Android 9 and lower:

// Update state for internal display
// Update state for external display
validateDisplay(<internal display>)
validateDisplay(<external display>)
presentDisplay(<internal display>)
presentDisplay(<external display>)

// In Android 10 and higher:

// Update state for internal display
// Update state for external display
validateInternal(<internal display>)
presentInternal(<internal display>)
validateExternal(<external display>)
presentExternal(<external display>)

आभासी प्रदर्शन रचना

वर्चुअल डिस्प्ले संरचना बाहरी डिस्प्ले संरचना के समान है। वर्चुअल डिस्प्ले कंपोजिशन और फिजिकल डिस्प्ले कंपोजिशन के बीच अंतर यह है कि वर्चुअल डिस्प्ले स्क्रीन के बजाय ग्रेलोक बफर को आउटपुट भेजता है। हार्डवेयर कंपोज़र (HWC) एक बफ़र को आउटपुट लिखता है, पूर्ण बाड़ प्रदान करता है, और एक उपभोक्ता को बफ़र भेजता है (जैसे कि वीडियो एनकोडर, GPU, CPU, और इसी तरह)। यदि डिस्प्ले पाइपलाइन मेमोरी पर लिखती है तो वर्चुअल डिस्प्ले 2डी/ब्लिटर या ओवरले का उपयोग कर सकता है।

मोड

सरफेसफ्लिंगर द्वारा validateDisplay() एचडब्ल्यूसी विधि को कॉल करने के बाद प्रत्येक फ्रेम तीन मोड में से एक में होता है:

  • जीएलईएस - जीपीयू सभी परतों को संयोजित करता है, सीधे आउटपुट बफर पर लिखता है। HWC संरचना में शामिल नहीं है।
  • मिश्रित - GPU कुछ परतों को फ़्रेमबफ़र में संयोजित करता है और HWC फ़्रेमबफ़र और शेष परतों को संयोजित करता है, सीधे आउटपुट बफर पर लिखता है।
  • एचडब्ल्यूसी - एचडब्ल्यूसी सभी परतों को मिश्रित करता है और सीधे आउटपुट बफर पर लिखता है।

आउटपुट स्वरूप

वर्चुअल डिस्प्ले बफ़र आउटपुट स्वरूप उनके मोड पर निर्भर करते हैं:

  • जीएलईएस मोड - ईजीएल ड्राइवर आउटपुट बफर प्रारूप को dequeueBuffer() में सेट करता है, आमतौर पर RGBA_8888 । उपभोक्ता को ड्राइवर द्वारा निर्धारित आउटपुट प्रारूप को स्वीकार करने में सक्षम होना चाहिए अन्यथा बफर को पढ़ा नहीं जा सकेगा।
  • मिश्रित और एचडब्ल्यूसी मोड - यदि उपभोक्ता को सीपीयू एक्सेस की आवश्यकता है, तो उपभोक्ता प्रारूप निर्धारित करता है। अन्यथा, प्रारूप IMPLEMENTATION_DEFINED है, और Gralloc उपयोग फ़्लैग के आधार पर सर्वोत्तम प्रारूप सेट करता है। उदाहरण के लिए, यदि उपभोक्ता वीडियो एनकोडर है तो Gralloc एक YCbCr प्रारूप सेट करता है और HWC प्रारूप को कुशलतापूर्वक लिख सकता है।

तुल्यकालन बाड़

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

उदाहरण के लिए, जब कोई ऐप GPU पर उत्पादित बफर सबमिट करता है, तो यह एक सिंक फ़ेंस ऑब्जेक्ट भी सबमिट करता है। यह बाड़ तब संकेत देती है जब GPU बफ़र में लिखना समाप्त कर देता है।

HWC के लिए आवश्यक है कि GPU बफ़र्स प्रदर्शित होने से पहले बफ़र्स लिखना समाप्त कर दे। जब बफ़र्स लिखे जाते हैं तो सिंक फ़ेंस को बफ़र्स और सिग्नल के साथ ग्राफ़िक्स पाइपलाइन के माध्यम से पारित किया जाता है। बफ़र प्रदर्शित होने से पहले, HWC जाँच करता है कि क्या सिंक बाड़ ने संकेत दिया है, और यदि है, तो यह बफ़र प्रदर्शित करता है।

सिंक फ़ेंस के बारे में अधिक जानकारी के लिए हार्डवेयर कंपोज़र इंटीग्रेशन देखें।