ভলকান বাস্তবায়ন করুন

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

Vulkan সফলভাবে বাস্তবায়ন করতে, একটি ডিভাইস অন্তর্ভুক্ত করা আবশ্যক:

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

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

ভলকান লোডার

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

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

ড্রাইভার গণনা এবং লোডিং

যখন সিস্টেম ইমেজ তৈরি করা হয়, তখন অ্যান্ড্রয়েড আশা করে যে কোন জিপিইউ পাওয়া যায় তা সিস্টেম জানতে পারবে। ড্রাইভার আবিষ্কার ও লোড করার জন্য লোডার hardware.h এ বিদ্যমান HAL মেকানিজম ব্যবহার করে। 32-বিট এবং 64-বিট ভলকান ড্রাইভারের জন্য পছন্দের পথগুলি হল:

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

অ্যান্ড্রয়েড 7.0 এবং উচ্চতর সংস্করণে, ভলকান 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() ফাংশন খুঁজে পেতে পারে।

স্তর আবিষ্কার এবং লোড হচ্ছে

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

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

স্তরগুলির জন্য কেস ব্যবহার করুন অন্তর্ভুক্ত:

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

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

ডিবাগযোগ্য অ্যাপগুলির জন্য, লোডার /data/local/debug/vulkan এ স্তরগুলি অনুসন্ধান করে এবং একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে এমন কোনও লাইব্রেরি লোড করার চেষ্টা করে।

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

Vulkan API সংস্করণ এবং ক্ষমতা

নিম্নলিখিত সারণীতে বেশ কয়েকটি অ্যান্ড্রয়েড রিলিজের জন্য ভলকান এপিআই সংস্করণের তালিকা রয়েছে।
অ্যান্ড্রয়েড সংস্করণ ভলকান সংস্করণ
অ্যান্ড্রয়েড 13 ভলকান 1.3
অ্যান্ড্রয়েড 9 ভলকান 1.1
অ্যান্ড্রয়েড 7 ভলকান 1.0

ভলকান 1.3 কার্যকারিতা ওভারভিউ

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

অ্যান্ড্রয়েডের জন্য সবচেয়ে গুরুত্বপূর্ণ Vulkan 1.3 বৈশিষ্ট্যগুলি হল:

  • একক-পাস রেন্ডার পাস উদাহরণগুলির জন্য সমর্থন
  • অবিলম্বে একটি shader আহ্বান বন্ধ করার জন্য সমর্থন
  • পাইপলাইন তৈরি, ভাগ করে নেওয়া এবং নিয়ন্ত্রণের উপর সূক্ষ্ম কণিকা

Vulkan 1.3 এছাড়াও বেশ কয়েকটি ছোট বৈশিষ্ট্য এবং API ব্যবহারযোগ্যতা বর্ধন অন্তর্ভুক্ত করে। ক্ষুদ্র সংশোধন 1.3 সহ কোর ভলকান এপিআই-তে করা সমস্ত পরিবর্তন কোর রিভিশনে (ভলকান 1.3) পাওয়া যাবে।

ভলকান 1.2 কার্যকারিতা ওভারভিউ

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

অ্যান্ড্রয়েডের জন্য সবচেয়ে গুরুত্বপূর্ণ Vulkan 1.2 বৈশিষ্ট্য হল 8-বিট স্টোরেজের জন্য সমর্থন।

Vulkan 1.2-এ বেশ কয়েকটি ছোট বৈশিষ্ট্য এবং API ব্যবহারযোগ্যতা বৃদ্ধি অন্তর্ভুক্ত রয়েছে। ক্ষুদ্র সংশোধন 1.2 সহ কোর ভলকান এপিআই-তে করা সমস্ত পরিবর্তন কোর রিভিশনে (ভলকান 1.2) পাওয়া যাবে।

ভলকান 1.1 কার্যকারিতা ওভারভিউ

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

অ্যান্ড্রয়েডের জন্য সবচেয়ে গুরুত্বপূর্ণ ভলকান 1.1 বৈশিষ্ট্যগুলি হল:

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

Vulkan 1.1-এ বেশ কয়েকটি ছোট বৈশিষ্ট্য এবং API ব্যবহারযোগ্যতা বৃদ্ধি অন্তর্ভুক্ত রয়েছে। ক্ষুদ্র সংশোধন 1.1 সহ কোর ভলকান এপিআই-তে করা সমস্ত পরিবর্তন কোর রিভিশন (ভলকান 1.1) এ পাওয়া যাবে।

