AIDL for Hardware Composer HAL

از اندروید ۱۳ به بعد، HAL مربوط به Hardware Composer (HWC) در AIDL تعریف شده است. نسخه‌های HIDL از android.hardware.graphics.composer@2.1 تا android.hardware.graphics.composer@2.4 منسوخ شده‌اند.

این صفحه تفاوت‌های بین HALهای AIDL و HIDL برای HWC و نحوه پیاده‌سازی و آزمایش AIDL HAL را شرح می‌دهد.

از آنجا که AIDL مزایایی ارائه می‌دهد، فروشندگان می‌توانند HAL آهنگساز AIDL را از اندروید ۱۳ به جای نسخه HIDL پیاده‌سازی کنند. برای اطلاعات بیشتر، به بخش پیاده‌سازی مراجعه کنید.

تفاوت‌های بین AIDL و HIDL HAL

رابط برنامه‌نویسی AIDL جدید HAL با نام android.hardware.graphics.composer3 در IComposer.aidl تعریف شده است. این API مشابه HIDL HAL android.hardware.graphics.composer@2.4 است، اما شامل تغییرات زیر است:

  • حذف صف پیام سریع (FMQ) به نفع دستورات قابل تقسیم.

    AIDL HAL رابط فرمان را بر اساس انواع بسته‌بندی‌شده با نوع قوی به جای دستورات سریالی شده روی FMQ در HIDL تعریف می‌کند. این یک رابط پایدار برای دستورات و تعریف خواناتر از نحوه تفسیر بار داده فرمان توسط سیستم فراهم می‌کند.

    متد executeCommands 5 در IComposerClient.aidl تعریف شده است:

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

    هر دستور یک نوع parcelable با نوع قوی است که در DisplayCommand.aidl تعریف شده است. پاسخ‌های دستور نیز parcelableهای با نوع قوی هستند که در CommandResultPayload.aidl تعریف شده‌اند.

  • حذف IComposerClient.getClientTargetSupport زیرا هیچ کلاینت فعالی از این متد استفاده نمی‌کند.

  • نمایش رنگ‌ها به صورت اعشاری به جای بایت برای هم‌ترازی با پشته گرافیکی بالایی در اندروید، همانطور که توسط ASurfaceTransaction_setColor تعریف شده است.

  • اضافه شدن فیلدهای جدید برای کنترل محتوای HDR.

    در AIDL HAL، پشته‌های لایه ترکیبی SDR/HDR از کم‌نور شدن یکپارچه لایه‌های SDR هنگامی که یک لایه HDR همزمان روی صفحه نمایش است، پشتیبانی می‌کنند.

    فیلد brightness در LayerCommand به SurfaceFlinger اجازه می‌دهد تا روشنایی هر لایه را مشخص کند. این امر HWC را قادر می‌سازد تا محتوای لایه را به جای فضای گاما، در فضای نور خطی کم‌نور کند.

    فیلد brightness در ClientTargetPropertyWithBrightness به HWC اجازه می‌دهد تا فضای روشنایی را برای ترکیب کلاینت مشخص کند و به RenderEngine دستور می‌دهد که آیا لایه‌های SDR را در ترکیب کلاینت کم‌نور کند یا خیر.

    فیلد dimmingStage به HWC اجازه می‌دهد تا زمانی که RenderEngine محتوا را کم‌نور می‌کند، آن را پیکربندی کند. این فیلد، ColorModes تعریف‌شده توسط فروشنده را که ممکن است ترجیح دهند در فضای گاما کم‌نور شوند تا بهبودهای کنتراست تعریف‌شده توسط فروشنده را در خطوط رنگی خود فعال کنند، در بر می‌گیرد.

  • اضافه شدن یک نوع ترکیب، DISPLAY_DECORATION ، در Composition.aidl برای تزئینات صفحه نمایش.

    برخی از دستگاه‌ها سخت‌افزار اختصاصی برای بهینه‌سازی ترسیم ماسک آلفا دارند که گوشه‌های گرد و بریدگی‌های روی نمایشگرها را صاف می‌کند. دستگاه‌هایی با چنین سخت‌افزاری باید IComposerClient.getDisplayDecorationSupport را پیاده‌سازی کنند و یک ساختار DisplayDecorationSupport را مطابق تعریف شده در DisplayDecorationSupport.aidl برگردانند. این ساختار enumهای PixelFormat و AlphaInterpretation مورد نیاز دستگاه را توصیف می‌کند. پس از این پیاده‌سازی، رابط کاربری سیستم، لایه ماسک آلفا را به عنوان DISPLAY_DECORATION علامت‌گذاری می‌کند، یک نوع ترکیب که از سخت‌افزار اختصاصی بهره می‌برد.

  • افزودن فیلد expectedPresentTime به DisplayCommand.aidl .

    فیلد expectedPresentTime به SurfaceFlinger اجازه می‌دهد تا زمان حال مورد انتظار برای نمایش محتوای فعلی روی صفحه را تنظیم کند. با این ویژگی، SurfaceFlinger یک دستور حال را از قبل به پیاده‌سازی ارسال می‌کند که به آن اجازه می‌دهد تا کارهای بیشتری از ترکیب‌بندی را به صورت پایپ‌لاین انجام دهد.

  • اضافه شدن API های جدید برای کنترل پیکربندی نمایش بوت.

    با استفاده از BOOT_DISPLAY_CONFIG ، فروشندگان می‌توانند مشخص کنند که پیکربندی نمایش بوت پشتیبانی می‌شود. متدهای setBootDisplayConfig ، clearBootDisplayConfig و getPreferredBootDisplayConfig از BOOT_DISPLAY_CONFIG به شرح زیر استفاده می‌کنند:

    • با استفاده از setBootDisplayConfig ، این چارچوب، پیکربندی نمایش زمان بوت را به فروشندگان اطلاع می‌دهد. فروشندگان باید پیکربندی نمایش بوت را در حافظه پنهان (cache) ذخیره کنند و در راه‌اندازی مجدد بعدی، این پیکربندی را بوت کنند. اگر دستگاه قادر به بوت شدن در این پیکربندی نباشد، فروشنده باید پیکربندی‌ای پیدا کند که با وضوح و نرخ به‌روزرسانی این پیکربندی مطابقت داشته باشد. اگر چنین پیکربندی وجود نداشته باشد، فروشنده باید از پیکربندی نمایش ترجیحی خود استفاده کند.

    • این چارچوب با استفاده از clearBootDisplayConfig به فروشندگان اطلاع می‌دهد که پیکربندی نمایش بوت را پاک کنند و در راه‌اندازی مجدد بعدی، پیکربندی نمایش دلخواه خود را بوت کنند.

    • با استفاده از getPreferredBootDisplayConfig ، این فریم‌ورک حالت بوت ترجیحی فروشنده را جستجو می‌کند.

    وقتی پیکربندی نمایش بوت پشتیبانی نشود، این متدها مقدار UNSUPPORTED را برمی‌گردانند.

  • اضافه شدن API های جدید برای کنترل تایمر خاموشی صفحه نمایش:

    • با استفاده از DISPLAY_IDLE_TIMER ، فروشندگان می‌توانند مشخص کنند که یک تایمر عدم فعالیت توسط فروشنده برای این نمایشگر پیاده‌سازی شده است. در حالت غیرفعال، این قابلیت نرخ تازه‌سازی را برای صرفه‌جویی در مصرف انرژی به تنظیمات پایین‌تری تغییر می‌دهد. این پلتفرم از setIdleTimerEnabled برای کنترل زمان انقضای تایمر و در برخی موارد، برای غیرفعال کردن آن به منظور جلوگیری از تغییر ناخواسته نرخ تازه‌سازی در حالت غیرفعال استفاده می‌کند.

    • استفاده از فراخوانی IComposerCallback.onVsyncIdle به پلتفرم نشان می‌دهد که نمایشگر در حالت غیرفعال است و آهنگ vsync تغییر کرده است. پلتفرم با تنظیم مجدد مدل vsync خود به این فراخوانی پاسخ می‌دهد. این فراخوانی، همگام‌سازی مجدد vsync را در فریم بعدی اعمال می‌کند و آهنگ vsync جدید را یاد می‌گیرد.

پیاده‌سازی

فروشندگان ملزم به پیاده‌سازی AIDL HAL برای اندروید ۱۳ نیستند. با این حال، به فروشندگان توصیه می‌شود که به جای نسخه HIDL ، AIDL composer HAL را پیاده‌سازی کنند تا از قابلیت‌ها و APIهای AIDL composer HAL استفاده کنند.

شبیه‌سازهای اندروید شامل یک پیاده‌سازی مرجع برای AIDL HWC HAL هستند.

آزمایش

برای آزمایش پیاده‌سازی خود، VtsHalGraphicsComposer3_TargetTest را اجرا کنید.