Android 13 से, हार्डवेयर कंपोजर (HWC) एचएएल को AIDL में तय किया गया है. साथ ही, android.hardware.graphics.composer@2.1
से लेकर android.hardware.graphics.composer@2.4
तक के HIDL वर्शन का इस्तेमाल नहीं किया जा सकता.
इस पेज पर, एचडब्ल्यूसी के लिए AIDL और HIDL HAL के बीच के अंतर के बारे में बताया गया है. साथ ही, AIDL HAL को लागू करने और उसकी जांच करने के बारे में भी बताया गया है.
AIDL के फ़ायदों की वजह से, वेंडर को Android 13 से, HIDL वर्शन के बजाय AIDL कंपोजर HAL लागू करने का सुझाव दिया जाता है. ज़्यादा जानकारी के लिए, लागू करना सेक्शन देखें.
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
चलाएं.