Vulkan প্রয়োগ করা

Vulkan হল একটি লো-ওভারহেড, হাই-পারফর্ম্যান্স 3D গ্রাফিক্সের জন্য ক্রস-প্ল্যাটফর্ম API। OpenGL ES (GLES)-এর মতো, Vulkan অ্যাপে উচ্চ-কোয়ালিটি, রিয়েল-টাইম গ্রাফিক্স তৈরি করার টুল প্রদান করে। Vulkan ব্যবহার করার সুবিধার মধ্যে CPU ওভারহেড কমানো এবং SPIR-V বাইনারি ইন্টারমিডিয়েট ভাষার জন্য সহায়তা অন্তর্ভুক্ত।

Vulkan সঠিকভাবে প্রয়োগ করতে, ডিভাইসে এগুলি থাকতে হবে:

  • Android-এর দেওয়া Vulkan লোডার।
  • GPU IHV-এর মতো SoC-এর মাধ্যমে প্রদান করা Vulkan ড্রাইভার, যা Vulkan API প্রয়োগ করে। Vulkan ফাংশনালিটি কাজ করার জন্য, Android ডিভাইসে Vulkan-এর উপযুক্ত GPU হার্ডওয়্যার ও সংশ্লিষ্ট ড্রাইভার থাকতে হবে। GPU-কে অবশ্যই GLES 3.1 ও এর পরের যেকোনও ভার্সনে কাজ করতে হবে। ড্রাইভার সংক্রান্ত সহায়তার জন্য SoC ভেন্ডরের সাথে যোগাযোগ করুন।

কোনও ডিভাইসে Vulkan ড্রাইভার থাকলে, ডিভাইসটিকে FEATURE_VULKAN_HARDWARE_LEVEL এবং FEATURE_VULKAN_HARDWARE_VERSION সিস্টেম ফিচার ঘোষণা করতে হবে, যেগুলির ভার্সন ডিভাইসের ক্ষমতাকে সঠিকভাবে প্রতিফলিত করে। এটি নিশ্চিত করতে সাহায্য করে যে ডিভাইসটি কম্প্যাটিবিলিটি ডেফিনেশন ডকুমেন্ট (CDD) মেনে চলছে।

Vulkan লোডার

Vulkan লোডার platform/frameworks/native/vulkan হল Vulkan অ্যাপ এবং ডিভাইসের Vulkan ড্রাইভারের মধ্যে প্রাথমিক ইন্টারফেস। Vulkan লোডার /system/lib[64]/libvulkan.so-এ ইনস্টল করা আছে। লোডার মূল Vulkan API এন্ট্রি পয়েন্ট, Android CDD-এর প্রয়োজনীয় এক্সটেনশনের এন্ট্রি পয়েন্ট এবং অনেক অতিরিক্ত ঐচ্ছিক এক্সটেনশন প্রদান করে। উইন্ডো সিস্টেম ইন্টিগ্রেশন (WSI) এক্সটেনশন লোডার দ্বারা এক্সপোর্ট করা হয় এবং প্রধানত ড্রাইভারের পরিবর্তে লোডারে প্রয়োগ করা হয়। এছাড়াও, লোডার এমন লেয়ার গণনা ও লোড করতে পারে যা অতিরিক্ত এক্সটেনশন প্রকাশ করতে পারে এবং ড্রাইভারের কাছে যাওয়ার পথে কোর API কল ইন্টারসেপ্ট করতে পারে।

NDK-তে লিঙ্ক করার জন্য একটি স্টাব libvulkan.so লাইব্রেরি অন্তর্ভুক্ত থাকে। লাইব্রেরি লোডারের মতো একই প্রতীক এক্সপোর্ট করে। অ্যাপগুলি লোডারে ট্রাম্পোলিন ফাংশনগুলি প্রবেশ করতে আসল libvulkan.so লাইব্রেরি থেকে এক্সপোর্ট করা ফাংশনগুলিকে কল করে, যা তাদের প্রথম আর্গুমেন্টের উপর ভিত্তি করে উপযুক্ত লেয়ার বা ড্রাইভারের কাছে পাঠায়। vkGet*ProcAddr() কলটি ফাংশন পয়েন্টার রিটার্ন করে যেখান থেকে ট্র্যাম্পোলিন ডিসপ্যাচ করা হয় (অর্থাৎ, এটি সরাসরি কোর API কোডে কল করে)। এক্সপোর্ট করা চিহ্নের পরিবর্তে ফাংশন পয়েন্টারের মাধ্যমে কল করা আরও বেশি কার্যকর কারণ এটি ট্র্যাম্পোলিন ও ডিসপ্যাচ এড়িয়ে যায়।

ড্রাইভারের গণনা ও লোডিং

সিস্টেম ইমেজ তৈরি করা হলে, Android আশা করে যে সিস্টেমটি জানবে কোন কোন GPU উপলভ্য আছে। ড্রাইভার খুঁজে পেতে ও লোড করতে লোডার hardware.h বিদ্যমান HAL মেকানিজম ব্যবহার করে। ৩২-বিট ও ৬৪-বিট Vulkan ড্রাইভারের জন্য পছন্দসই পাথ হল:

/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so
/vendor/lib/hw/vulkan.<ro.board.platform>.so
/vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so
/vendor/lib64/hw/vulkan.<ro.board.platform>.so

Android 7.0 ও এর পরের যেকোনও ভার্সনে, Vulkan hw_module_t ডেরিভেটিভ একটি hw_module_t স্ট্রাক্ট র‍্যাপ করে; শুধুমাত্র একটি ড্রাইভার কাজ করে এবং কনস্ট্যান্ট স্ট্রিং HWVULKAN_DEVICE_0 open()-এ পাস করা হয়।

