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

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

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

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

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

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

যখন সিস্টেম ইমেজ তৈরি করা হয়, তখন অ্যান্ড্রয়েড আশা করে যে সিস্টেমটি জানতে পারবে কোন GPU গুলি উপলব্ধ। লোডার ড্রাইভারটি আবিষ্কার এবং লোড করার জন্য hardware.h এ বিদ্যমান HAL প্রক্রিয়া ব্যবহার করে। 32-বিট এবং 64-বিট 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

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

অ্যান্ড্রয়েড ১৫ থেকে, লোডারটি Vulkan ড্রাইভার লোড করার জন্য APEX সমর্থন করে। APEX থেকে Vulkan লোড করার জন্য Vulkan APEX এর নামে ro.vulkan.apex সেট করুন।

স্তর আবিষ্কার এবং লোডিং

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

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

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

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

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

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

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

ভলকান এপিআই সংস্করণ এবং ক্ষমতা

নিম্নলিখিত টেবিলে বেশ কয়েকটি অ্যান্ড্রয়েড রিলিজের জন্য Vulkan API সংস্করণের তালিকা দেওয়া হয়েছে।
অ্যান্ড্রয়েড সংস্করণ ভলকান সংস্করণ
অ্যান্ড্রয়েড ১৩ ভলকান ১.৩
অ্যান্ড্রয়েড ৯ ভলকান ১.১
অ্যান্ড্রয়েড ৭ ভলকান ১.০

ভলকান ১.৩ কার্যকারিতার ওভারভিউ

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

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

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

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

ভলকান ১.২ কার্যকারিতার ওভারভিউ

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

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

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

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

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

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

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

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

ভলকান সাপোর্ট বেছে নিন

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

অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী ভার্সনের সাথে লঞ্চ হওয়া ডিভাইসগুলিতে অবশ্যই Vulkan 1.3 সাপোর্ট করতে হবে।

অ্যান্ড্রয়েড ১০ এর মাধ্যমে লঞ্চ হওয়া ডিভাইসগুলিতে অবশ্যই Vulkan 1.1 সাপোর্ট করতে হবে।

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

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

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

  1. অ্যান্ড্রয়েড ভার্সনের অতিরিক্ত সিডিডি প্রয়োজনীয়তার পাশাপাশি, এমন একটি ভলকান ড্রাইভার যোগ করুন যা আগ্রহের ভলকান ভার্সন (এটি অবশ্যই ভলকান ভার্সন ১.৩, ১.১, অথবা ১.০ এর মধ্যে একটি হতে হবে) সমর্থন করে। বিকল্পভাবে, কম ভলকান ভার্সন নম্বরের একটি বিদ্যমান ভলকান ড্রাইভার আপডেট করুন।
  2. Vulkan 1.3 বা 1.1 এর জন্য, নিশ্চিত করুন যে প্যাকেজ ম্যানেজার দ্বারা প্রদত্ত সিস্টেম বৈশিষ্ট্যটি সঠিক vulkan সংস্করণের জন্য 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

অ্যান্ড্রয়েড বেসলাইন প্রোফাইল (ABP)

আমরা সমস্ত অ্যান্ড্রয়েড ডিভাইসকে অ্যান্ড্রয়েড বেসলাইন প্রোফাইল গাইডে বর্ণিত সর্বশেষ অ্যান্ড্রয়েড বেসলাইন 2022 প্রোফাইল মেনে চলতে উৎসাহিত করি।

যেকোনো ডিভাইস যা অ্যান্ড্রয়েড ১৪ বা তার উচ্চতর সংস্করণ এবং ভলকান এপিআই সমর্থন করে, তাকে অবশ্যই অ্যান্ড্রয়েড বেসলাইন ২০২১ প্রোফাইলে সংজ্ঞায়িত সমস্ত কার্যকারিতা পূরণ করতে হবে। প্রয়োজনীয় কার্যকারিতার সম্পূর্ণ তালিকা ভলকান প্রোফাইল 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 , অ্যান্ড্রয়েড ১০-এর যেকোনো ভলকান সংস্করণের জন্য বাস্তবায়িত

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

গ্র্যালোক ব্যবহারের পতাকা

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

