हार्डवेयर कंपोज़र एचएएल के लिए एआईडीएल

Android 13 से, हार्डवेयर कंपोजर (HWC) एचएएल को AIDL में तय किया गया है. साथ ही, android.hardware.graphics.composer@2.1 से लेकर android.hardware.graphics.composer@2.4 तक के एचआईडीएल वर्शन का इस्तेमाल नहीं किया जा सकता.

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

एआईडीएल से मिलने वाले फ़ायदों की वजह से, वेंडर को Android 13 के बजाय HIDL वर्शन एआईडीएल कंपोज़र एचएएल का इस्तेमाल शुरू करने की सलाह दी जाती है. ज़्यादा जानकारी के लिए, लागू करने का तरीका सेक्शन देखें.

एआईडीएल और एचआईडीएल एचएएल में अंतर

android.hardware.graphics.composer3 नाम के नए एआईडीएल कंपोजर एचएएल के बारे में IComposer.aidl में बताया गया है. यह HIDL HALandroid.hardware.graphics.composer@2.4 जैसा एपीआई उपलब्ध कराता है. हालांकि, इसमें ये बदलाव किए गए हैं:

  • पार्सल किए जा सकने वाले निर्देशों के पक्ष में, फ़ास्ट मैसेज क्यू (एफ़एमक्यू) को हटाना.

    AIDL HAL कमांड इंटरफ़ेस को एचआईडीएल में एफ़एमक्यू पर क्रम से लगाए गए कमांड के उलट, टाइप किए जा सकने वाले पार्स किए जा सकने वाले लिंक के आधार पर तय करता है. इससे, कमांड के लिए एक बेहतर इंटरफ़ेस मिलता है. साथ ही, कमांड पेलोड को समझने के तरीके के बारे में ज़्यादा जानकारी मिलती है.

    executeCommands के लिए, IComposerClient.aidl में यह तरीका बताया गया है

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    जहां हर निर्देश बहुत अच्छे से टाइप किया गया पार्सल किया जा सकने वाला टाइप है. इसके बारे में DisplayCommand.aidl में बताया गया है. निर्देश के रिस्पॉन्स, ज़ोर से टाइप किए गए पार्सल किए जा सकते हैं. इनके बारे में CommandResultPayload.aidl में बताया गया है.

  • IComposerClient.getClientTargetSupport को हटा दिया गया है, क्योंकि इस तरीके के लिए कोई चालू क्लाइंट नहीं है.

  • ASurfaceTransaction_setColor में बताए गए तरीके के मुताबिक, Android में रंगों को बाइट के बजाय फ़्लोट के तौर पर दिखाना, ताकि यह Android में ऊपर वाले ग्राफ़िक स्टैक के साथ बेहतर तरीके से अलाइन हो सके.

  • एचडीआर कॉन्टेंट को कंट्रोल करने के लिए नए फ़ील्ड जोड़े गए हैं.

    AIDL HAL में, स्क्रीन पर एक साथ एचडीआर लेयर मौजूद होने पर, एसडीआर लेयर को आसानी से डाइम किया जा सकता है. इसके लिए, एसडीआर/एचडीआर लेयर के स्टैक का इस्तेमाल किया जाता है.

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

    ClientTargetPropertyWithBrightness में मौजूद brightness फ़ील्ड की मदद से, एचडब्ल्यूसी, क्लाइंट कंपोज़िशन के लिए ब्राइटनेस स्पेस तय कर सकता है. साथ ही, RenderEngine को यह निर्देश दे सकता है कि क्लाइंट कंपोज़िशन में एसडीआर लेयर को मंद करना है या नहीं.

    अगर RenderEngine कॉन्टेंट को डिम करना चाहिए, तो dimmingStage फ़ील्ड, एचडब्ल्यूसी को कॉन्फ़िगर करने की अनुमति देता है. इसमें वेंडर के तय किए गए ColorModes में बदलाव होता है. यह गामा स्पेस की रोशनी को कम कर सकता है, ताकि इसकी कलर पाइपलाइन में वेंडर के तय किए गए कंट्रास्ट को बेहतर बनाया जा सके.

  • स्क्रीन पर सजावट के लिए, Composition.aidl में एक नया कंपज़िशन टाइप DISPLAY_DECORATION जोड़ा गया.

    कुछ डिवाइसों में ऐल्फ़ा मास्क को ऑप्टिमाइज़ करने के लिए खास तौर पर काम करने वाला हार्डवेयर होता है. इससे डिसप्ले पर गोल किनारों और कटआउट को बराबर बनाया जाता है. ऐसे हार्डवेयर वाले डिवाइसों को IComposerClient.getDisplayDecorationSupport को लागू करना होगा, ताकि DisplayDecorationSupport स्ट्रक्चर को नए DisplayDecorationSupport.aidl में दिखाया जा सके. इस स्ट्रक्चर में, डिवाइस के लिए ज़रूरी PixelFormat और AlphaInterpretation एनम की जानकारी दी गई है. इस सुविधा को लागू करने के बाद, System UI, ऐल्फ़ा मास्क लेयर को DISPLAY_DECORATION के तौर पर मार्क करता है. यह एक नया कॉम्पोज़िशन टाइप है, जो खास हार्डवेयर का फ़ायदा लेता है.

  • DisplayCommand.aidl में एक नया expectedPresentTime फ़ील्ड जोड़ा गया.

    expectedPresentTime फ़ील्ड की मदद से SurfaceFlinger, स्क्रीन पर मौजूदा कॉन्टेंट दिखाए जाने का अनुमानित समय सेट कर सकता है. इस सुविधा की मदद से SurfaceFlinger, लागू करने के लिए एक मौजूदा कमांड को समय से पहले भेज देता है. इससे कंपोज़िशन के कई काम को प्रोसेस करने में मदद मिलती है.

  • बूट डिसप्ले कॉन्फ़िगरेशन को कंट्रोल करने के लिए नए एपीआई जोड़े गए.

    BOOT_DISPLAY_CONFIG का इस्तेमाल करके, वेंडर यह बता सकते हैं कि बूट डिसप्ले कॉन्फ़िगरेशन काम करता है. setBootDisplayConfig, clearBootDisplayConfig, और getPreferredBootDisplayConfig तरीकों में BOOT_DISPLAY_CONFIG का इस्तेमाल इस तरह किया जाता है:

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

    • clearBootDisplayConfig का इस्तेमाल करके, यह फ़्रेमवर्क वेंडर को बूट डिसप्ले कॉन्फ़िगरेशन को हटाने के निर्देश देता है. साथ ही, अगली बार फिर से चालू करने पर, उनके पसंदीदा डिसप्ले कॉन्फ़िगरेशन को चालू करता है.

    • getPreferredBootDisplayConfig का इस्तेमाल करके, फ़्रेमवर्क, वेंडर के पसंदीदा बूट मोड के बारे में क्वेरी करता है.

    अगर बूट डिसप्ले कॉन्फ़िगरेशन काम नहीं करता है, तो ये तरीके UNSUPPORTED की वैल्यू दिखाते हैं.

  • डिसप्ले कुछ समय तक इस्तेमाल न होने वाले टाइमर को कंट्रोल करने के लिए, नए एपीआई जोड़े गए हैं.

    • DISPLAY_IDLE_TIMER का इस्तेमाल करके, वेंडर यह बता सकते हैं कि वे इस डिसप्ले के लिए, कोई इनऐक्टिविटी टाइमर लागू करते हैं. डिवाइस के इस्तेमाल में न होने पर, यह सुविधा रिफ़्रेश रेट को कम सेटिंग पर बदल देती है, ताकि बैटरी बचाई जा सके. यह प्लैटफ़ॉर्म, टाइमर के टाइम आउट को कंट्रोल करने के लिए setIdleTimerEnabled का इस्तेमाल करता है. साथ ही, कुछ मामलों में इसे बंद कर देता है, ताकि डिवाइस का इस्तेमाल न होने पर रीफ़्रेश दर के अनचाहे स्विच न हों.

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

लागू करना

Android 13 के लिए, वेंडर को एआईडीएल एचएएल लागू करने की ज़रूरत नहीं है. हालांकि, हम डेवलपर को नई सुविधाओं और एपीआई का इस्तेमाल करने के लिए, HIDL वर्शन के बजाय AIDL कंपोजर एचएएल लागू करने का सुझाव देते हैं.

एआईडीएल एचडब्ल्यूसी एचएएल के लिए रेफ़रंस लागू करना, Android एम्युलेटर में लागू किया गया.

टेस्ट करना

आपने जो लागू किया है उसकी जांच करने के लिए, VtsHalGraphicsComposer3_TargetTest चलाएं.