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

হার্ডওয়্যার কম্পোজার (HWC) HAL কম্পোজিট স্তরগুলি SurfaceFlinger থেকে প্রাপ্ত, কম্পোজিশন 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 ইভেন্ট ঘটলে তা জানানোর জন্য SurfaceFlinger-কে একটি কলব্যাক প্রদান করে।

HIDL ইন্টারফেস

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

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

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

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

যদি বিক্রেতারা hwcomposer2.h ইন্টারফেস বাস্তবায়ন করে, তাহলে কম্পোজার এইচএএল hwcomposer2.h ফাংশন পয়েন্টারগুলিতে কল করে। hwcomposer2.h মন্তব্যে, HWC ইন্টারফেস ফাংশনগুলিকে নিম্ন ক্যামেলকেস নাম দ্বারা উল্লেখ করা হয় যেগুলি নামযুক্ত ক্ষেত্র হিসাবে ইন্টারফেসে বিদ্যমান নেই। 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-এ পাঠায়। ভার্চুয়াল ডিসপ্লে সারফেসফ্লিংগার দ্বারা তৈরি করা হয় একটি ডিসপ্লে অনুরোধ করার জন্য createVirtualDisplay() । যদি HWC ভার্চুয়াল ডিসপ্লে কম্পোজিশন সমর্থন করে তবে এটি একটি হ্যান্ডেল ফেরত দেয়। তারপর, SurfaceFlinger HWC-কে ডিসপ্লের কম্পোজিশন অর্পণ করে। যদি HWC ভার্চুয়াল ডিসপ্লে কম্পোজিশন সমর্থন না করে, SurfaceFlinger হ্যান্ডেল তৈরি করে এবং ডিসপ্লে কম্পোজিট করে।

ডিসপ্লে কম্পোজিশন অপারেশন

একবার VSYNC প্রতি, SurfaceFlinger জেগে ওঠে যদি এতে কম্পোজিট করার জন্য নতুন সামগ্রী থাকে। এই নতুন বিষয়বস্তু অ্যাপ থেকে নতুন ইমেজ বাফার বা এক বা একাধিক স্তরের বৈশিষ্ট্যে পরিবর্তন হতে পারে। যখন SurfaceFlinger এটি জাগিয়ে তোলে:

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

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

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

SurfaceFlinger রচনার জন্য কোনো স্তর চিহ্নিত করা থাকলে, SurfaceFlinger তাদের লক্ষ্য বাফারে সংমিশ্রণ করে। সারফেসফ্লিংগার তারপর setClientTarget ডিসপ্লেতে বাফার দেওয়ার জন্য কল করে যাতে বাফারটি স্ক্রিনে প্রদর্শিত হতে পারে বা সারফেসফ্লিংগার রচনার জন্য চিহ্নিত করা হয়নি এমন স্তরগুলির সাথে আরও সংমিশ্রিত হতে পারে। 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>)

ভার্চুয়াল প্রদর্শন রচনা

ভার্চুয়াল ডিসপ্লে কম্পোজিশন এক্সটার্নাল ডিসপ্লে কম্পোজিশনের মতো। ভার্চুয়াল ডিসপ্লে কম্পোজিশন এবং ফিজিক্যাল ডিসপ্লে কম্পোজিশনের মধ্যে পার্থক্য হল যে ভার্চুয়াল ডিসপ্লেগুলি স্ক্রিনের পরিবর্তে গ্র্যালক বাফারে আউটপুট পাঠায়। হার্ডওয়্যার কম্পোজার (HWC) একটি বাফারে আউটপুট লেখে, সমাপ্তির বেড়া প্রদান করে এবং বাফারটি একটি ভোক্তার কাছে পাঠায় (যেমন ভিডিও এনকোডার, GPU, CPU, ইত্যাদি)। ভার্চুয়াল ডিসপ্লে 2D/ব্লিটার বা ওভারলে ব্যবহার করতে পারে যদি ডিসপ্লে পাইপলাইন মেমরিতে লেখা হয়।

মোড

SurfaceFlinger validateDisplay() HWC পদ্ধতিতে কল করার পরে প্রতিটি ফ্রেম তিনটি মোডের একটিতে থাকে:

  • GLES — GPU সমস্ত স্তরকে সংমিশ্রণ করে, সরাসরি আউটপুট বাফারে লেখা। HWC রচনার সাথে জড়িত নয়।
  • মিক্সড — GPU ফ্রেমবাফারে কিছু লেয়ার কম্পোজ করে এবং HWC ফ্রেমবাফার এবং বাকি লেয়ারগুলিকে কম্পোজ করে, সরাসরি আউটপুট বাফারে লিখে।
  • HWC — HWC সমস্ত স্তর সংমিশ্রণ করে এবং সরাসরি আউটপুট বাফারে লেখে।

আউটপুট ফরমেট

ভার্চুয়াল ডিসপ্লে বাফার আউটপুট ফর্ম্যাটগুলি তাদের মোডের উপর নির্ভর করে:

  • GLES মোড — EGL ড্রাইভার আউটপুট বাফার বিন্যাস dequeueBuffer() এ সেট করে, সাধারণত RGBA_8888 । ভোক্তা অবশ্যই ড্রাইভার সেট করা আউটপুট বিন্যাস গ্রহণ করতে সক্ষম হবেন বা বাফার পড়া যাবে না।
  • মিক্সড এবং এইচডব্লিউসি মোড - যদি ভোক্তার সিপিইউ অ্যাক্সেসের প্রয়োজন হয়, ভোক্তা ফর্ম্যাট সেট করে। অন্যথায়, বিন্যাসটি হল IMPLEMENTATION_DEFINED , এবং Gralloc ব্যবহার ফ্ল্যাগের উপর ভিত্তি করে সেরা বিন্যাস সেট করে। উদাহরণস্বরূপ, Gralloc একটি YCbCr বিন্যাস সেট করে যদি গ্রাহক ভিডিও এনকোডার হয় এবং HWC দক্ষতার সাথে বিন্যাস লিখতে পারে।

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

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

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

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

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