Vulkan hw_device_t ডেরিভেটিভ একটি ড্রাইভারের সাথে সম্পর্কিত যা একাধিক ফিজিক্যাল ডিভাইসকে সাপোর্ট করতে পারে। hw_device_t স্ট্রাকচারটি এক্সপোর্ট vkGetGlobalExtensionProperties(), vkCreateInstance() এবং vkGetInstanceProcAddr() ফাংশন পর্যন্ত বিস্তৃত হতে পারে। hw_device_t স্ট্রাকচারের vkGetInstanceProcAddr() কল করে লোডার অন্যান্য সব VkInstance(), VkPhysicalDevice() ও vkGetDeviceProcAddr() ফাংশন খুঁজে পেতে পারে।

Android 15 থেকে, Vulkan ড্রাইভার লোড করার জন্য লোডার APEX-কে সাপোর্ট করে। APEX থেকে Vulkan লোড করতে, Vulkan APEX-এর নাম ro.vulkan.apex হিসেবে সেট করুন।

লেয়ার খুঁজে দেখা ও লোড করা

Vulkan লোডার, অতিরিক্ত এক্সটেনশন প্রকাশ করতে পারে এবং ড্রাইভারের কাছে যাওয়ার পথে কোর API কল ইন্টারসেপ্ট করতে পারে এমন লেয়ার গণনা ও লোড করার ক্ষেত্রে সহায়তা করে। অ্যাপ তার APK-তে লেয়ার অন্তর্ভুক্ত করতে পারে। Android-এ সিস্টেম ইমেজের উপর লেয়ার থাকে না।

লেয়ার ব্যবহার করার সময় মনে রাখবেন যে Android-এর নিরাপত্তা মডেল ও নীতি অন্যান্য প্ল্যাটফর্মের থেকে আলাদা। বিশেষ করে, Android প্রোডাকশন (নন-রুটেড) ডিভাইসে ডিবাগ করা যায় না এমন প্রসেসে এক্সটার্নাল কোড লোড করার অনুমতি দেয় না, পাশাপাশি এটি প্রসেসের মেমরি, স্টেট ইত্যাদি পরিদর্শন বা নিয়ন্ত্রণ করার জন্য এক্সটার্নাল কোডকেও অনুমতি দেয় না। এর মধ্যে পরে পরীক্ষা করার জন্য ডিস্কে কোর ডাম্প, API ট্রেস ইত্যাদি সেভ করার উপর নিষেধাজ্ঞা অন্তর্ভুক্ত। শুধুমাত্র ডিবাগ করা যায় না এমন অ্যাপের অংশ হিসেবে ডেলিভার করা লেয়ার প্রোডাকশন ডিভাইসে চালু করা হয় এবং ড্রাইভারদের অবশ্যই এমন কোনও কার্যকারিতা প্রদান করা উচিত নয় যা এই নীতিগুলি লঙ্ঘন করে।

লেয়ারের ব্যবহারিক ক্ষেত্রগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • ডেভেলপমেন্ট-টাইম লেয়ার — প্রোডাকশন ডিভাইসের সিস্টেম ইমেজে ট্রেসিং/প্রোফাইলিং/ডিবাগিং টুলের জন্য লেয়ার ও শিম ইনস্টল করা উচিত নয়। ট্রেসিং/প্রোফাইলিং/ডিবাগিং টুলের জন্য ভ্যালিডেশন লেয়ার এবং শিম সিস্টেম ইমেজ ছাড়াই আপডেট করা যেতে পারে। যেসব ডেভেলপার ডেভেলপমেন্টের সময় এইসব লেয়ারের একটি ব্যবহার করতে চান, তারা অ্যাপ প্যাকেজ পরিবর্তন করতে পারেন, যেমন, নেটিভ লাইব্রেরি ডিরেক্টরিতে ফাইল যোগ করে। IHV ও OEM ইঞ্জিনিয়াররা যারা পরিবর্তন করা যায় না এমন অ্যাপ শিপিংয়ে ব্যর্থতা ডায়াগনসিস করতে চান, তাদের কাছে সিস্টেম ইমেজের নন-প্রোডাকশন (রুট করা) বিল্ডের অ্যাক্সেস আছে বলে ধরে নেওয়া হয়, যদি না সেইসব অ্যাপ ডিবাগ করা যায়। আরও তথ্যের জন্য Android-এ Vulkan ভ্যালিডেশন লেয়ার দেখুন।
  • ইউটিলিটি লেয়ার — এইসব লেয়ার এক্সটেনশন প্রকাশ করে, যেমন ডিভাইস মেমরির জন্য মেমরি ম্যানেজার প্রয়োগ করে এমন লেয়ার। ডেভেলপাররা তাদের অ্যাপে ব্যবহার করার জন্য লেয়ার এবং সেই লেয়ারের ভার্সন বেছে নেন; একই লেয়ার ব্যবহার করা বিভিন্ন অ্যাপ এখনও বিভিন্ন ভার্সন ব্যবহার করতে পারে। ডেভেলপাররা তাদের অ্যাপ প্যাকেজে কোন লেয়ারটি রাখবেন তা বেছে নেন।
  • ইনজেক্ট করা (ইমপ্লিসিট) লেয়ার — এর মধ্যে এমন লেয়ার অন্তর্ভুক্ত থাকে যেমন ফ্রেম রেট, সোশ্যাল নেটওয়ার্ক এবং গেম লঞ্চার ওভারলে যা ব্যবহারকারী প্রদান করেছেন অথবা অ্যাপের জ্ঞান বা সম্মতি ছাড়াই অন্য কোনও অ্যাপ। এগুলি Android-এর নিরাপত্তা নীতি লঙ্ঘন করে এবং কাজ করে না।

