হার্ডওয়্যার কম্পোজার HAL বাস্তবায়ন করুন

সারফেসফ্লিংগার থেকে প্রাপ্ত হার্ডওয়্যার কম্পোজার (HWC) HAL কম্পোজিট স্তরগুলি, OpenGL ES (GLES) এবং GPU-এর কার্য সম্পাদনের পরিমাণ হ্রাস করে।

HWC ওভারলে এবং 2D ব্লিটারের মতো বস্তুগুলিকে কম্পোজিট সারফেসে অ্যাবস্ট্রাক্ট করে এবং কম্পোজিট উইন্ডোতে বিশেষায়িত উইন্ডো কম্পোজিশন হার্ডওয়্যারের সাথে যোগাযোগ করে। GPU-এর সাথে SurfaceFlinger কম্পোজিট রাখার পরিবর্তে HWC ব্যবহার করে উইন্ডোজ কম্পোজিট করুন। বেশিরভাগ GPU কম্পোজিশনের জন্য অপ্টিমাইজ করা হয় না এবং যখন GPU SurfaceFlinger থেকে স্তর তৈরি করে, তখন অ্যাপগুলি তাদের নিজস্ব রেন্ডারিংয়ের জন্য GPU ব্যবহার করতে পারে না।

HWC বাস্তবায়ন অবশ্যই সমর্থন করবে:

  • কমপক্ষে চারটি ওভারলে:
    • স্ট্যাটাস বার
    • সিস্টেম বার
    • অ্যাপ
    • ওয়ালপেপার/পটভূমি
  • ডিসপ্লের চেয়ে বড় স্তর (উদাহরণস্বরূপ, একটি ওয়ালপেপার)
  • একযোগে প্রি-মাল্টিপ্লাইডেড পার-পিক্সেল আলফা ব্লেন্ডিং এবং পার-প্লেন আলফা ব্লেন্ডিং
  • সুরক্ষিত ভিডিও প্লেব্যাকের জন্য হার্ডওয়্যার পাথ
  • RGBA প্যাকিং অর্ডার, YUV ফর্ম্যাট এবং টাইলিং, সুইজলিং এবং স্ট্রাইড বৈশিষ্ট্য

HWC বাস্তবায়নের জন্য:

  1. একটি অ-কার্যকর HWC বাস্তবায়ন করুন এবং সমস্ত রচনা কাজ GLES-এ পাঠান।
  2. HWC-তে ক্রমবর্ধমানভাবে রচনা অর্পণ করার জন্য একটি অ্যালগরিদম বাস্তবায়ন করুন। উদাহরণস্বরূপ, HWC-এর ওভারলে হার্ডওয়্যারে কেবল প্রথম তিন বা চারটি পৃষ্ঠ অর্পণ করুন।
  3. HWC অপ্টিমাইজ করুন। এর মধ্যে অন্তর্ভুক্ত থাকতে পারে:
    • GPU থেকে লোড সর্বাধিক করে এমন পৃষ্ঠতল নির্বাচন করা এবং সেগুলিকে HWC-তে পাঠানো।
    • স্ক্রিনটি আপডেট হচ্ছে কিনা তা সনাক্ত করা। যদি তা না হয়, তাহলে বিদ্যুৎ সাশ্রয় করার জন্য HWC-এর পরিবর্তে GLES-কে কম্পোজিশন অর্পণ করুন। স্ক্রিনটি আবার আপডেট হলে, HWC-তে কম্পোজিশন অফলোড করা চালিয়ে যান।
    • সাধারণ ব্যবহারের ক্ষেত্রে প্রস্তুতি নেওয়া যেমন:
      • হোম স্ক্রিন, যার মধ্যে স্ট্যাটাস বার, সিস্টেম বার, অ্যাপ উইন্ডো এবং লাইভ ওয়ালপেপার রয়েছে
      • পোর্ট্রেট এবং ল্যান্ডস্কেপ মোডে পূর্ণ-স্ক্রিন গেম
      • ক্লোজড ক্যাপশনিং এবং প্লেব্যাক নিয়ন্ত্রণ সহ পূর্ণ-স্ক্রিন ভিডিও
      • সুরক্ষিত ভিডিও প্লেব্যাক
      • স্প্লিট-স্ক্রিন মাল্টিউইন্ডো

HWC আদিম

HWC দুটি আদিম উপাদান, স্তর এবং প্রদর্শন প্রদান করে, যা কম্পোজিশনের কাজ এবং ডিসপ্লে হার্ডওয়্যারের সাথে এর মিথস্ক্রিয়া উপস্থাপন করে। HWC VSync এর উপর নিয়ন্ত্রণ এবং VSync ইভেন্ট ঘটলে সারফেসফ্লিংগারকে অবহিত করার জন্য একটি কলব্যাকও প্রদান করে।

