হার্ডওয়্যার কম্পোজার HAL-এর জন্য AIDL

Android 13 থেকে শুরু করে, হার্ডওয়্যার কম্পোজার (HWC) HAL AIDL-এ সংজ্ঞায়িত করা হয়েছে। android.hardware.graphics.composer@2.1 থেকে android.hardware.graphics.composer@2.4 পর্যন্ত HIDL ভার্সন বন্ধ করা হয়েছে।

এই পৃষ্ঠায় HWC-এর জন্য AIDL ও HIDL HAL-এর মধ্যে পার্থক্য বর্ণনা করা হয়েছে, এবং কীভাবে AIDL HAL প্রয়োগ ও পরীক্ষা করতে হয় তা বলা হয়েছে।

AIDL সুবিধা অফার করে বলে, ভেন্ডররা HIDL ভার্সনের পরিবর্তে Android 13 থেকে শুরু করে AIDL কম্পোজার HAL প্রয়োগ করতে পারেন। আরও তথ্যের জন্য, প্রয়োগ করা বিভাগ দেখুন।

AIDL ও HIDL HAL-এর মধ্যে পার্থক্য

android.hardware.graphics.composer3 নামের নতুন AIDL কম্পোজার HAL, IComposer.aidl-এ সংজ্ঞায়িত করা হয়েছে। API-টি HIDL HAL android.hardware.graphics.composer@2.4-এর মতো, তবে এতে নিম্নলিখিত পরিবর্তনগুলি অন্তর্ভুক্ত রয়েছে:

  • পার্সেল করা যায় এমন কমান্ডের জন্য ফাস্ট মেসেজ কিউ (FMQ) সরিয়ে দেওয়া।

    AIDL HAL, HIDL-এ FMQ-এর মাধ্যমে সিরিয়ালাইজ করা কমান্ডের পরিবর্তে, স্ট্রং টাইপ করা পার্সেলেবল ধরনের উপর ভিত্তি করে কমান্ড ইন্টারফেসকে সংজ্ঞায়িত করে। এটি কমান্ডের জন্য একটি স্থিতিশীল ইন্টারফেস প্রদান করে এবং সিস্টেম কীভাবে কমান্ড পেলোড ব্যাখ্যা করে তার আরও সহজে পাঠযোগ্য সংজ্ঞা দেয়।

    executeCommands ৫ পদ্ধতিটি এখানে সংজ্ঞায়িত করা হয়েছে: IComposerClient.aidl:

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

    প্রতিটি কমান্ড হল একটি স্ট্রংলি টাইপ করা পার্সেলযোগ্য টাইপ যা DisplayCommand.aidl-এ সংজ্ঞায়িত করা হয়েছে। কমান্ডের উত্তরগুলি কঠোরভাবে টাইপ করা হয় CommandResultPayload.aidl-এ পার্সেলযোগ্য হিসেবে সংজ্ঞায়িত করা হয়।

  • IComposerClient.getClientTargetSupport সরিয়ে দেওয়া হয়েছে কারণ কোনও অ্যাক্টিভ ক্লায়েন্ট এই পদ্ধতি ব্যবহার করে না।

  • Android-এ উপরের গ্রাফিক্স স্ট্যাকের সাথে অ্যালাইন করার জন্য বাইটের পরিবর্তে ফ্লোট হিসেবে রঙের উপস্থাপনা, যা ASurfaceTransaction_setColor দ্বারা সংজ্ঞায়িত করা হয়েছে।

  • HDR কন্টেন্ট কন্ট্রোল করার জন্য নতুন ফিল্ড যোগ করা হয়েছে।

    AIDL HAL-এ, মিক্সড SDR/HDR লেয়ার স্ট্যাক, একই সময়ে স্ক্রিনে HDR লেয়ার থাকলে, SDR লেয়ারের সিমলেস ডিমিং কাজ করে।

    LayerCommand-এর মধ্যে থাকা brightness ফিল্ড SurfaceFlinger-কে প্রতি লেয়ার ব্রাইটনেস নির্দিষ্ট করতে দেয়। এটি HWC-কে গামা স্পেসের পরিবর্তে লিনিয়ার লাইট স্পেসে লেয়ারের কন্টেন্ট ডিম করার সুবিধা দেয়।

    ClientTargetPropertyWithBrightness-এর মধ্যে থাকা brightness ফিল্ড HWC-কে ক্লায়েন্ট কম্পোজিশনের উজ্জ্বলতা স্পেস নির্দিষ্ট করতে দেয় এবং ক্লায়েন্ট কম্পোজিশনে SDR লেয়ারের উজ্জ্বলতা কমানো হবে কিনা তা RenderEngine-এর মাধ্যমে নির্দেশ দেয়।

    dimmingStage ফিল্ড HWC-কে কনফিগার করতে দেয় যে কখন RenderEngine কন্টেন্ট ডিম করবে। এর ফলে ভেন্ডর-সংজ্ঞায়িত ColorModes যেসব কন্টেন্ট গামা স্পেসে ডিম করতে পছন্দ করে, সেগুলি ভেন্ডর-সংজ্ঞায়িত কনট্রাস্ট এনহ্যান্সমেন্ট চালু করতে পারে।

  • স্ক্রিন সাজানোর জন্য Composition.aidl-এ কম্পোজিশনের ধরন, DISPLAY_DECORATION, যোগ করা হয়েছে।

    কিছু ডিভাইসে আলফা মাস্কের ড্রয়িং অপ্টিমাইজ করার জন্য ডেডিকেটেড হার্ডওয়্যার থাকে, যা ডিসপ্লেতে গোলাকার কোণ ও কাটআউট মসৃণ করে। এই ধরনের হার্ডওয়্যার সহ ডিভাইসকে অবশ্যই IComposerClient.getDisplayDecorationSupport ইমপ্লিমেন্ট করতে হবে এবং DisplayDecorationSupport স্ট্রাকচার রিটার্ন করতে হবে, যা DisplayDecorationSupport.aidl-এ উল্লেখ করা আছে। এই স্ট্রাকচার ডিভাইসের জন্য প্রয়োজনীয় PixelFormat এবং AlphaInterpretation enum বর্ণনা করে। এই প্রয়োগের পরে, সিস্টেম UI, আলফা মাস্ক লেয়ারকে DISPLAY_DECORATION হিসেবে চিহ্নিত করে, এটি হল কম্পোজিশন টাইপ যা ডেডিকেটেড হার্ডওয়্যারের সুবিধা নেয়।

  • DisplayCommand.aidl-এ expectedPresentTime ফিল্ড যোগ করা হয়েছে।

    expectedPresentTime ফিল্ড SurfaceFlinger-কে বর্তমান কন্টেন্ট স্ক্রিনে দেখানোর জন্য প্রত্যাশিত সময় সেট করতে দেয়। এই ফিচারের সাহায্যে, SurfaceFlinger, ইমপ্লিমেন্টেশনকে নির্ধারিত সময়ের আগে একটি প্রেজেন্ট কমান্ড পাঠায়, যা এটিকে আরও বেশি কম্পোজিশন ওয়ার্ক পাইপলাইন করতে দেয়।

  • বুট ডিসপ্লে কনফিগারেশন কন্ট্রোল করার জন্য নতুন API যোগ করা হয়েছে।

    BOOT_DISPLAY_CONFIG ব্যবহার করে, ভেন্ডররা বুট ডিসপ্লে কনফিগারেশন সমর্থিত কিনা তা নির্দিষ্ট করতে পারেন। setBootDisplayConfig, clearBootDisplayConfig ও getPreferredBootDisplayConfig পদ্ধতি BOOT_DISPLAY_CONFIG-কে নিম্নলিখিতভাবে ব্যবহার করে:

    • setBootDisplayConfig ব্যবহার করে, ফ্রেমওয়ার্কটি ভেন্ডরদের বুট টাইম ডিসপ্লে কনফিগারেশন সম্পর্কে জানায়। ভেন্ডরদের অবশ্যই বুট ডিসপ্লে কনফিগারেশনে ক্যাশে করতে হবে এবং পরবর্তী রিবুটে এই কনফিগারেশনে বুট করতে হবে। ডিভাইসটি যদি এই কনফিগে বুট করতে না পারে, তাহলে ভেন্ডরকে অবশ্যই এমন একটি কনফিগ খুঁজে বের করতে হবে যা এই কনফিগের রেজোলিউশন এবং রিফ্রেশ রেটের সাথে মেলে। এই ধরনের কোনও কনফিগ না থাকলে, ভেন্ডরকে তার পছন্দের ডিসপ্লে কনফিগ ব্যবহার করতে হবে।

    • clearBootDisplayConfig ব্যবহার করে, ফ্রেমওয়ার্কটি বুট ডিসপ্লে কনফিগারেশন মুছে ফেলার জন্য ভেন্ডরদের জানায় এবং পরবর্তী রিবুটের সময় তাদের পছন্দের ডিসপ্লে কনফিগারেশনে বুট করে।

    • getPreferredBootDisplayConfig ব্যবহার করে, ফ্রেমওয়ার্কটি ভেন্ডরের পছন্দসই বুট মোড কোয়েরি করে।

    বুট ডিসপ্লে কনফিগারেশন কাজ না করলে, এই পদ্ধতিগুলি UNSUPPORTED-এর মান রিটার্ন করে।

  • ডিসপ্লে আইডল টাইমার কন্ট্রোল করার জন্য নতুন API যোগ করা:

    • DISPLAY_IDLE_TIMER ব্যবহার করে, ভেন্ডররা নির্দিষ্ট করতে পারেন যে এই ডিসপ্লের জন্য ভেন্ডর একটি ইনঅ্যাক্টিভিটি টাইমার প্রয়োগ করেছেন। ডিভাইস ব্যবহার না করা হলে, এই ক্ষমতা পাওয়ার বাঁচানোর জন্য রিফ্রেশ রেট কম সেটিংয়ে পরিবর্তন করে। টাইমারের টাইম-আউট নিয়ন্ত্রণ করতে এবং কিছু ক্ষেত্রে, অলস অবস্থায় অবাঞ্ছিত রিফ্রেশ রেট সুইচ প্রতিরোধ করার জন্য এটি বন্ধ করতে প্ল্যাটফর্মটি setIdleTimerEnabled ব্যবহার করে।

    • IComposerCallback.onVsyncIdle কলব্যাক ব্যবহার করে প্ল্যাটফর্মকে বোঝানো হয় যে ডিসপ্লেটি এখন অ্যাক্টিভ নেই এবং vsync ক্যাডেন্স পরিবর্তিত হয়েছে। প্ল্যাটফর্মটি এই কলব্যাককে তার vsync মডেল রিসেট করে উত্তর দেয়। এটি পরবর্তী ফ্রেমে vsync আবার সিঙ্ক করতে বাধ্য করে এবং নতুন vsync ক্যাডেন্স সম্পর্কে জানতে পারে।

প্রয়োগ

Android 13-এর জন্য ভেন্ডরদের AIDL HAL প্রয়োগ করার প্রয়োজন নেই। তবে, AIDL কম্পোজার HAL-এর ফাংশনালিটি ও API ব্যবহার করার জন্য HIDL ভার্সনের পরিবর্তে AIDL কম্পোজার HAL প্রয়োগ করার জন্য ভেন্ডরদের উৎসাহিত করা হয়।

Android এমুলেটরে AIDL HWC HAL-এর জন্য রেফারেন্স প্রয়োগ অন্তর্ভুক্ত থাকে।

পরীক্ষা করা

আপনার প্রয়োগ পরীক্ষা করতে, VtsHalGraphicsComposer3_TargetTest রান করুন।