ডিবাগ করা যায় না এমন অ্যাপের ক্ষেত্রে, লোডার শুধুমাত্র অ্যাপের নেটিভ লাইব্রেরি ডিরেক্টরিতে লেয়ার সার্চ করে এবং নির্দিষ্ট প্যাটার্নের (যেমন, libVKLayer_foo.so) সাথে মিলে যায় এমন নামের যেকোনও লাইব্রেরি লোড করার চেষ্টা করে। এইসব লেয়ার অ্যাপের নেমস্পেসে লোড করা হয়। তাই, সেগুলি অবশ্যই NDK-এর মাধ্যমে তৈরি করতে হবে।

ডিবাগ করা যায় এমন অ্যাপের ক্ষেত্রে, লোডার /data/local/debug/vulkan-এ লেয়ার সার্চ করে এবং নির্দিষ্ট প্যাটার্নের সাথে ম্যাচ করা যেকোনও লাইব্রেরি লোড করার চেষ্টা করে। Android 10 (API লেভেল ২৯) থেকে শুরু করে, Vulkan ডেভেলপমেন্ট-টাইম লেয়ারও লোড করতে পারে অন্য APK থেকে। দুটি ক্ষেত্রেই, লোডার, সিস্টেম সেটিংস ব্যবহার করে, অ্যাপ-পিছু কোন লেয়ার চালু করতে হবে তা বেছে নেয়। এইসব লেয়ারের নাম vkEnumerateInstanceLayerProperties-এ দেওয়া আছে (অর্থাৎ, অ্যাপের এগুলি সম্পর্কে জ্ঞান থাকতে পারে), যদিও সেগুলি অ্যাপের সম্মতি ছাড়াই লোড করা হতে পারে।

Android-এর মাধ্যমে Android ও অন্যান্য প্ল্যাটফর্মের মধ্যে বিল্ড-এনভায়রনমেন্ট পরিবর্তনের সাথে লেয়ার পোর্ট করা যায়। লেয়ার ও লোডারের মধ্যে ইন্টারফেস সম্পর্কে বিস্তারিত জানতে, Vulkan লোডার ইন্টারফেসের আর্কিটেকচার দেখুন। Khronos-এর তত্ত্বাবধানে থাকা যাচাইকরণ লেয়ারগুলি Vulkan যাচাইকরণ লেয়ারে হোস্ট করা হয়।

Vulkan API ভার্সন ও ক্ষমতা

নিচের সারণীতে বিভিন্ন Android রিলিজের জন্য Vulkan API ভার্সন তালিকাভুক্ত করা হয়েছে।
Android সংস্করণ Vulkan ভার্সন
Android 16 Vulkan 1.4
Android 13 Vulkan 1.3
Android 9 Vulkan 1.1
Android 7 Vulkan 1.0

Vulkan 1.4 কার্যকারিতার ওভারভিউ

Vulkan 1.4, আগে ঐচ্ছিক থাকা বেশ কিছু এক্সটেনশনকে Vulkan-এর মূল কার্যকারিতার মধ্যে অন্তর্ভুক্ত করে। এইসব ফাংশনালিটির বেশিরভাগই Vulkan প্রোগ্রামিং ইন্টারফেসের উপর কন্ট্রোল ও গ্র্যানুলারিটি বাড়ানোর উদ্দেশ্যে অন্তর্ভুক্ত করা হয়েছে। Vulkan 1.3-এর তুলনায় Vulkan 1.4-এ হার্ডওয়্যারের প্রয়োজনীয়তা বেশি, এর বেশিরভাগ প্রয়োগ SoC-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে, ফ্রেমওয়ার্কের মধ্যে নয়।

Vulkan 1.3-এর কার্যকারিতা এক নজরে

Vulkan 1.3, আগে ঐচ্ছিক থাকা বেশ কিছু এক্সটেনশনকে Vulkan-এর মূল কার্যকারিতার মধ্যে অন্তর্ভুক্ত করে। এইসব ফাংশনালিটির বেশিরভাগই Vulkan প্রোগ্রামিং ইন্টারফেসের উপর কন্ট্রোল ও গ্র্যানুলারিটি বাড়ানোর উদ্দেশ্যে অন্তর্ভুক্ত করা হয়েছে। সিঙ্গেল-পাস রেন্ডার পাস ইনস্ট্যান্সের জন্য আর রেন্ডার পাস অবজেক্ট বা ফ্রেমবাফার প্রয়োজন হয় না। পাইপলাইন স্টেট অবজেক্টের মোট সংখ্যা কমানো যেতে পারে এবং API-এর মধ্যে সিঙ্ক করার প্রসেস ওভারহল করা হয়েছে। Vulkan 1.3-এর হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা Vulkan 1.2, 1.1 ও 1.0-এর মতোই, যার বেশিরভাগই SoC-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে প্রয়োগ করা হয়, ফ্রেমওয়ার্কে নয়।

Android-এর জন্য সবচেয়ে গুরুত্বপূর্ণ Vulkan 1.3 ফিচারগুলি হল:

  • সিঙ্গেল-পাস রেন্ডার পাস ইনস্ট্যান্সের জন্য সহায়তা
  • শেডার ইনভোকেশন অবিলম্বে বন্ধ করার সুবিধা
  • পাইপলাইন তৈরি, শেয়ার ও কন্ট্রোল করার ক্ষেত্রে আরও সূক্ষ্ম গ্র্যানুলারিটি

Vulkan 1.3-এ বেশ কিছু ছোট ফিচার ও API ব্যবহারযোগ্যতা সংক্রান্ত উন্নতিও অন্তর্ভুক্ত। কোর Vulkan API-তে মাইনর রিভিশন 1.3-এর মাধ্যমে করা সব পরিবর্তন কোর রিভিশন (Vulkan 1.3)-এ দেখা যাবে।