Vulkan সমর্থন চয়ন করুন

অ্যান্ড্রয়েড ডিভাইসগুলি উপলব্ধ সবচেয়ে উন্নত Vulkan বৈশিষ্ট্য সেট সমর্থন করা উচিত, যদি তারা একটি 64-বিট ABI সমর্থন করে এবং কম মেমরি না হয়।

অ্যান্ড্রয়েড 13 এবং তার উপরে চালু হওয়া ডিভাইসগুলি ভলকান 1.3 সমর্থন করবে।

অ্যান্ড্রয়েড 10 এর মাধ্যমে চালু হওয়া ডিভাইসগুলি ভলকান 1.1 সমর্থন করবে।

অন্যান্য ডিভাইস ঐচ্ছিকভাবে Vulkan 1.3, 1.2, এবং 1.1 সমর্থন করতে পারে।

একটি Vulkan সংস্করণ সমর্থন

নিম্নলিখিত শর্তগুলি সন্তুষ্ট হলে একটি অ্যান্ড্রয়েড ডিভাইস একটি ভলকান সংস্করণ সমর্থন করে:

  1. অ্যান্ড্রয়েড সংস্করণের অতিরিক্ত সিডিডি প্রয়োজনীয়তার পাশাপাশি একটি ভলকান ড্রাইভার যোগ করুন যা আগ্রহের ভলকান সংস্করণকে সমর্থন করে (এটি ভলকান সংস্করণ 1.3, 1.1 বা 1.0 এর মধ্যে একটি হতে হবে)। বিকল্পভাবে, একটি নিম্ন Vulkan সংস্করণ নম্বরের একটি বিদ্যমান Vulkan ড্রাইভার আপডেট করুন।
  2. ভলকান 1.3 বা 1.1-এর জন্য, প্যাকেজ ম্যানেজার দ্বারা প্রত্যাবর্তিত সিস্টেম বৈশিষ্ট্য সঠিক ভলকান সংস্করণের জন্য true তা নিশ্চিত করুন।
    • Vulkan 1.3 এর জন্য বৈশিষ্ট্যটি হল PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
    • Vulkan 1.1-এর জন্য বৈশিষ্ট্যটি হল PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
    প্যাকেজ ম্যানেজার Vulkan 1.3 এবং Vulkan 1.1-এর জন্য একটি উপযুক্ত device.mk ফাইলে একটি নিয়ম যোগ করে, যা নিম্নরূপ দেখানো হয়েছে, true ফিরে আসবে।
    • 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 ডিভাইসকে Android বেসলাইন প্রোফাইল গাইডে বর্ণিত সর্বশেষ Android Baseline 2022 প্রোফাইলের সাথে সামঞ্জস্য করতে উত্সাহিত করি৷

Android 14 বা উচ্চতর এবং Vulkan API সমর্থন করে এমন যেকোনো ডিভাইসকে অবশ্যই Android বেসলাইন 2021 প্রোফাইলে সংজ্ঞায়িত সমস্ত কার্যকারিতা পূরণ করতে হবে। প্রয়োজনীয় কার্যকারিতার সম্পূর্ণ তালিকা ভলকান প্রোফাইল 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 , শুধুমাত্র Android 10 এ Vulkan 1.1 এর জন্য প্রয়োগ করা হয়েছে
  • VK_GOOGLE_display_timing , Android 10-এর যেকোনো Vulkan সংস্করণের জন্য প্রয়োগ করা হয়েছে

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

Gralloc ব্যবহার পতাকা

Vulkan বাস্তবায়নের জন্য বাস্তবায়ন-সংজ্ঞায়িত ব্যক্তিগত Gralloc ব্যবহার পতাকাগুলির সাথে বরাদ্দ করার জন্য সোয়াপচেন বাফারের প্রয়োজন হতে পারে। একটি সোয়াপচেইন তৈরি করার সময়, অ্যান্ড্রয়েড ড্রাইভারকে অনুরোধ করা ফরম্যাট এবং ইমেজ ব্যবহারের পতাকাগুলিকে কল করে 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 কাঠামো থেকে নেওয়া হয়েছে। ড্রাইভারের বিন্যাস এবং ব্যবহারের জন্য প্রয়োজনীয় Gralloc ব্যবহার পতাকা সহ *grallocConsumerUsage এবং *grallocProducerUsage পূরণ করা উচিত। বাফার বরাদ্দ করার সময় swapchain ভোক্তা দ্বারা অনুরোধ করা ব্যবহারের পতাকাগুলির সাথে ড্রাইভার দ্বারা ফেরত দেওয়া ব্যবহার পতাকাগুলি একত্রিত হয়।

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

