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

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

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

एचडब्ल्यूसी सुविधाओं को इन कामों के लिए लागू किया जा सकता है:

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

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

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

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

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

HIDL इंटरफ़ेस

Android 8.0 और उसके बाद के वर्शन, HWC और SurfaceFlinger के बीच बाइंडर वाले आईपीसी के लिए, Composer HAL नाम के HIDL इंटरफ़ेस का इस्तेमाल करते हैं. 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 इस लेयर की प्रॉपर्टी में बदलाव करती है और SurfaceFlinger, hwc2_layer_t वैल्यू को सही बदलाव फ़ंक्शन में साथ ही, बदलाव करने के लिए कोई भी ज़रूरी जानकारी शामिल करें. hwc2_layer_t टाइप का साइज़, पॉइंटर या इंडेक्स को होल्ड करने के लिए काफ़ी है.

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

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

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

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

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

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

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

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

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

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

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

हालांकि, ऊपर बताए गए 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 तरीके को कॉल करने के बाद, हर फ़्रेम इन तीन में से किसी एक मोड में होता है:

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

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

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

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

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

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

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

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

सिंक फ़ेंस के बारे में ज़्यादा जानकारी के लिए, Hardware Composer पर जाएं इंटिग्रेशन.