অ্যান্ড্রয়েডে যোগ করা সমস্ত নতুন পিক্সেল ফর্ম্যাট অবশ্যই অ্যান্ড্রয়েড ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (AIDL) এবং অ্যান্ড্রয়েড হার্ডওয়্যার বাফার (AHB) -এ অন্তর্ভুক্ত করতে হবে। AIDL এবং AHB-এর কঠোর স্থিতিশীলতা এবং মানসম্মতকরণের প্রয়োজনীয়তা রয়েছে যার জন্য কার্যকারিতা সম্প্রসারণের সময় একটি সতর্কতামূলক প্রক্রিয়া প্রয়োজন। সমস্ত নতুন পিক্সেল ফর্ম্যাটকে AOSP-তে অবতরণ করতে হবে এবং সমস্ত আপডেট AIDL এবং AHB বিশেষজ্ঞদের দ্বারা পৃথকভাবে নিশ্চিত করতে হবে। প্ল্যাটফর্মে যেকোনো নতুন পিক্সেল ফর্ম্যাটকে মানসম্মত করার ক্ষেত্রে সতর্কতামূলক নিশ্চিতকরণের এই প্রক্রিয়াটি একটি গুরুত্বপূর্ণ বিষয়।
এই পৃষ্ঠায় AOSP কোডের প্রয়োজনীয় পরিবর্তনগুলি এবং AOSP-তে নতুন পিক্সেল ফর্ম্যাট যুক্ত করার জন্য প্রয়োজনীয় প্রক্রিয়াটি বর্ণনা করা হয়েছে।
নতুন পিক্সেল ফর্ম্যাট যোগ করার আগে, সোর্সটি ডাউনলোড করুন এবং Submitting patches এ বর্ণিত প্যাচগুলি আপলোড করুন।
AIDL-এ একটি নতুন পিক্সেল ফর্ম্যাট যোগ করুন
নতুন পিক্সেল ফর্ম্যাটের জন্য সমর্থন যোগ করার জন্য AIDL-এর মধ্যে অবস্থিত PixelFormat.aidl ফাইল উভয়েই পরিবর্তন করতে হবে। AIDL সোর্স কোডের জন্য hardware/interfaces/graphics/common/aidl/ দেখুন।
AIDL-এ একটি নতুন পিক্সেল ফর্ম্যাট যোগ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
-
PixelFormat.aidlএPixelFormatenum-এর শেষে নতুন পিক্সেল ফর্ম্যাটটি একটি নতুন এন্ট্রি হিসেবে যুক্ত করুন, বিদ্যমান কোড কনভেনশন অনুসরণ করে এবং আপনার এন্ট্রির হেক্স মান পূর্ববর্তী এন্ট্রির চেয়ে একটি বেশি করে সেট করুন। আপনার কোড পরিবর্তনগুলি পূর্ববর্তী এন্ট্রিগুলির সাথে মেলান।RGBA_8888পিক্সেল ফর্ম্যাট এন্ট্রির জন্য নিম্নলিখিত উদাহরণটি দেখুন:/** * 32-bit format that has 8-bit R, G, B, and A components, in that order, * from the lowest memory address to the highest memory address. * * The component values are unsigned normalized to the range [0, 1], whose * interpretation is defined by the dataspace. */ RGBA_8888 = 0x1,
PixelFormat.aidlএ পরিবর্তন করার পর কোডটি তৈরি করার সময় আপনি নিম্নলিখিত ত্রুটি বার্তাটি দেখতে পাবেন:android_developer:~/android/aosp-android-latest-release: m ... ############################################################################### # ERROR: AIDL API change detected # ############################################################################### Above AIDL file(s) has changed. Run `m android.hardware.graphics.common-update-api` to reflect the changes to the current version so that it is reviewed by android-aidl-api-council@google.com And then you need to change dependency on android.hardware.graphics.common-V(n)-* to android.hardware.graphics.common-V(n+1)-* to use new APIs.
এই ত্রুটিটি দূর করতে,
aidl_apiডিরেক্টরিতেPixelFormat.aidlপরিবর্তন করতে ত্রুটি বার্তায় উল্লেখিত কমান্ডটি চালান:m android.hardware.graphics.common-update-api
উপরের কমান্ডটি চালানোর ফলে সঠিক ফাইলটি আপডেট হয় যাতে এটি স্বাভাবিকভাবে তৈরি করা যায়।
AHB তে একটি নতুন পিক্সেল ফর্ম্যাট যোগ করুন
নতুন পিক্সেল ফরম্যাটের জন্য সমর্থন যোগ করার জন্য hardware_buffer.h এবং AHardwareBuffer.cpp এ পরিবর্তন প্রয়োজন। AHB সোর্স কোডের জন্য frameworks/native/libs/nativewindow দেখুন।
AHB তে একটি নতুন পিক্সেল ফর্ম্যাট যোগ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:
-
hardware_buffer.hএ,AHardwareBuffer_Formatenum এর শেষে একটি নতুন এন্ট্রি হিসেবে নতুন পিক্সেল ফর্ম্যাট যুক্ত করুন। বিদ্যমান কোড কনভেনশনগুলি অনুসরণ করুন।RGBA_8888পিক্সেল ফর্ম্যাটের উদাহরণ ব্যবহার করে, নতুন পিক্সেল ফর্ম্যাট এন্ট্রিটি নিম্নরূপ যোগ করুন:/** * Corresponding formats: * Vulkan: VK_FORMAT_R8G8B8A8_UNORM * OpenGL ES: GL_RGBA8 */ AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1,
মনে রাখবেন যে নতুন পিক্সেল ফর্ম্যাটের AHB তে একটি নাম দেওয়া হয়েছে, যা
AHARDWAREBUFFER_FORMAT_দিয়ে শুরু হতে হবে, এরপর চ্যানেলের সংক্ষিপ্ত রূপ এবং বিট ডেপথ লিখতে হবে এবং এনকোডিং দিয়ে শেষ হতে হবে। এই enum এন্ট্রিরPixelFormat.aidlতে থাকা হেক্স মান অবশ্যই একই হতে হবে।পিক্সেল ফর্ম্যাটে Vulkan বা OpenGL ES ফর্ম্যাটের যেকোনো একটি বা উভয়ই থাকবে বলে আশা করা হচ্ছে। যেখানে উপযুক্ত সেখানে সংশ্লিষ্ট ফর্ম্যাটটি উল্লেখ করুন। যদি কোনও সংশ্লিষ্ট ফর্ম্যাট না থাকে, তাহলে
N/Aউল্লেখ করুন। CTS এর অধীনে ঐচ্ছিক পরীক্ষায় পিক্সেল ফর্ম্যাট যোগ করুন, যদি এর সাথে সম্পর্কিত OpenGL ES ফর্ম্যাট থাকে। এটি করার জন্য,
AHardwareBufferGLTest.cppএAHBFormatAsString(int32_t format)তেFORMAT_CASE(...)এবংGL_FORMAT_CASE(...)সহ নতুন ফর্ম্যাটের জন্য নতুন GL ফর্ম্যাট যোগ করুন, যা নিম্নরূপ দেখানো হয়েছে:const char* AHBFormatAsString(int32_t format) { switch (format) { ... FORMAT_CASE(R8G8B8A8_UNORM); ... GL_FORMAT_CASE(GL_RGB8); } return ""; }এরপর,
AHardwareBufferGLTest.cppতে একটি নতুন পরীক্ষা যোগ করুন, যা নিম্নরূপ দেখানো হয়েছে:class RGBA8Test : public AHardwareBufferGLTest {}; // Verify that if we can allocate an RGBA8 AHB we can render to it. TEST_P(RGBA8Test, Write) { AHardwareBuffer_Desc desc = GetParam(); desc.usage = AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER; if (!SetUpBuffer(desc)) { return; } ASSERT_NO_FATAL_FAILURE(SetUpFramebuffer(desc.width, desc.height, 0, kBufferAsRenderbuffer)); ASSERT_NO_FATAL_FAILURE( SetUpProgram(kVertexShader, kColorFragmentShader, kPyramidPositions, 0.5f)); glDrawArrays(GL_TRIANGLES, 0, kPyramidVertexCount); ASSERT_EQ(GLenum{GL_NO_ERROR}, glGetError()); } INSTANTIATE_TEST_CASE_P( SingleLayer, RGBA8Test, ::testing::Values( AHardwareBuffer_Desc{57, 33, 1, AHARDWAREBUFFER_FORMAT_R16G16_UINT, 0, 0, 0, 0}), &GetTestName);AHardwareBuffer_Descমানের অন্তত একটি সেট উল্লেখ করুন। প্রয়োজনে আরও মান যোগ করুন।AHardwareBuffer.cppতে, এর মধ্যে পাওয়া স্ট্যাটিক অ্যাসারটের শেষটি খুঁজুন:// ---------------------------------------------------------------------------- // Validate hardware_buffer.h and PixelFormat.aidl agree // ----------------------------------------------------------------------------
নতুন পিক্সেল ফর্ম্যাটের জন্য একটি নতুন
static_assertযোগ করুন,PixelFormat::enum ব্যবহার করে এবংHAL_PIXEL_FORMATধ্রুবক ব্যবহার না করে।RGBA_8888পিক্সেল ফর্ম্যাটের জন্য একই উদাহরণ ব্যবহার করে Add a new pixel format to AIDL থেকে, নতুন পিক্সেল ফর্ম্যাট এন্ট্রিটি নিম্নরূপ যোগ করুন:static_assert(static_cast
(aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888) == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, "HAL and AHardwareBuffer pixel format don't match"); AHardwareBufferTest.cppএরPrintAhbFormat()এর শেষে নতুন পিক্সেল ফর্ম্যাটটি যুক্ত করে উপযুক্ত পরীক্ষাগুলিতে নতুন পিক্সেল ফর্ম্যাট যুক্ত করুন। নীচে দেখানো কোড কনভেনশন অনুসরণ করুন:void PrintAhbFormat(std::ostream& os, uint64_t format) { switch (format) { ... FORMAT_CASE(R8G8B8A8_UNORM); default: os << "unknown"; break; } }HardwareBuffer.javaতেHardwareBufferSDK তে নতুন পিক্সেল ফর্ম্যাট যোগ করুন:@IntDefতে একটি নতুন এন্ট্রি যোগ করে। উদাহরণস্বরূপ,RGBA_8888ফর্ম্যাটের এন্ট্রিটি নিম্নরূপ দেখানো হয়েছে:@Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "RGB", "BLOB", "YCBCR_", "D_", "DS_", "S_" }, value = { ... RGBA_8888, })যদি কম্পোনেন্টের মানগুলি স্বাক্ষরবিহীন স্বাভাবিক না করা হয়, তাহলে ভেরিয়েবলের নামে স্পষ্টভাবে মানটি নির্দেশ করুন। উদাহরণস্বরূপ, একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা 16-বিট লাল চ্যানেলের জন্য ভেরিয়েবলের নামটি
R_16UIহতে হবে, এবং অতিরিক্ত স্বাক্ষরবিহীন পূর্ণসংখ্যা 16-বিট সবুজ চ্যানেলের ফর্ম্যাটের সাথে একই ফর্ম্যাটটিRG_16UI16UIহতে হবে।@Formatএর শেষে একটি নতুন পাবলিক সদস্য ভেরিয়েবল যোগ করেHardwareBuffer.javaতে একটিstatic intহিসেবে নতুন পিক্সেল ফর্ম্যাট যোগ করুন:@Format ... /** Format: 8 bits each red, green, blue, alpha */ public static final int RGBA_8888 = 0x1;
এই enum এন্ট্রির অবশ্যই
PixelFormat.aidlএবংhardware_buffer.hএর হেক্স মান একই হতে হবে। বিদ্যমান নিয়মাবলী অনুসরণ করুন।- এই কোড পরিবর্তনগুলি ব্যবহার করে বিল্ড করার চেষ্টা করলে একটি বিল্ড ত্রুটি তৈরি হয়:
android_developer:~/android/aosp-android-latest-release: m ... ****************************** You have tried to change the API from what has been previously approved. To make these errors go away, you have two choices: 1. You can add '@hide' javadoc comments (and remove @SystemApi/@TestApi/etc) to the new methods, etc. shown in the above diff. 2. You can update current.txt and/or removed.txt by executing the following command: m api-stubs-docs-non-updatable-update-current-api To submit the revised current.txt to the main Android repository, you will need approval. ****************************** ...এই ত্রুটিটি দূর করতে, ত্রুটি বার্তায় উল্লেখিত কমান্ডটি চালান,
current.txtপরিবর্তন করতে:m api-stubs-docs-non-updatable-update-current-api
উপরের কমান্ডটি চালানোর ফলে সঠিক ফাইলটি আপডেট হয় যাতে এটি স্বাভাবিকভাবে তৈরি করা যায়।
HardwareBufferTest.javaতেparamsForTestCreateOptionalFormats()এর শেষে নতুন পিক্সেল ফর্ম্যাট যুক্ত করে জাভা পরীক্ষায় নতুন পিক্সেল ফর্ম্যাট যুক্ত করুন, যা নিম্নরূপ দেখানো হয়েছে:private static Object[] paramsForTestCreateOptionalFormats() { return new Integer[]{ HardwareBuffer.RGBA_8888 };
উইন্ডো সিস্টেম ইন্টিগ্রেশনে একটি নতুন পিক্সেল ফর্ম্যাট যোগ করুন
গ্রাফিক্স API-তে ফ্রেমবাফারের ফর্ম্যাট হিসেবে নতুন পিক্সেল ফর্ম্যাট ব্যবহার করতে, প্রাসঙ্গিক গ্রাফিক্স API-এর জন্য উপযুক্ত উইন্ডো সিস্টেম ইন্টিগ্রেশন (WSI) তে এটি যোগ করুন। Vulkan API ব্যবহার করে এমন একটি অ্যাপ বা সিস্টেম প্রক্রিয়ার জন্য, Vulkan Swapchain আপডেট করুন। OpenGL ES API ব্যবহার করে এমন একটি অ্যাপ বা সিস্টেম প্রক্রিয়ার জন্য, EGL API আপডেট করুন।
নতুন পিক্সেল ফর্ম্যাটের জন্য Vulkan WSI পরিবর্তন
নিম্নরূপ Vulkan WSI আপডেট করুন:
swapchain.cppতেGetNativePixelFormat(VkFormat format)ফাংশনে একটি নতুন কেস যোগ করুন:android::PixelFormat GetNativePixelFormat(VkFormat format) { ... switch (format) { ... case VK_FORMAT_R8G8B8A8_UNORM: native_format = PixelFormat::RGBA_8888; break; ... default: ALOGV("unsupported swapchain format %d", format); break; } return native_format; }- যদি পিক্সেল ফর্ম্যাটের জন্য Vulkan এক্সটেনশনের প্রয়োজন হয়, তাহলে Vulkan এক্সটেনশনটি জিজ্ঞাসা করুন। উদাহরণস্বরূপ, পার্শ্ব এক্সটেনশনের জন্য,
instance_dataব্যবহার করুন, যা নিম্নরূপ দেখানো হয়েছে:bool colorspace_ext = instance_data.hook_extensions.test(ProcHook::EXT_swapchain_colorspace);
ডিভাইস সাইড এক্সটেনশনের জন্য, নিম্নলিখিতগুলি ব্যবহার করুন:
bool rgba10x6_formats_ext = false; uint32_t exts_count; const auto& driver = GetData(pdev).driver; driver.EnumerateDeviceExtensionProperties(pdev, nullptr, &exts_count, nullptr); std::vectorprops(exts_count); driver.EnumerateDeviceExtensionProperties(pdev, nullptr, &exts_count, props.data()); for (uint32_t i = 0; i < exts_count; i++) { VkExtensionProperties prop = props[i]; if (strcmp(prop.extensionName, VK_EXT_RGBA10X6_FORMATS_EXTENSION_NAME) == 0) { rgba10x6_formats_ext = true; } } swapchain.cppতে একটি ইনস্ট্যান্স বা ডিভাইস এক্সটেনশন প্রকাশ করার জন্য প্রয়োজনীয় পরিকাঠামো Google পরিচালনা করে। Vulkan লোডার থেকে এক্সটেনশনগুলি সঠিকভাবে সেটআপ করার জন্য প্রাথমিক পরিবর্তন তালিকার প্রয়োজন হয় না। - এরপর, বিন্যাস এবং রঙিন স্থানের জোড়াগুলি গণনা করুন:
desc.format = AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM; if (AHardwareBuffer_isSupported(&desc) && rgba10x6_formats_ext) { all_formats.emplace_back( VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR}); if (colorspace_ext) { all_formats.emplace_back( VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_COLOR_SPACE_PASS_THROUGH_EXT}); all_formats.emplace_back( VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT}); }আপনার অবশ্যই সামঞ্জস্যপূর্ণ বিন্যাস এবং রঙিন স্থান জোড়া সম্পর্কে জ্ঞান থাকতে হবে।
-
external/deqpএ অবস্থিতdEQP-VKতে নতুন ফর্ম্যাটটি যোগ করুন। -
vktApiExternalMemoryTests.cppএবংvktExternalMemoryUtil.cppএ Vulkan Conformance Tests আপডেট করুন, বিদ্যমান উৎস থেকে প্রয়োজনীয় পরিবর্তনগুলি অনুমান করে অথবা তথ্যের জন্য আপনার Android সহায়তার সাথে যোগাযোগ করে।
নতুন পিক্সেল ফর্ম্যাটের জন্য EGL পরিবর্তন
EGL নিম্নরূপ আপডেট করুন:
-
getNativePixelFormat()ফাংশনে, নতুন পিক্সেল ফর্ম্যাটের জন্য AIDL enum ফেরত দিতেif-elseট্রিটি পরিবর্তন করুন।RGBA_8888পিক্সেল ফর্ম্যাটের উদাহরণ ব্যবহার করে:if (a == 0) { ... } else { if (componentType == EGL_COLOR_COMPONENT_TYPE_FIXED_EXT) { if (colorDepth > 24) { ... } else { *format = PixelFormat::RGBA_8888; } } else { ... } } - dEQP তে নতুন ফর্ম্যাট যোগ করতে,
androidFormatsenum তে একটি নতুন এন্ট্রি যোগ করুন, যা নিম্নরূপ দেখানো হয়েছে:static const GLenum androidFormats[] = { ... GL_RGBA8, ... };
আপনার আপডেট জমা দিন
আপনার পরিবর্তন তালিকাগুলি স্পিন করার জন্য এবং উপযুক্ত দলের সাথে শেয়ার করার জন্য অবদানকারীদের জন্য অনুসরণ করুন।