Hardware Composer HAL लागू करना

हार्डवेयर कंपोजर (एचडब्ल्यूसी) एचएएल, SurfaceFlinger से मिली लेयर को कंपोज करता है. इससे, OpenGL ES (GLES) और जीपीयू के कंपोज करने की संख्या कम हो जाती है.

एचडब्ल्यूसी ऑब्जेक्ट, जैसे कि ओवरले और 2D ब्लिटर को कंपोज़िट करने के लिए ऐब्स्ट्रैक्ट करता है खास तरह के विंडो कंपोज़िशन हार्डवेयर की मदद से संपर्क करता है और मिश्रित विंडो. जीपीयू के साथ SurfaceFlinger कंपोज़िट के बजाय, विंडो कंपोज़िट करने के लिए एचडब्ल्यूसी का इस्तेमाल करें. ज़्यादातर जीपीयू को ऑप्टिमाइज़ नहीं किया जाता कंपोज़िशन और जब जीपीयू लेयर तैयार करता है SurfaceFlinger में, ऐप्लिकेशन अपनी रेंडरिंग के लिए जीपीयू का इस्तेमाल नहीं कर सकते.

एचडब्ल्यूसी लागू करने के लिए, इन चीज़ों का होना ज़रूरी है:

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

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

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

एचडब्ल्यूसी प्रिमिटिव

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

HIDL इंटरफ़ेस

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

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

फ़ंक्शन पॉइंटर

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

अगर वेंडर, hwcomposer2.h इंटरफ़ेस को लागू करते हैं, तो Composer HAL hwcomposer2.h फ़ंक्शन पॉइंटर में कॉल करता है. hwcomposer2.h टिप्पणियों में, एचडब्ल्यूसी इंटरफ़ेस फ़ंक्शन ये हैं लोअरCamelCase नाम से जाने वाले ऐसे नाम जो इंटरफ़ेस में नहीं हैं नाम वाले फ़ील्ड के तौर पर. करीब-करीब हर फ़ंक्शन को लोड करने के लिए, इसके ज़रिए दिया गया getFunction का इस्तेमाल करके फ़ंक्शन पॉइंटर hwc2_device_t. उदाहरण के लिए, फ़ंक्शन createLayer HWC2_PFN_CREATE_LAYER टाइप का एक फ़ंक्शन पॉइंटर है, जो जब इन्यूमरेटेड वैल्यू HWC2_FUNCTION_CREATE_LAYER होती है, तो वैल्यू दिखाई जाती है getFunction में पास हुआ.

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

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

लेयर और डिसप्ले को, एचडब्ल्यूसी से जनरेट किए गए हैंडल से मैनेज किया जाता है. हैंडल, SurfaceFlinger के लिए पारदर्शी नहीं होते.

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

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

डिसप्ले कंपोज़िशन से जुड़ी कार्रवाइयां

हर VSYNC के लिए, SurfaceFlinger एक बार चालू होता है. ऐसा तब होता है, जब उसके पास कॉम्पोज़िट करने के लिए नया कॉन्टेंट हो. यह नई सामग्री ऐप्लिकेशन से नई इमेज बफ़र हो सकती है या एक या ज़्यादा लेयर की प्रॉपर्टी में कोई बदलाव होता है. SurfaceFlinger के इसे जगाए जाने पर:

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

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

validateDisplay पर कॉल करने के बाद, SurfaceFlinger कॉल getChangedCompositionTypes और देखें कि एचडब्ल्यूसी यह कार्रवाई करने से पहले, किसी भी लेयर कंपोज़िशन टाइप में बदलाव करना चाहता है कंपोज़िशन. बदलावों को स्वीकार करने के लिए, SurfaceFlinger acceptDisplayChanges को कॉल करता है.

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

आखिर में, SurfaceFlinger, presentDisplay को कॉल करता है, ताकि वह एचडब्ल्यूसी को कॉम्पोज़िशन की प्रोसेस पूरी करने और नतीजा दिखाने के लिए कह सके.

एक से ज़्यादा डिसप्ले

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

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

हालांकि, ऊपर बताए गए SurfaceFlinger में किए गए काम पूरे किए जाते हैं और सभी चालू डिसप्ले पर, उन्हें क्रम से लगाया जाता है. भले ही, सिर्फ़ एक डिसप्ले का कॉन्टेंट अपडेट किया गया हो.

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

// 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>)

वर्चुअल डिसप्ले कंपोज़िशन

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

मोड

SurfaceFlinger के validateDisplay() HWC तरीके को कॉल करने के बाद, हर फ़्रेम इन तीन में से किसी एक मोड में होता है:

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

आउटपुट फ़ॉर्मैट

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

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

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

सिंक्रोनाइज़ेशन (सिंक) फ़ेंस, Android ग्राफ़िक्स का अहम पहलू हैं सिस्टम. फ़ेंस की मदद से, सीपीयू को एक साथ काम करने वाले जीपीयू के साथ अलग से काम करने में मदद मिलती है. सिर्फ़ तब ब्लॉक करें, जब कोई सही डिपेंडेंसी हो.

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

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

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