HIDL ইন্টারফেস

Android 8.0 এবং উচ্চতর সংস্করণগুলি HWC এবং SurfaceFlinger এর মধ্যে বাইন্ডারাইজড IPC এর জন্য Composer HAL নামক একটি HIDL ইন্টারফেস ব্যবহার করে। Composer HAL লিগ্যাসি hwcomposer2.h ইন্টারফেস প্রতিস্থাপন করে। যদি বিক্রেতারা HWC এর একটি Composer HAL বাস্তবায়ন প্রদান করে, তাহলে Composer HAL সরাসরি SurfaceFlinger থেকে HIDL কল গ্রহণ করে। যদি বিক্রেতারা HWC এর একটি লিগ্যাসি বাস্তবায়ন প্রদান করে, তাহলে Composer HAL hwcomposer2.h থেকে ফাংশন পয়েন্টার লোড করে, HIDL কলগুলিকে ফাংশন পয়েন্টার কলগুলিতে ফরোয়ার্ড করে।

HWC একটি নির্দিষ্ট ডিসপ্লের বৈশিষ্ট্য নির্ধারণের জন্য ফাংশন প্রদান করে; বিভিন্ন ডিসপ্লে কনফিগারেশন (যেমন 4k বা 1080p রেজোলিউশন) এবং রঙ মোড (যেমন নেটিভ রঙ বা সত্যিকারের sRGB) এর মধ্যে স্যুইচ করতে; এবং সমর্থিত হলে ডিসপ্লে চালু, বন্ধ, অথবা কম-পাওয়ার মোডে পরিণত করতে।

ফাংশন পয়েন্টার

যদি বিক্রেতারা সরাসরি কম্পোজার HAL প্রয়োগ করে, তাহলে SurfaceFlinger HIDL IPC এর মাধ্যমে তার ফাংশন কল করে। উদাহরণস্বরূপ, একটি স্তর তৈরি করতে, SurfaceFlinger কম্পোজার HAL-এ createLayer() কল করে।

যদি বিক্রেতারা hwcomposer2.h ইন্টারফেসটি বাস্তবায়ন করে, তাহলে কম্পোজার HAL hwcomposer2.h ফাংশন পয়েন্টারগুলিতে কল করে। hwcomposer2.h মন্তব্যে, HWC ইন্টারফেস ফাংশনগুলিকে lowerCamelCase নাম দ্বারা উল্লেখ করা হয় যা ইন্টারফেসে নামযুক্ত ক্ষেত্র হিসাবে বিদ্যমান থাকে না। প্রায় প্রতিটি ফাংশন hwc2_device_t দ্বারা প্রদত্ত getFunction ব্যবহার করে একটি ফাংশন পয়েন্টার অনুরোধ করে লোড করা হয়। উদাহরণস্বরূপ, createLayer ফাংশনটি HWC2_PFN_CREATE_LAYER ধরণের একটি ফাংশন পয়েন্টার, যা গণনা করা মান HWC2_FUNCTION_CREATE_LAYER getFunction এ পাস করলে ফেরত পাঠানো হয়।

কম্পোজার 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 এটি জেগে ওঠে:

  1. যদি থাকে, তাহলে লেনদেন পরিচালনা করে।
  2. নতুন গ্রাফিক বাফার সংযুক্ত করে, যদি থাকে।
  3. যদি ধাপ ১ বা ২ এর ফলে প্রদর্শনের বিষয়বস্তুতে পরিবর্তন আসে, তাহলে একটি নতুন রচনা সম্পাদন করে।

একটি নতুন কম্পোজিশন সম্পাদনের জন্য, SurfaceFlinger লেয়ার তৈরি করে এবং ধ্বংস করে অথবা প্রযোজ্য স্তরের অবস্থা পরিবর্তন করে। এটি setLayerBuffer বা setLayerColor এর মতো কল ব্যবহার করে স্তরগুলিকে তাদের বর্তমান বিষয়বস্তু সহ আপডেট করে। সমস্ত স্তর আপডেট হওয়ার পরে, SurfaceFlinger validateDisplay কল করে, যা HWC কে লেয়ারগুলির অবস্থা পরীক্ষা করতে এবং রচনা কীভাবে এগিয়ে যাবে তা নির্ধারণ করতে বলে। ডিফল্টরূপে, SurfaceFlinger প্রতিটি স্তরকে এমনভাবে কনফিগার করার চেষ্টা করে যাতে স্তরটি HWC দ্বারা কম্পোজিট করা হয়; যদিও কিছু পরিস্থিতিতে, SurfaceFlinger GPU ফলব্যাকের মাধ্যমে স্তরগুলিকে কম্পোজিট করে।