Vulkan 1.2 ফাংশনালিটি ওভারভিউ

Vulkan 1.2-এ এমন অনেক ফিচার ও এক্সটেনশন যোগ করা হয়েছে যা API সারফেসকে আরও সহজ করে তোলে। এর মধ্যে একটি ইউনিফায়েড মেমরি মডেল এবং অতিরিক্ত তথ্য অন্তর্ভুক্ত যা ডিভাইস ড্রাইভার থেকে কোয়েরি করা যেতে পারে। Vulkan 1.2-এর হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা Vulkan 1.0 ও 1.1-এর মতোই; সব ইমপ্লিমেন্টেশন SoC-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে থাকে, ফ্রেমওয়ার্কে নয়।

Android-এর জন্য সবচেয়ে গুরুত্বপূর্ণ Vulkan 1.2 ফিচার হল ৮-বিট স্টোরেজের জন্য সহায়তা।

Vulkan 1.2-এ বেশ কিছু ছোট ফিচার ও API ব্যবহারযোগ্যতা সংক্রান্ত উন্নতিও অন্তর্ভুক্ত। মাইনর রিভিশন 1.2 সহ মূল Vulkan API-তে করা সব পরিবর্তন এখানে পাওয়া যাবে: মূল রিভিশন (Vulkan 1.2)।

Vulkan 1.1 ফাংশনালিটি ওভারভিউ

Vulkan 1.1-এ মেমরি/সিঙ্ক্রোনাইজেশন ইন্টারঅপের জন্য সহায়তা অন্তর্ভুক্ত, যা OEM-কে ডিভাইসে Vulkan 1.1-এর জন্য সহায়তা প্রদান করতে সক্ষম করে। এছাড়াও, মেমরি/সিঙ্ক্রোনাইজেশন ইন্টারপ ডেভেলপারদের কোনও ডিভাইসে Vulkan 1.1 কাজ করে কিনা তা নির্ধারণ করতে এবং এটি থাকলে কার্যকরভাবে ব্যবহার করতে দেয়। Vulkan 1.1-এর Vulkan 1.0-এর মতো একই হার্ডওয়্যার প্রয়োজনীয়তা রয়েছে, তবে বেশিরভাগ ইমপ্লিমেন্টেশন SOC-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে রয়েছে, ফ্রেমওয়ার্কে নয়।

Android-এর জন্য সবচেয়ে গুরুত্বপূর্ণ Vulkan 1.1 ফিচারগুলি হল:

  • Vulkan-এর বাইরে থেকে মেমরি বাফার এবং সিঙ্ক্রোনাইজেশন অবজেক্ট ইম্পোর্ট এবং এক্সপোর্ট করার জন্য সহায়তা (ক্যামেরা, কোডেক এবং GLES-এর সাথে ইন্টারঅপারেবিলিটির জন্য)
  • YCbCr ফর্ম্যাটের জন্য সহায়তা

Vulkan 1.1-এ আরও অনেক ছোট ছোট ফিচার ও API ব্যবহারযোগ্যতা উন্নয়ন অন্তর্ভুক্ত রয়েছে। মাইনর রিভিশন 1.1 সহ মূল Vulkan API-তে করা সব পরিবর্তন এখানে পাওয়া যাবে: মূল রিভিশন (Vulkan 1.1)।

Vulkan সহায়তা বেছে নিন

সব Android ডিভাইসে অবশ্যই সবচেয়ে উন্নত Vulkan ফিচার সেট কাজ করতে হবে, তবে শর্ত হল, সেগুলিতে যেন ৬৪-বিট ABI কাজ করে এবং মেমরি যেন কম না হয়।

Android 16 ও তার পরবর্তী যেকোনও ভার্সন সহ লঞ্চ করা ডিভাইসকে অবশ্যই Vulkan 1.4 ভার্সনে কাজ করতে হবে।

Android 13 এবং তার পরবর্তী যেকোনও ভার্সন সহ লঞ্চ হওয়া ডিভাইসে Vulkan 1.3 কাজ করতেই হবে।

Android 10-এর মাধ্যমে লঞ্চ করা ডিভাইসে Vulkan 1.1 কাজ করতেই হবে।

অন্যান্য ডিভাইস বিকল্প হিসেবে Vulkan 1.4, 1.3, 1.2 ও 1.1 ভার্সন সাপোর্ট করতে পারে।

Vulkan ভার্সনে কাজ করে

নিম্নলিখিত শর্ত পূরণ হলে, Android ডিভাইসে Vulkan ভার্সন কাজ করে:

  1. Android ভার্সনের অতিরিক্ত CDD প্রয়োজনীয়তার পাশাপাশি আগ্রহের Vulkan ভার্সনে কাজ করে এমন Vulkan ড্রাইভার যোগ করুন (এটি অবশ্যই Vulkan ভার্সন 1.4, 1.3, 1.1 বা 1.0-এর মধ্যে একটি হতে হবে)। অথবা, কম Vulkan ভার্সন নম্বরের আগে থেকেই থাকা Vulkan ড্রাইভার আপডেট করুন।
  2. Vulkan 1.4, 1.3 বা 1.1-এর জন্য, প্যাকেজ ম্যানেজারের মাধ্যমে ফেরত আসা সিস্টেম ফিচার সঠিক Vulkan ভার্সনের জন্য true ফেরত দেয় কিনা তা যাচাই করুন।
    • Vulkan 1.4-এর জন্য ফিচার হল PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x404000).
    • Vulkan 1.3-এর জন্য ফিচারটি হল PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000).
    • Vulkan 1.1-এর জন্য ফিচারটি হল PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)।
    প্যাকেজ ম্যানেজার Vulkan 1.4, 1.3 এবং 1.1-এর জন্য true রিটার্ন করবে। এর জন্য উপযুক্ত device.mk ফাইলে নিচে দেখানো নিয়মটি যোগ করতে হবে।
    • Vulkan 1.4-এর জন্য নিম্নলিখিতগুলি যোগ করুন:
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_4.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
    • Vulkan 1.3-এর জন্য নিম্নলিখিত বিষয়গুলি যোগ করুন:
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_3.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
    • Vulkan 1.1-এর জন্য নিম্নলিখিতগুলি যোগ করুন:
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml

