SurfaceFlinger থেকে পাওয়া কম্পোজিট লেয়ার, হার্ডওয়্যার কম্পোজার (HWC) HAL-এর মাধ্যমে কম্পোজিশন OpenGL ES (GLES) এবং GPU-এর পারফর্ম্যান্সের পরিমাণ কমায়।
HWC, সারফেস কম্পোজিট করার জন্য ওভারলে ও 2D ব্লিটারের মতো অবজেক্ট অ্যাবস্ট্র্যাক্ট করে এবং উইন্ডো কম্পোজিট করার জন্য বিশেষ উইন্ডো কম্পোজিশন হার্ডওয়্যারের সাথে যোগাযোগ করে। GPU-এর সাথে SurfaceFlinger কম্পোজিট করার পরিবর্তে উইন্ডো কম্পোজিট করার জন্য HWC ব্যবহার করুন। বেশিরভাগ GPU কম্পোজিশনের জন্য অপ্টিমাইজ করা হয় না এবং SurfaceFlinger থেকে GPU লেয়ার কম্পোজ করলে, অ্যাপগুলি তাদের নিজস্ব রেন্ডারিংয়ের জন্য GPU ব্যবহার করতে পারে না।
HWC ইমপ্লিমেন্টেশনে এগুলি কাজ করতে হবে:
- অন্তত চারটি ওভারলে:
- স্ট্যাটাস বার
- সিস্টেম বার
- অ্যাপ
- ওয়ালপেপার/ব্যাকগ্রাউন্ড
- ডিসপ্লের চেয়ে বড় লেয়ার (যেমন, ওয়ালপেপার)
- একই সাথে প্রি-মাল্টিপ্লাইড পার-পিক্সেল আলফা ব্লেন্ডিং এবং পার-প্লেন আলফা ব্লেন্ডিং
- সুরক্ষিত ভিডিও প্লেব্যাকের জন্য হার্ডওয়্যার পাথ
- RGBA প্যাকিং অর্ডার, YUV ফর্ম্যাট এবং টাইলিং, সুইজলিং ও স্ট্রাইড প্রপার্টি
HWC প্রয়োগ করতে:
- অপারেশনাল নয় এমন HWC প্রয়োগ করুন এবং সব কম্পোজিশন সংক্রান্ত কাজ GLES-এ পাঠান।
- HWC-তে কম্পোজিশন ইনক্রিমেন্টালভাবে ডেলিগেট করার জন্য অ্যালগরিদম প্রয়োগ করুন। যেমন, HWC-এর হার্ডওয়্যারে ওভারলে করার জন্য শুধুমাত্র প্রথম তিনটি বা চারটি সারফেস ডেলিগেট করুন ।
- HWC অপ্টিমাইজ করুন। এর মধ্যে থাকতে পারে:
- GPU থেকে লোড কমানোর জন্য সারফেস বেছে নেওয়া এবং সেগুলিকে HWC-তে পাঠানো।
- স্ক্রিন আপডেট হচ্ছে কিনা তা শনাক্ত করা হচ্ছে। তা না হলে, পাওয়ার সাশ্রয় করতে HWC-এর পরিবর্তে GLES-এ কম্পোজিশন ডেলিগেট করুন। স্ক্রিন আবার আপডেট হলে, HWC-তে কম্পোজিশন অফলোড করা চালিয়ে যান।
- এই ধরনের সাধারণ ব্যবহারের জন্য প্রস্তুতি নেওয়া:
- হোম স্ক্রিন, যার মধ্যে স্ট্যাটাস বার, সিস্টেম বার, অ্যাপ উইন্ডো ও লাইভ ওয়ালপেপার পড়ে
- পোর্ট্রেট ও ল্যান্ডস্কেপ মোডে ফুল-স্ক্রিন গেম
- ক্লোজড ক্যাপশন ও প্লেব্যাক কন্ট্রোল সহ ফুল-স্ক্রিন ভিডিও কন্ট্রোল
- সুরক্ষিত ভিডিও প্লেব্যাক
- স্প্লিট স্ক্রিন মাল্টিউইন্ডো
HWC প্রিমিটিভ
কম্পোজিশন সংক্রান্ত কাজ এবং ডিসপ্লে হার্ডওয়্যারের সাথে এর ইন্টার্যাকশন দেখানোর জন্য, HWC দুটি প্রিমিটিভ প্রদান করে, লেয়ার এবং ডিসপ্লে। এছাড়াও, HWC VSync-এর উপর কন্ট্রোল প্রদান করে এবং VSync ইভেন্ট ঘটলে SurfaceFlinger-কে জানানোর জন্য কলব্যাক করে।
HIDL ইন্টারফেস
Android 8.0 ও এর পরের যেকোনও ভার্সনে HWC ও SurfaceFlinger-এর মধ্যে
বাইন্ডারাইজড IPC-এর জন্য
HIDL ইন্টারফেস ব্যবহার করা হয়, যাকে Composer HAL বলা হয়। Composer HAL, পুরনো hwcomposer2.h ইন্টারফেসকে
প্রতিস্থাপন করে। যদি ভেন্ডর HWC-এর Composer HAL
ইমপ্লিমেন্টেশন প্রদান করে, তাহলে Composer HAL সরাসরি SurfaceFlinger-এর
থেকে HIDL কল গ্রহণ করে। ভেন্ডর HWC-এর লিগ্যাসি ইমপ্লিমেন্টেশন প্রদান করলে, Composer
HAL hwcomposer2.h থেকে ফাংশন পয়েন্টার লোড করে,
ফাংশন পয়েন্টার কলে HIDL কল ফরওয়ার্ড করে।
HWC, প্রদত্ত ডিসপ্লের প্রপার্টি নির্ধারণ করার জন্য ফাংশন প্রদান করে; বিভিন্ন ডিসপ্লে কনফিগারেশন (যেমন, 4k বা 1080p রেজোলিউশন) এবং কালার মোড (যেমন, নেটিভ কালার বা আসল sRGB)-এর মধ্যে পরিবর্তন করতে; এবং কাজ করলে ডিসপ্লে চালু, বন্ধ বা লো-পাওয়ার মোডে রাখতে।
ফাংশন পয়েন্টার
ভেন্ডর সরাসরি Composer HAL প্রয়োগ করলে, SurfaceFlinger, HIDL IPC-এর মাধ্যমে
এর ফাংশন কল করে। যেমন, একটি লেয়ার তৈরি করতে, SurfaceFlinger কম্পোজার HAL-এ
createLayer() কল করে।
ভেন্ডররা hwcomposer2.h ইন্টারফেস প্রয়োগ করলে, Composer HAL
hwcomposer2.h ফাংশন পয়েন্টারে কল করে। hwcomposer2.h কমেন্টে,
HWC ইন্টারফেস ফাংশনগুলি
lowerCamelCase নামের দ্বারা উল্লেখ করা হয় যা ইন্টারফেসে
নামযুক্ত ফিল্ড হিসাবে বিদ্যমান নেই। hwc2_device_t-এর মাধ্যমে প্রদান করা getFunction ব্যবহার করে ফাংশন পয়েন্টারের অনুরোধ করার মাধ্যমে প্রায় প্রতিটি ফাংশন লোড করা হয়। যেমন, createLayer ফাংশনটি হল HWC2_PFN_CREATE_LAYER টাইপের একটি ফাংশন পয়েন্টার, যা
এনুমারেটেড ভ্যালু HWC2_FUNCTION_CREATE_LAYER, getFunction-এ
পাস করা হলে রিটার্ন করা হয়।
Composer HAL ফাংশন এবং HWC ফাংশন পাসথ্রু
ফাংশন সম্পর্কিত বিস্তারিত ডকুমেন্টেশনের জন্য, composer দেখুন। HWC ফাংশন পয়েন্টার সম্পর্কে বিস্তারিত ডকুমেন্টেশনের জন্য, hwcomposer2.h দেখুন।
লেয়ার ও ডিসপ্লে হ্যান্ডেল
HWC-এর মাধ্যমে জেনারেট করা হ্যান্ডেল ব্যবহার করে লেয়ার ও ডিসপ্লে ম্যানিপুলেট করা হয়। SurfaceFlinger-এর কাছে হ্যান্ডেলগুলি অস্বচ্ছ।
SurfaceFlinger নতুন লেয়ার তৈরি করলে, এটি createLayer কল করে,
যা সরাসরি প্রয়োগের জন্য Layer ধরনের
বা পাসথ্রু প্রয়োগের জন্য hwc2_layer_t ধরনের রিটার্ন করে। SurfaceFlinger
যখন সেই লেয়ারের কোনও প্রপার্টি পরিবর্তন করে, তখন SurfaceFlinger
পরিবর্তন করার জন্য প্রয়োজনীয় অন্য যেকোনও তথ্যের সাথে
hwc2_layer_t ভ্যালু উপযুক্ত পরিবর্তন ফাংশনে পাস করে। hwc2_layer_t
টাইপটি এত বড় যে এতে একটি পয়েন্টার বা একটি
ইনডেক্স রাখা যায়।
হটপ্লাগ করার মাধ্যমে ফিজিক্যাল ডিসপ্লে তৈরি করা হয়। কোনও ফিজিক্যাল ডিসপ্লে
হটপ্লাগ করা হলে, HWC একটি হ্যান্ডেল তৈরি করে এবং হটপ্লাগ কলব্যাকের মাধ্যমে
SurfaceFlinger-এ হ্যান্ডেলটি পাস করে। SurfaceFlinger-এর মাধ্যমে ভার্চুয়াল ডিসপ্লে তৈরি করা হয়
যা ডিসপ্লের জন্য অনুরোধ করতে createVirtualDisplay()-কে কল করে। HWC
ভার্চুয়াল ডিসপ্লে কম্পোজিশন সাপোর্ট করলে, এটি একটি হ্যান্ডেল রিটার্ন করে। তারপরে, SurfaceFlinger
ডিসপ্লের কম্পোজিশন HWC-কে ডেলিগেট করে। HWC ভার্চুয়াল
ডিসপ্লে কম্পোজিশন সাপোর্ট না করলে, SurfaceFlinger হ্যান্ডেল তৈরি করে এবং ডিসপ্লে কম্পোজিট করে।
ডিসপ্লে কম্পোজিশন অপারেশন
প্রতি VSync-এ, SurfaceFlinger কম্পোজ করার জন্য নতুন কন্টেন্ট থাকলে জাগে। এইসব নতুন কন্টেন্ট অ্যাপ থেকে পাওয়া নতুন ইমেজ বাফার অথবা এক বা একাধিক লেয়ারের প্রপার্টিতে হওয়া পরিবর্তন হতে পারে। SurfaceFlinger এটি চালু করলে:
- উপস্থিত থাকলে ট্রানজ্যাকশন ম্যানেজ করে।
- উপস্থিত থাকলে নতুন গ্রাফিক বাফার ল্যাচ করে।
- ধাপ ১ বা ২-এর ফলে ডিসপ্লে কন্টেন্টে পরিবর্তন হলে, নতুন কম্পোজিশন পারফর্ম করে।
নতুন কম্পোজিশন পারফর্ম করতে, SurfaceFlinger প্রযোজ্য হলে, লেয়ার তৈরি ও ধ্বংস করে অথবা লেয়ারের স্ট্যাটাস পরিবর্তন করে। এছাড়াও, এটি
setLayerBuffer বা setLayerColor-এর মতো কল ব্যবহার করে
লেয়ারগুলিকে তাদের বর্তমান কন্টেন্ট দিয়ে আপডেট করে। সব লেয়ার আপডেট
হয়ে যাওয়ার পরে, SurfaceFlinger validateDisplay কল করে, যা HWC-কে
লেয়ারের অবস্থা পরীক্ষা করতে এবং কম্পোজিশন কীভাবে
এগিয়ে যাবে তা নির্ধারণ করতে বলে। ডিফল্ট হিসেবে, SurfaceFlinger প্রতিটি লেয়ার কনফিগার করার চেষ্টা করে
যাতে লেয়ারটি HWC-এর মাধ্যমে কম্পোজিট করা হয়; যদিও কিছু
পরিস্থিতিতে, SurfaceFlinger জিপিইউ ফলব্যাকের মাধ্যমে লেয়ার কম্পোজিট করে।
validateDisplay-এ কল করার পরে, SurfaceFlinger
getChangedCompositionTypes-এ কল করে দেখে যে HWC
কম্পোজিশন করার আগে কোনও লেয়ার কম্পোজিশনের ধরন পরিবর্তন করতে চায় কিনা। পরিবর্তন স্বীকার করতে, SurfaceFlinger কল করে
acceptDisplayChanges।
SurfaceFlinger কম্পোজিশনের জন্য কোনও লেয়ার চিহ্নিত করা থাকলে, SurfaceFlinger
সেগুলিকে টার্গেট বাফারে কম্পোজিট করে। তারপরে SurfaceFlinger, ডিসপ্লেতে বাফার দেওয়ার জন্য
setClientTarget কল করে, যাতে
বাফারটি স্ক্রিনে দেখানো যায় বা SurfaceFlinger কম্পোজিশনের জন্য চিহ্নিত করা হয়নি এমন লেয়ারের সাথে
আরও কম্পোজিট করা যায়। SurfaceFlinger কম্পোজিশনের জন্য কোনও লেয়ার চিহ্নিত করা না থাকলে, SurfaceFlinger কম্পোজিশন ধাপ বাইপাস করে।
সবশেষে, SurfaceFlinger presentDisplay-কে কল করে
HWC-কে কম্পোজিশন প্রসেস সম্পূর্ণ করতে এবং চূড়ান্ত ফলাফল দেখাতে বলে।
একাধিক ডিসপ্লে
Android 10 একাধিক ফিজিক্যাল ডিসপ্লেতে কাজ করে। Android 7.0 এবং তার পরবর্তী ভার্সনে ব্যবহারের জন্য HWC ইমপ্লিমেন্টেশন ডিজাইন করার সময়, HWC সংজ্ঞায় কিছু বিধিনিষেধ থাকে না:
- এটি ধরে নেওয়া হয় যে ঠিক একটি ইন্টার্নাল ডিসপ্লে আছে। ইন্টার্নাল ডিসপ্লে হল সেই ডিসপ্লে যা বুট করার সময় প্রাথমিক হটপ্লাগ রিপোর্ট করে। ইন্টার্নাল ডিসপ্লে হটপ্লাগ করার পরে, এটি ডিসকানেক্ট করা যাবে না।
- ইন্টার্নাল ডিসপ্লে ছাড়াও, ডিভাইস স্বাভাবিকভাবে কাজ করার সময়
যেকোনও সংখ্যক এক্সটার্নাল ডিসপ্লে হটপ্লাগ করা যেতে পারে। ফ্রেমওয়ার্ক ধরে নেয় যে প্রথম ইন্টার্নাল ডিসপ্লের পরে সব
হটপ্লাগ হল এক্সটার্নাল ডিসপ্লে, তাই আরও
ইন্টার্নাল ডিসপ্লে যোগ করা হলে, সেগুলিকে ভুলভাবে
Display.TYPE_BUILT_IN-এর পরিবর্তেDisplay.TYPE_HDMIহিসেবে ক্যাটেগরাইজ করা হয়।
উপরে বর্ণিত SurfaceFlinger অপারেশনগুলি প্রতিটি ডিসপ্লের জন্য করা হলেও, সেগুলি সব অ্যাক্টিভ ডিসপ্লের জন্য ক্রমশ করা হয়, এমনকি যদি শুধুমাত্র একটি ডিসপ্লের কন্টেন্ট আপডেট করা হয়।
যেমন, এক্সটার্নাল ডিসপ্লে আপডেট করা হলে, ক্রম হল:
// In Android 9 and lower: // Update state for internal display // Update state for external display validateDisplay(<internal display>) validateDisplay(<external display>) presentDisplay(<internal display>) presentDisplay(<external display>) // In Android 10 and higher: // Update state for internal display // Update state for external display validateInternal(<internal display>) presentInternal(<internal display>) validateExternal(<external display>) presentExternal(<external display>)
ভার্চুয়াল ডিসপ্লে কম্পোজিশন
ভার্চুয়াল ডিসপ্লে কম্পোজিশন, এক্সটার্নাল ডিসপ্লে কম্পোজিশনের মতো। ভার্চুয়াল ডিসপ্লে কম্পোজিশন ও ফিজিক্যাল ডিসপ্লে কম্পোজিশনের মধ্যে পার্থক্য হল, ভার্চুয়াল ডিসপ্লে স্ক্রিনে আউটপুট না পাঠিয়ে Gralloc বাফারে পাঠায়। Hardware Composer (HWC) আউটপুটকে একটি বাফারে লেখে, সম্পূর্ণতা সংক্রান্ত বেড়া প্রদান করে এবং বাফারটি কোনও কনজিউমারকে (যেমন, ভিডিও এনকোডার, GPU, CPU ইত্যাদি) পাঠায়। ডিসপ্লে পাইপলাইন মেমরিতে লিখলে ভার্চুয়াল ডিসপ্লে 2D/ব্লিটার বা ওভারলে ব্যবহার করতে পারে।
মোড
SurfaceFlinger
validateDisplay() HWC মেথড কল করার পরে প্রতিটি ফ্রেম তিনটি মোডের মধ্যে একটিতে থাকে:
- GLES — GPU সব লেয়ার কম্পোজিট করে, আউটপুট বাফারে সরাসরি লেখে। কম্পোজিশনে HWC অন্তর্ভুক্ত নয়।
- মিক্সড — GPU কিছু লেয়ার ফ্রেমবাফারে কম্পোজিট করে এবং HWC ফ্রেমবাফার ও বাকি লেয়ার কম্পোজিট করে, সরাসরি আউটপুট বাফারে লেখে।
- HWC — HWC সব লেয়ার কম্পোজিট করে এবং সরাসরি আউটপুট বাফারে লিখে দেয়।
আউটপুট ফর্ম্যাট
ভার্চুয়াল ডিসপ্লে বাফার আউটপুট ফর্ম্যাট তার মোডের উপর নির্ভর করে:
- GLES মোড — EGL ড্রাইভার
dequeueBuffer()-এ আউটপুট বাফার ফর্ম্যাট সেট করে, সাধারণতRGBA_8888। ড্রাইভার যে আউটপুট ফর্ম্যাট সেট করে তা গ্রাহককে গ্রহণ করতে হবে অথবা বাফার রিড করা যাবে না। - মিক্সড এবং HWC মোড — কনজিউমারের CPU অ্যাক্সেস প্রয়োজন হলে, কনজিউমার ফর্ম্যাট সেট করে। অন্যথায়, ফর্ম্যাট হল
IMPLEMENTATION_DEFINEDএবং Gralloc ব্যবহারের ফ্ল্যাগের উপর ভিত্তি করে সেরা ফর্ম্যাট সেট করে। যেমন, কনজিউমার যদি ভিডিও এনকোডার হয় এবং HWC যদি ফর্ম্যাটটি দক্ষতার সাথে লিখতে পারে, তাহলে Gralloc একটি YCbCr ফর্ম্যাট সেট করে।
সিঙ্ক্রোনাইজেশন ফেন্স
সিঙ্ক্রোনাইজেশন (সিঙ্ক) ফেন্স হল Android গ্রাফিক্স সিস্টেমের একটি গুরুত্বপূর্ণ দিক। ফেন্সের সাহায্যে CPU, কনকারেন্ট GPU ওয়ার্ক থেকে আলাদাভাবে কাজ করতে পারে, শুধুমাত্র সত্যিকারের নির্ভরতা থাকলে তবেই ব্লক করা হয়।
যেমন, কোনও অ্যাপ GPU-তে তৈরি হওয়া বাফার জমা দেওয়ার সময় সিঙ্ক ফেন্স অবজেক্টও জমা দেয়। GPU বাফারে লেখা শেষ করলে এই ফেন্স সিগন্যাল দেয়।
HWC-এর প্রয়োজন হল, বাফার দেখানোর আগে GPU যেন বাফার লেখা শেষ করে। সিঙ্ক ফেন্স, বাফার সহ গ্রাফিক্স পাইপলাইনের মাধ্যমে পাস করা হয় এবং বাফার লেখা হলে সিগন্যাল দেয়। বাফার দেখানোর আগে, HWC সিঙ্ক ফেন্স সিগন্যাল করেছে কিনা তা চেক করে এবং যদি করে থাকে, তাহলে এটি বাফার দেখায়।
সিঙ্ক ফেন্স সম্পর্কে আরও জানতে হার্ডওয়্যার কম্পোজার ইন্টিগ্রেশন দেখুন।