validateDisplay কল করার পর, SurfaceFlinger getChangedCompositionTypes কল করে দেখতে যে HWC কম্পোজিশন সম্পাদন করার আগে কোনও লেয়ার কম্পোজিশন টাইপ পরিবর্তন করতে চায় কিনা। পরিবর্তনগুলি গ্রহণ করার জন্য, SurfaceFlinger acceptDisplayChanges কল করে।

যদি SurfaceFlinger কম্পোজিশনের জন্য কোন স্তর চিহ্নিত করা থাকে, তাহলে SurfaceFlinger সেগুলোকে টার্গেট বাফারে কম্পোজিট করে। SurfaceFlinger তারপর setClientTarget কল করে ডিসপ্লেতে বাফারটি দেয় যাতে বাফারটি স্ক্রিনে প্রদর্শিত হয় অথবা SurfaceFlinger কম্পোজিশনের জন্য চিহ্নিত না করা স্তরগুলির সাথে আরও কম্পোজিট করা যায়। যদি SurfaceFlinger কম্পোজিশনের জন্য কোন স্তর চিহ্নিত না থাকে, তাহলে SurfaceFlinger কম্পোজিশনের ধাপটি বাইপাস করে।

অবশেষে, SurfaceFlinger presentDisplay কল করে HWC কে কম্পোজিশন প্রক্রিয়াটি সম্পূর্ণ করতে এবং চূড়ান্ত ফলাফল প্রদর্শন করতে বলে।

একাধিক ডিসপ্লে

অ্যান্ড্রয়েড ১০ একাধিক ফিজিক্যাল ডিসপ্লে সমর্থন করে। অ্যান্ড্রয়েড ৭.০ এবং উচ্চতর সংস্করণে ব্যবহারের জন্য তৈরি 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>)

ভার্চুয়াল ডিসপ্লে কম্পোজিশন

ভার্চুয়াল ডিসপ্লে কম্পোজিশন বাহ্যিক ডিসপ্লে কম্পোজিশনের অনুরূপ। ভার্চুয়াল ডিসপ্লে কম্পোজিশন এবং ফিজিক্যাল ডিসপ্লে কম্পোজিশনের মধ্যে পার্থক্য হল ভার্চুয়াল ডিসপ্লেগুলি স্ক্রিনের পরিবর্তে গ্র্যালোক বাফারে আউটপুট পাঠায়। হার্ডওয়্যার কম্পোজার (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 ফর্ম্যাট সেট করে।

সিঙ্ক্রোনাইজেশন বেড়া

সিঙ্ক্রোনাইজেশন (সিঙ্ক) ফেন্সগুলি অ্যান্ড্রয়েড গ্রাফিক্স সিস্টেমের একটি গুরুত্বপূর্ণ দিক। ফেন্সগুলি সিপিইউকে সমসাময়িক জিপিইউ কাজ থেকে স্বাধীনভাবে কাজ করতে দেয়, শুধুমাত্র তখনই ব্লক করে যখন সত্যিকারের নির্ভরতা থাকে।

উদাহরণস্বরূপ, যখন কোনও অ্যাপ GPU-তে তৈরি একটি বাফার জমা দেয়, তখন এটি একটি সিঙ্ক ফেন্স অবজেক্টও জমা দেয়। এই ফেন্সটি সংকেত দেয় যখন GPU বাফারে লেখা শেষ করে।

HWC-এর জন্য বাফারগুলি প্রদর্শিত হওয়ার আগে GPU-কে বাফার লেখা শেষ করতে হবে। বাফারগুলি লেখার সময় বাফার এবং সিগন্যালের মাধ্যমে সিঙ্ক ফেন্সগুলি গ্রাফিক্স পাইপলাইনের মধ্য দিয়ে যায়। একটি বাফার প্রদর্শিত হওয়ার আগে, HWC পরীক্ষা করে যে সিঙ্ক ফেন্সটি সিগন্যাল করেছে কিনা, এবং যদি থাকে, তাহলে এটি বাফারটি প্রদর্শন করে।

সিঙ্ক বেড়া সম্পর্কে আরও তথ্যের জন্য হার্ডওয়্যার কম্পোজার ইন্টিগ্রেশন দেখুন।