Hardware Composer HAL के लिए AIDL

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

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

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

AIDL और HIDL HAL के बीच अंतर

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

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

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

    executeCommands 5 तरीके को IComposerClient.aidl में बताया गया है:

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

    हर कमांड, DisplayCommand.aidl में तय किया गया एक स्ट्रॉन्गली टाइप पार्सलेबल टाइप है. कमांड के जवाब, CommandResultPayload.aidl में तय किए गए पार्सल किए जा सकने वाले ऑब्जेक्ट होते हैं.

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

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

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

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

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

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

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

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

    कुछ डिवाइसों में, ऐल्फ़ा मास्क को ऑप्टिमाइज़ करने के लिए खास हार्डवेयर होता है. इससे डिसप्ले पर गोल कोनों और कटआउट को स्मूद किया जाता है. ऐसे हार्डवेयर वाले डिवाइसों को IComposerClient.getDisplayDecorationSupport लागू करना होगा. साथ ही, DisplayDecorationSupport.aidl में बताए गए DisplayDecorationSupport स्ट्रक्चर को वापस भेजना होगा. इस स्ट्रक्चर में, डिवाइस के लिए ज़रूरी PixelFormat और AlphaInterpretation एनम के बारे में बताया गया है. इस सुविधा को लागू करने के बाद, सिस्टम यूआई, ऐल्फ़ा मास्क लेयर को 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 कंपोज़र एचएएल को लागू करने का सुझाव दिया जाता है, ताकि वे AIDL कंपोज़र एचएएल की सुविधाओं और एपीआई का इस्तेमाल कर सकें.

Android इम्यूलेटर में, AIDL HWC HAL के लिए रेफ़रंस इंप्लीमेंटेशन शामिल होता है.

टेस्ट करना

लागू किए गए बदलावों की जांच करने के लिए, VtsHalGraphicsComposer3_TargetTest चलाएं.