Hardware Composer HAL के लिए AIDL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    dimmingStage फ़ील्ड की मदद से, एचडब्ल्यूसी यह कॉन्फ़िगर कर सकता है कि RenderEngine को कॉन्टेंट को कब धुंधला करना चाहिए. इसमें, वेंडर के तय किए गए 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 चलाएं.