Android বেসলাইন প্রোফাইল (ABP)

আমরা সব Android ডিভাইসকে লেটেস্ট Android Baseline 2022 প্রোফাইল মেনে চলতে উৎসাহিত করি, যা Android Baseline প্রোফাইল গাইড-এ উল্লেখ করা হয়েছে।

Android 14 বা এর পরবর্তী যেকোনও ভার্সন ও Vulkan API কাজ করে এমন যেকোনও ডিভাইসকে Android Baseline 2021 প্রোফাইলে সংজ্ঞায়িত সমস্ত কার্যকারিতা পূরণ করতে হবে। প্রয়োজনীয় ফাংশনালিটির সম্পূর্ণ তালিকা Vulkan প্রোফাইল json ফাইলে উল্লেখ করা আছে, তবে প্রয়োজনীয় ফাংশনালিটির মূল সাবসেটের মধ্যে এগুলি অন্তর্ভুক্ত:

  • ASTC ও ETC-এর মাধ্যমে কম্প্রেস করা টেক্সচার।
  • VK_EXT_swapchain_colorspace-এর মাধ্যমে ভেরিয়েবল কালারস্পেস।
  • sampleRateShading-এর মাধ্যমে স্যাম্পেল শেডিং ও মাল্টিস্যাম্পেল ইন্টারপোলেশন।

উইন্ডো সিস্টেম ইন্টিগ্রেশন (WSI)

libvulkan.so-এ, ড্রাইভার নিম্নলিখিত উইন্ডো সিস্টেম ইন্টিগ্রেশন (WSI) এক্সটেনশন প্রয়োগ করে:

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties, Vulkan 1.1-এর জন্য প্রয়োগ করা হয়েছে শুধুমাত্র Android 10-এ
  • VK_GOOGLE_display_timing, Android 10-এ যেকোনও Vulkan ভার্সনের জন্য প্রয়োগ করা হয়েছে

VkSurfaceKHR ও VkSwapchainKHR অবজেক্ট এবং ANativeWindow-এর সাথে হওয়া সব ইন্টার‍্যাকশন প্ল্যাটফর্ম ম্যানেজ করে এবং এগুলি ড্রাইভারের কাছে প্রকাশ করা হয় না। WSI ইমপ্লিমেন্টেশন VK_ANDROID_native_buffer এক্সটেনশনের উপর নির্ভর করে, যেটি ড্রাইভারের দ্বারা সাপোর্ট করতে হবে; এই এক্সটেনশনটি শুধুমাত্র WSI ইমপ্লিমেন্টেশনের দ্বারা ব্যবহার করা হয় এবং অ্যাপের কাছে প্রকাশ করা হয় না।

Gralloc ব্যবহারের ফ্ল্যাগ

Vulkan প্রয়োগ করার জন্য প্রয়োগ-সংজ্ঞায়িত ব্যক্তিগত Gralloc ব্যবহার সংক্রান্ত ফ্ল্যাগ সহ swapchain বাফার বরাদ্দ করার প্রয়োজন হতে পারে। সোয়াপচেন তৈরি করার সময়, Android, ড্রাইভারকে অনুরোধ করা ফর্ম্যাট ও ছবি ব্যবহারের ফ্ল্যাগকে Gralloc ব্যবহারের ফ্ল্যাগে ট্রান্সলেট করতে বলে, এর জন্য এটি কল করে:

typedef enum VkSwapchainImageUsageFlagBitsANDROID {
    VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0x00000001,
    VK_SWAPCHAIN_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkSwapchainImageUsageFlagBitsANDROID;
typedef VkFlags VkSwapchainImageUsageFlagsANDROID;

VkResult VKAPI vkGetSwapchainGrallocUsage2ANDROID(
    VkDevice                          device,
    VkFormat                          format,
    VkImageUsageFlags                 imageUsage,
    VkSwapchainImageUsageFlagsANDROID swapchainUsage,
    uint64_t*                         grallocConsumerUsage,
    uint64_t*                         grallocProducerUsage
);

format ও imageUsage প্যারামিটারগুলি VkSwapchainCreateInfoKHR স্ট্রাকচার থেকে নেওয়া হয়। ড্রাইভারকে *grallocConsumerUsage ও *grallocProducerUsage পূরণ করতে হবে, যার মধ্যে ফর্ম্যাট ও ব্যবহারের জন্য প্রয়োজনীয় Gralloc ব্যবহারের ফ্ল্যাগ থাকে। ড্রাইভারের রিটার্ন করা ব্যবহার সংক্রান্ত ফ্ল্যাগ, বাফার অ্যালোকেট করার সময় সোয়াপচেন কনজিউমারের অনুরোধ করা ব্যবহার সংক্রান্ত ফ্ল্যাগের সাথে একত্রিত করা হয়।

Android 7.x, VkSwapchainImageUsageFlagsANDROID()-এর আগের ভার্সনকে কল করে, যার নাম vkGetSwapchainGrallocUsageANDROID()। Android 8.0 এবং তার পরবর্তী ভার্সন vkGetSwapchainGrallocUsageANDROID()-কে বাতিল করে দেয় কিন্তু এখনও vkGetSwapchainGrallocUsageANDROID()-কে কল করে যদি vkGetSwapchainGrallocUsage2ANDROID() ড্রাইভারের মাধ্যমে প্রদান করা না হয়:

VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
    VkDevice            device,
    VkFormat            format,
    VkImageUsageFlags   imageUsage,
    int*                grallocUsage
);