অ্যান্ড্রয়েড 8.0 এবং উচ্চতর সংস্করণে, প্ল্যাটফর্মটি একটি VkSwapchainImageCreateInfoKHR এক্সটেনশন কাঠামো প্রদান করে VkImageCreateInfo শৃঙ্খলে যেটি vkCreateImage কে দেওয়া হয় যখন সোয়াপচেইনের জন্য যেকোনো সোয়াপচেইন ইমেজ ব্যবহার পতাকা প্রয়োজন হয়। এক্সটেনশন স্ট্রাকচারে সোয়াপচেন ইমেজ ব্যবহারের পতাকা রয়েছে:

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

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

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

ইমেজ অর্জন

vkAcquireImageANDROID একটি swapchain চিত্রের মালিকানা অর্জন করে এবং একটি বিদ্যমান VkSemaphore অবজেক্ট এবং একটি বিদ্যমান VkFence অবজেক্ট উভয়ের মধ্যে একটি বাহ্যিকভাবে সংকেতযুক্ত নেটিভ বেড়া আমদানি করে:

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

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

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

ছবি প্রকাশ করুন

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 দিয়ে তৈরি করা হয়, তাহলে ড্রাইভারকে অবশ্যই vkQueueSignalReleaseImageANDROID() vkAcquireImageANDROID() হস্তক্ষেপ না করে বারবার কল করার অনুমতি দিতে হবে।

শেয়ার করা উপস্থাপনযোগ্য ইমেজ সমর্থন

কিছু ডিভাইস বিলম্ব কমাতে ডিসপ্লে পাইপলাইন এবং ভলকান বাস্তবায়নের মধ্যে একটি একক চিত্রের মালিকানা ভাগ করে নিতে পারে। অ্যান্ড্রয়েড 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গুলি তাদের Vulkan বাস্তবায়ন CTS ব্যবহার করে পরীক্ষা করতে পারে, যার মধ্যে নিম্নলিখিত রয়েছে:

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

Vulkan বৈশিষ্ট্য পতাকা

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

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

  • বিট 0-15 বছর সঞ্চয়
  • বিট 16-23 মাসে সঞ্চয় করে
  • বিট 24-31 দিন সঞ্চয়

বৈশিষ্ট্য পতাকার জন্য ন্যূনতম অনুমোদিত মান হল 0x07E30301 , যা 2019-03-01 তারিখের সাথে মিলে যায়, যেটি Android 10-এর জন্য Vulkan dEQP পরীক্ষার সাথে সম্পর্কিত তারিখ। বৈশিষ্ট্যের পতাকাটি অন্তত এই মানটি হলে, ডিভাইসটি দাবি করে সমস্ত Android 10 Vulkan dEQP পরীক্ষা পাস করুন।

মান 0x07E40301 2020-03-01 তারিখের সাথে মিলে যায়, যেটি Android 11-এর Vulkan dEQP পরীক্ষার সাথে সম্পর্কিত তারিখ৷ বৈশিষ্ট্যের ফ্ল্যাগটি অন্তত এই মানটি হলে, ডিভাইসটি Android 11 Vulkan dEQP পরীক্ষাগুলির সবকটি পাস করার দাবি করে৷

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

একটি ডিভাইস যা একটি নির্দিষ্ট বৈশিষ্ট্যের পতাকা ( যেমন 0x07E30301 , 0x07E40301 , 0x07E60301 ) প্রকাশ করে সেই বৈশিষ্ট্যের পতাকার সমস্ত Android Vulkan dEQP পরীক্ষা পাস করার দাবি করে (যথাক্রমে Android 10, Android 11, Android 13)। এই ডিভাইসটি পরবর্তী Android রিলিজ থেকে Vulkan dEQP পরীক্ষায় উত্তীর্ণ হতে পারে

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