Android 7.x VkSwapchainImageUsageFlagsANDROID() এর একটি পূর্ববর্তী সংস্করণকে কল করে, যার নাম vkGetSwapchainGrallocUsageANDROID() । Android 8.0 এবং উচ্চতর সংস্করণগুলি vkGetSwapchainGrallocUsageANDROID() অবহেলা করে কিন্তু যদি vkGetSwapchainGrallocUsage2ANDROID() vkGetSwapchainGrallocUsageANDROID() () কে কল করে:

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

vkGetSwapchainGrallocUsageANDROID() সোয়াপচেইন ব্যবহারের পতাকা বা বর্ধিত Gralloc ব্যবহারের পতাকা সমর্থন করে না।

গ্র্যালোক-সমর্থিত ছবি

VkNativeBufferANDROID হল একটি vkCreateImage এক্সটেনশন স্ট্রাকচার যা Gralloc বাফার দ্বারা সমর্থিত একটি ইমেজ তৈরি করে। VkNativeBufferANDROID vkCreateImage() VkImageCreateInfo স্ট্রাকচার চেইনে প্রদান করা হয়। vkCreateSwapchainKHR এ কল করার সময় VkNativeBufferANDROID দিয়ে vkCreateImage() এ কল করা হয়। WSI বাস্তবায়ন swapchain এর জন্য অনুরোধ করা নেটিভ বাফারের সংখ্যা বরাদ্দ করে, তারপর প্রতিটির জন্য একটি 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

অ্যান্ড্রয়েড ৮.০ এবং উচ্চতর সংস্করণে, প্ল্যাটফর্মটি VkImageCreateInfo চেইনে একটি VkSwapchainImageCreateInfoKHR এক্সটেনশন স্ট্রাকচার প্রদান করে যা vkCreateImage কে প্রদান করা হয় যখন swapchain এর জন্য যেকোনো swapchain ইমেজ ব্যবহারের ফ্ল্যাগ প্রয়োজন হয়। এক্সটেনশন স্ট্রাকচারে swapchain ইমেজ ব্যবহারের ফ্ল্যাগ রয়েছে:

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

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

অ্যান্ড্রয়েড ১০ এবং তার পরবর্তী সংস্করণে, প্ল্যাটফর্মটি VK_KHR_swapchain v70 সমর্থন করে, তাই Vulkan অ্যাপটি swapchain মেমোরি দ্বারা সমর্থিত একটি VkImage তৈরি করতে সক্ষম। অ্যাপটি প্রথমে VkImageCreateInfo কাঠামোর সাথে চেইন করা VkImageSwapchainCreateInfoKHR কাঠামো সহ vkCreateImage কল করে। তারপর অ্যাপটি vkBindImageMemory2(KHR) VkBindImageMemorySwapchainInfoKHR কাঠামোর সাথে চেইন করা VkBindImageMemoryInfo কাঠামোর সাথে কল করে। VkBindImageMemorySwapchainInfoKHR কাঠামোতে উল্লেখিত imageIndex অবশ্যই একটি বৈধ swapchain চিত্র সূচক হতে হবে। এদিকে, প্ল্যাটফর্মটি 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 ব্যর্থ হয়ে ত্রুটি ফেরত দিলেও, ড্রাইভারকে তা করতে হবে। যদি 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() এ কল না করেই।

শেয়ার করা উপস্থাপনযোগ্য চিত্র সমর্থন

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

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

  • CtsDeqpTestCases মডিউলে Khronos Vulkan কনফর্মেন্স পরীক্ষা , যার মধ্যে 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-বিট পূর্ণসংখ্যা হিসাবে নিম্নরূপ এনকোড করা হয়েছে:

  • ০-১৫ বিট সারা বছর ধরে সংরক্ষণ করে
  • বিট ১৬-২৩ মাস ধরে সংরক্ষণ করে
  • বিট ২৪-৩১ দিন ধরে সংরক্ষণ করে

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

0x07E40301 মানটি 2020-03-01 তারিখের সাথে মিলে যায়, যা অ্যান্ড্রয়েড 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 পরীক্ষা এড়িয়ে যায় যা - এই ফিচার ফ্ল্যাগ অনুসারে - ডিভাইসটি সমর্থন করে না বলে দাবি করে। এই ধরনের পরীক্ষাগুলিকে তুচ্ছভাবে পাস করা হিসাবে রিপোর্ট করা হয়।