vkGetSwapchainGrallocUsageANDROID()-এ swapchain ব্যবহার সংক্রান্ত ফ্ল্যাগ বা Gralloc-এর অতিরিক্ত ব্যবহার সংক্রান্ত ফ্ল্যাগ কাজ করে না।

Gralloc-ব্যাকড ছবি

VkNativeBufferANDROID হল একটি vkCreateImage এক্সটেনশন স্ট্রাকচার যা Gralloc বাফার দ্বারা ব্যাক-আপ করা ছবি তৈরি করার জন্য ব্যবহৃত হয়। VkNativeBufferANDROID হল VkImageCreateInfo স্ট্রাকচার চেনে vkCreateImage()-কে প্রদান করা। vkCreateSwapchainKHR-এ কল করার সময় VkNativeBufferANDROID-এর সাথে vkCreateImage()-এ কল করা হয়। WSI ইমপ্লিমেন্টেশন, সোয়াপচেনের জন্য অনুরোধ করা নেটিভ বাফারের সংখ্যা বরাদ্দ করে, তারপর প্রত্যেকটির জন্য একটি করে VkImage তৈরি করে:

typedef struct {
    VkStructureType             sType; // must be VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID
    const void*                 pNext;

    // Buffer handle and stride returned from gralloc alloc()
    buffer_handle_t             handle;
    int                         stride;

    // Gralloc format and usage requested when the buffer was allocated.
    int                         format;
    int                         usage;
    // Beginning in Android 8.0, the usage field above is deprecated and the
    // usage2 struct below was added. The usage field is still filled in for
    // compatibility with Android 7.0 drivers. Drivers for Android 8.0
    // should prefer the usage2 struct, especially if the
    // android.hardware.graphics.allocator HAL uses the extended usage bits.
    struct {
        uint64_t                consumer;
        uint64_t                producer;
    } usage2;
} VkNativeBufferANDROID;

Gralloc-ব্যাকড ছবি তৈরি করার সময়, VkImageCreateInfo-এর কাছে নিম্নলিখিত ডেটা থাকে:

  .sType               = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
  .pNext               = the above VkNativeBufferANDROID structure
  .imageType           = VK_IMAGE_TYPE_2D
  .format              = a VkFormat matching the format requested for the gralloc buffer
  .extent              = the 2D dimensions requested for the gralloc buffer
  .mipLevels           = 1
  .arraySize           = 1
  .samples             = 1
  .tiling              = VK_IMAGE_TILING_OPTIMAL
  .usage               = VkSwapchainCreateInfoKHR::imageUsage
  .flags               = 0
  .sharingMode         = VkSwapchainCreateInfoKHR::imageSharingMode
  .queueFamilyCount    = VkSwapchainCreateInfoKHR::queueFamilyIndexCount
  .pQueueFamilyIndices = VkSwapchainCreateInfoKHR::pQueueFamilyIndices

Android 8.0 ও তার পরবর্তী যেকোনও ভার্সনে, প্ল্যাটফর্ম একটি VkSwapchainImageCreateInfoKHR এক্সটেনশন স্ট্রাকচার প্রদান করে যা VkImageCreateInfo চেনে প্রদান করা হয় vkCreateImage যখন কোনও সোয়াপচেন ইমেজ ব্যবহারের ফ্ল্যাগ সোয়াপচেনের জন্য প্রয়োজন হয়। এক্সটেনশন স্ট্রাকচারে swapchain ইমেজ ব্যবহারের ফ্ল্যাগ থাকে:

typedef struct {
    VkStructureType                        sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
    const void*                            pNext;

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

Android 10 এবং তার পরবর্তী ভার্সনে, প্ল্যাটফর্মটি VK_KHR_swapchain v70-কে সাপোর্ট করে, তাই Vulkan অ্যাপটি VkImage তৈরি করতে সক্ষম যা সোয়াপচেন মেমরি দ্বারা সমর্থিত। অ্যাপটি প্রথমে VkImageCreateInfo স্ট্রাকচারের সাথে চেইন করা VkImageSwapchainCreateInfoKHR স্ট্রাকচার সহ vkCreateImage কল করে। তারপর অ্যাপটি vkBindImageMemory2(KHR)-কে কল করে, যার সাথে VkBindImageMemorySwapchainInfoKHR স্ট্রাকচারটি VkBindImageMemoryInfo স্ট্রাকচারের সাথে চেইন করা থাকে। VkBindImageMemorySwapchainInfoKHR স্ট্রাকচারে উল্লেখ করা imageIndex মানটি অবশ্যই একটি সঠিক সোয়াপচেন ইমেজ ইনডেক্স হতে হবে। এর মধ্যে, প্ল্যাটফর্ম VkBindImageMemoryInfo চেনেলে সংশ্লিষ্ট Gralloc বাফার তথ্য সহ একটি VkNativeBufferANDROID এক্সটেনশন স্ট্রাকচার প্রদান করে, তাই ড্রাইভার জানে যে কোন Gralloc বাফারকে VkImage-এর সাথে বাইন্ড করতে হবে।

ছবি সংগ্রহ করা

vkAcquireImageANDROID একটি সোয়াপচেন ছবির মালিকানা অর্জন করে এবং একটি এক্সটার্নালি সিগন্যাল করা নেটিভ ফেন্সকে একটি বিদ্যমান VkSemaphore অবজেক্ট এবং একটি বিদ্যমান VkFence অবজেক্টে ইম্পোর্ট করে:

VkResult VKAPI vkAcquireImageANDROID(
    VkDevice            device,
    VkImage             image,
    int                 nativeFenceFd,
    VkSemaphore         semaphore,
    VkFence             fence
);

vkAcquireImageANDROID()-কে vkAcquireNextImageKHR-এর সময় কল করা হয়, যাতে অ্যাপের দেওয়া VkSemaphore ও VkFence অবজেক্টে নেটিভ ফেন্স ইমপোর্ট করা যায় (তবে, এই কলে সেমফোর ও ফেন্স অবজেক্ট, দুটিই ঐচ্ছিক)। এছাড়াও, Gralloc বাফার স্টেটে কোনও এক্সটার্নাল পরিবর্তন শনাক্ত ও ম্যানেজ করার জন্য ড্রাইভার এই সুযোগ ব্যবহার করতে পারে; অনেক ড্রাইভারকে এখানে কিছু করতে হবে না। এই কল VkSemaphore এবং VkFence-কে একই পেন্ডিং অবস্থায় রাখে, যেন vkQueueSubmit-এর দ্বারা সিগন্যাল দেওয়া হয়েছে, তাই কিউ সেমাফোরে অপেক্ষা করতে পারে এবং অ্যাপ ফেন্সে অপেক্ষা করতে পারে।

আন্ডারলায়িং নেটিভ ফেন্স সিগন্যাল করলে, দুটি অবজেক্টই সিগন্যাল করা হয়; যদি নেটিভ ফেন্স আগেই সিগন্যাল করে থাকে, তাহলে এই ফাংশন রিটার্ন করার সময় সেমফোর সিগন্যাল করা অবস্থায় থাকে। ড্রাইভার ফেন্স ফাইল ডেসক্রিপটরের মালিকানা নেয় এবং আর প্রয়োজন না হলে ফেন্স ফাইল ডেসক্রিপটর বন্ধ করে দেয়। সেমাফোর বা ফেন্স অবজেক্ট প্রদান করা না হলেও অথবা vkAcquireImageANDROID কাজ না করে কোনও সমস্যা দেখালেও ড্রাইভারকে অবশ্যই এটি করতে হবে। If fenceFd -১ হলে, ধরে নিতে হবে যে নেটিভ ফেন্স আগেই সিগন্যাল করা হয়েছে।

ছবি রিলিজ করা

vkQueueSignalReleaseImageANDROID এক্সটার্নাল ব্যবহারের জন্য একটি সোয়াপচেন ইমেজ প্রস্তুত করে, একটি নেটিভ ফেন্স তৈরি করে এবং ইনপুট সেমাফোর সিগন্যাল দেওয়ার পরে নেটিভ ফেন্স সিগন্যাল দেওয়ার জন্য শিডিউল করে:

VkResult VKAPI vkQueueSignalReleaseImageANDROID(
    VkQueue             queue,
    uint32_t            waitSemaphoreCount,
    const VkSemaphore*  pWaitSemaphores,
    VkImage             image,
    int*                pNativeFenceFd
);

প্রদত্ত সারিতে vkQueuePresentKHR()টি কল vkQueueSignalReleaseImageANDROID() করা হয়েছে। ড্রাইভারকে অবশ্যই একটি নেটিভ ফেন্স তৈরি করতে হবে যা pWaitSemaphores-এ থাকা সব waitSemaphoreCount সেমাফোর সিগন্যাল না দেওয়া পর্যন্ত সিগন্যাল দেয় না এবং প্রেজেন্টেশনের জন্য image প্রস্তুত করতে প্রয়োজনীয় যেকোনও অতিরিক্ত কাজ সম্পূর্ণ করে।

যদি অপেক্ষা করার সেমাফোর (যদি থাকে) আগে থেকেই সিগন্যাল দিয়ে থাকে এবং queue আগে থেকেই আইডল থাকে, তাহলে ড্রাইভার *pNativeFenceFd-কে -1-এ সেট করতে পারে, এর ফলে প্রকৃত নেটিভ ফেন্স ফাইল ডেসক্রিপ্টর ব্যবহার করার প্রয়োজন হয় না। এর মাধ্যমে বোঝানো হয় যে আর অপেক্ষা করার কিছু নেই। কলার *pNativeFenceFd-এ রিটার্ন করা ফাইল ডেসক্রিপ্টরের মালিক এবং সেটি বন্ধ করে দেয়।

অনেক ড্রাইভার ইমেজ প্যারামিটার উপেক্ষা করতে পারে, কিন্তু কিছু ড্রাইভারকে এক্সটার্নাল ইমেজ কনজিউমারদের ব্যবহারের জন্য Gralloc বাফারের সাথে যুক্ত CPU-সাইড ডেটা স্ট্রাকচার প্রস্তুত করতে হতে পারে। এক্সটার্নাল গ্রাহকদের ব্যবহারের জন্য বাফার কন্টেন্ট প্রস্তুত করার কাজটি অবশ্যই অ্যাসিঙ্ক্রোনাসভাবে করতে হবে। এটি VK_IMAGE_LAYOUT_PRESENT_SRC_KHR-এ ইমেজ ট্রানজিশনের অংশ হিসেবে করতে হবে।

VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID-এর মাধ্যমে ছবি তৈরি করা হলে, ড্রাইভারকে অবশ্যই vkAcquireImageANDROID()-এ কল করার মধ্যে কোনও হস্তক্ষেপ না করে vkQueueSignalReleaseImageANDROID()-কে বারবার কল করার অনুমতি দিতে হবে।

প্রেজেন্ট করার মতো ছবি শেয়ার করা সংক্রান্ত সহায়তা

কিছু ডিভাইস লেটেন্সি কমাতে ডিসপ্লে পাইপলাইন এবং Vulkan ইমপ্লিমেন্টেশনের মধ্যে একটি ছবির মালিকানা শেয়ার করতে পারে। Android 9 ও তার পরবর্তী যেকোনও ভার্সনে, লোডার কন্ডিশনালি VK_KHR_shared_presentable_image এক্সটেনশন বিজ্ঞাপন দেয়, এটি ড্রাইভারের vkGetPhysicalDeviceProperties2-এ করা কলের উত্তরে নির্ভর করে।

ড্রাইভার Vulkan 1.1 বা VK_KHR_physical_device_properties2 এক্সটেনশন কোনওটির সাথেই কাজ না করলে, লোডার শেয়ার করা প্রেজেন্টেবল ইমেজের জন্য সাপোর্ট বিজ্ঞাপন দেয় না। অন্যথায়, লোডার vkGetPhysicalDeviceProperties2() কল করে ড্রাইভারের ক্ষমতা সম্পর্কে কোয়েরি করে এবং VkPhysicalDeviceProperties2::pNext চেনে নিম্নলিখিত স্ট্রাকচার অন্তর্ভুক্ত করে:

typedef struct {
    VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
    const void*     pNext;
    VkBool32        sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;

ড্রাইভার যদি ডিসপ্লে সিস্টেমের সাথে কোনও ছবির মালিকানা শেয়ার করতে পারে, তাহলে এটি sharedImage মেম্বারকে VK_TRUE-এ সেট করে।

যাচাইকরণ

OEM, CTS ব্যবহার করে তাদের Vulkan ইমপ্লিমেন্টেশন পরীক্ষা করতে পারে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:

  • Khronos Vulkan কনফর্ম্যান্স টেস্ট CtsDeqpTestCases মডিউলে যেখানে Vulkan 1.0, 1.1, 1.2, 1.3 ও 1.4-এর জন্য কার্যকরী API টেস্ট অন্তর্ভুক্ত।
  • CtsGraphicsTestCases মডিউল, যা পরীক্ষা করে দেখে যে ডিভাইসটি Vulkan-এর জন্য সঠিকভাবে কনফিগার করা হয়েছে কিনা।

Vulkan ফিচার ফ্ল্যাগ

Android 11 বা তার পরবর্তী যেকোনও ভার্সন কাজ করে এবং Vulkan API কাজ করে এমন ডিভাইসে ফিচার ফ্ল্যাগ এক্সপোজ করার জন্য android.software.vulkan.deqp.levelপ্রয়োজন। এই ফিচার ফ্ল্যাগের ভ্যালু হল একটি তারিখ, যা একটি পূর্ণসংখ্যা ভ্যালু হিসেবে এনকোড করা হয়। ডিভাইসটি পাস করেছে বলে দাবি করা Vulkan dEQP টেস্টের সাথে যুক্ত তারিখটি এতে উল্লেখ করা হয়।

YYYY-MM-DD ফর্ম্যাটের তারিখকে নিম্নলিখিত উপায়ে ৩২-বিট পূর্ণসংখ্যা হিসেবে এনকোড করা হয়:

  • বিট ০-১৫ বছর সেভ করে
  • বিট ১৬-২৩ মাস স্টোর করে
  • বিট ২৪-৩১-এ দিন স্টোর করা হয়

ফিচার ফ্ল্যাগের জন্য ন্যূনতম অনুমোদিত ভ্যালু হল 0x07E30301, যা ২০১৯-০৩-০১ তারিখের সাথে সম্পর্কিত। এই তারিখটি Android 10-এর জন্য Vulkan dEQP পরীক্ষার সাথে যুক্ত। ফিচার ফ্ল্যাগ অন্তত এই ভ্যালুতে থাকলে, ডিভাইসটি Android 10 Vulkan dEQP টেস্টের সবকটিতে পাস করেছে বলে দাবি করে।

মান 0x07E40301, ১ মার্চ, ২০২০ তারিখের সাথে সম্পর্কিত, যা হল Android 11-এর জন্য Vulkan dEQP টেস্টের সাথে যুক্ত তারিখ। ফিচার ফ্ল্যাগের মান কমপক্ষে এই ভ্যালু হলে, ডিভাইস দাবি করে যে এটি Android 11 Vulkan dEQP-এর সব টেস্টে পাস করেছে।

0x07E60301 ভ্যালু 2022-03-01 তারিখের সাথে সম্পর্কিত, যা Android 13-এর জন্য Vulkan dEQP টেস্টের সাথে সম্পর্কিত তারিখ। ফিচার ফ্ল্যাগ অন্তত এই ভ্যালু হলে, ডিভাইস দাবি করে যে এটি Android 13 Vulkan dEQP-এর সব টেস্টে পাস করেছে।

কোনও ডিভাইস যদি নির্দিষ্ট ফিচার ফ্ল্যাগ (যেমন 0x07E30301, 0x07E40301, 0x07E60301) এক্সপোজ করে, তাহলে সেই ফিচার ফ্ল্যাগের (যথাক্রমে Android 10, Android 11, Android 13) সব Android Vulkan dEQP টেস্টে পাস করেছে বলে দাবি করে। এই ডিভাইস পরবর্তী Android রিলিজ থেকে Vulkan dEQP পরীক্ষা পাস করতে পারে।

Vulkan dEQP, Android CTS-এর অংশ। Android 11 থেকে, CTS-এর dEQP টেস্ট রানার কম্পোনেন্ট android.software.vulkan.deqp.level ফিচার ফ্ল্যাগ সম্পর্কে জানে এবং যেকোনও Vulkan dEQP টেস্ট এড়িয়ে যায় যা - এই ফিচার ফ্ল্যাগ অনুযায়ী - ডিভাইস সাপোর্ট করে বলে দাবি করে না। এই ধরনের টেস্ট তুচ্ছভাবে পাস করা হিসেবে রিপোর্ট করা হয়।