অ্যান্ড্রয়েডে নতুন পিক্সেল ফর্ম্যাট যোগ করুন

অ্যান্ড্রয়েডে যোগ করা সমস্ত নতুন পিক্সেল ফর্ম্যাট অবশ্যই অ্যান্ড্রয়েড ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (এআইডিএল) এবং অ্যান্ড্রয়েড হার্ডওয়্যার বাফারে (এএইচবি) অন্তর্ভুক্ত করতে হবে। AIDL এবং AHB-এর কঠোর স্থিতিশীলতা এবং মানককরণের প্রয়োজনীয়তা রয়েছে যা কার্যকারিতা প্রসারিত করার সময় একটি সতর্ক প্রক্রিয়ার প্রয়োজন। সমস্ত নতুন পিক্সেল বিন্যাস অবশ্যই AOSP-এ অবতরণ করতে হবে এবং সমস্ত আপডেট অবশ্যই AIDL এবং AHB বিশেষজ্ঞদের দ্বারা পৃথকভাবে নিশ্চিত করতে হবে। প্ল্যাটফর্মে যেকোনো নতুন পিক্সেল ফরম্যাট মানক করার ক্ষেত্রে সতর্কতার সাথে নিশ্চিতকরণের এই প্রক্রিয়াটি একটি গুরুত্বপূর্ণ বিষয়।

এই পৃষ্ঠাটি প্রয়োজনীয় AOSP কোড পরিবর্তন এবং AOSP-এ নতুন পিক্সেল ফর্ম্যাট যোগ করার জন্য প্রয়োজনীয় প্রক্রিয়ার রূপরেখা দেয়।

একটি নতুন পিক্সেল ফর্ম্যাট যোগ করার আগে, উৎসটি ডাউনলোড করুন এবং প্যাচগুলি জমা দেওয়া প্যাচগুলিতে বর্ণিত হিসাবে আপলোড করুন৷

AIDL-এ একটি নতুন পিক্সেল বিন্যাস যোগ করুন

একটি নতুন পিক্সেল বিন্যাসের জন্য সমর্থন যোগ করার জন্য AIDL-এর মধ্যে অবস্থিত PixelFormat.aidl ফাইলগুলির উভয়ই পরিবর্তন করতে হবে। AIDL সোর্স কোডের জন্য hardware/interfaces/graphics/common/aidl/ দেখুন।

AIDL-এ একটি নতুন পিক্সেল ফর্মাল যোগ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. বিদ্যমান কোড কনভেনশন অনুসরণ করে PixelFormat.aidlPixelFormat enum-এর শেষে একটি নতুন এন্ট্রি হিসেবে নতুন পিক্সেল ফরম্যাট যোগ করুন এবং আপনার এন্ট্রির জন্য হেক্স মান আগের এন্ট্রির চেয়ে বেশি সেট করুন। পূর্ববর্তী এন্ট্রির সাথে আপনার কোড পরিবর্তনগুলি মিলান। 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-main: 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.
    
  2. এই ত্রুটিটি সাফ করতে, aidl_api ডিরেক্টরিতে PixelFormat.aidl পরিবর্তন করতে ত্রুটি বার্তায় উল্লেখ করা নিম্নলিখিত কমান্ডটি চালান:

    m android.hardware.graphics.common-update-api
    

    উপরের কমান্ডটি চালানোর ফলে সঠিক ফাইলটি স্বাভাবিকভাবে তৈরি করতে সক্ষম হওয়ার জন্য আপডেট হয়।

AHB-তে একটি নতুন পিক্সেল বিন্যাস যোগ করুন

একটি নতুন পিক্সেল বিন্যাসের জন্য সমর্থন যোগ করার জন্য hardware_buffer.h এবং AHardwareBuffer.cpp এ পরিবর্তন প্রয়োজন। এএইচবি সোর্স কোডের জন্য frameworks/native/libs/nativewindow দেখুন।

AHB-তে একটি নতুন পিক্সেল ফর্মাল যোগ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. hardware_buffer.h এ, AHardwareBuffer_Format enum-এর শেষে নতুন এন্ট্রি হিসেবে নতুন পিক্সেল ফরম্যাট যোগ করুন। বিদ্যমান কোড নিয়মাবলী অনুসরণ করুন.

    RGBA_8888 পিক্সেল ফরম্যাটের উদাহরণ ব্যবহার করে, নতুন পিক্সেল ফরম্যাট এন্ট্রি নিম্নরূপ যোগ করুন:

    /**
     * Corresponding formats:
     *   Vulkan: VK_FORMAT_R8G8B8A8_UNORM
     *   OpenGL ES: GL_RGBA8
     */
    AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1,
    

    মনে রাখবেন যে নতুন পিক্সেল ফর্ম্যাটটিকে AHB-তে একটি নাম দেওয়া হয়েছে, যা অবশ্যই AHARDWAREBUFFER_FORMAT_ দিয়ে শুরু হবে, তারপর চ্যানেলের সংক্ষিপ্ত রূপ এবং বিট গভীরতা এবং এনকোডিং দিয়ে শেষ হবে৷ এই enum এন্ট্রির PixelFormat.aidl এর মতো একই হেক্স মান থাকতে হবে।

    পিক্সেল ফরম্যাটে একটি বা উভয়টি সম্পর্কিত ভলকান বা OpenGL ES ফর্ম্যাট থাকতে পারে বলে আশা করা হচ্ছে। যেখানে উপযুক্ত সেখানে সংশ্লিষ্ট বিন্যাস উল্লেখ করুন। কোনো সংশ্লিষ্ট বিন্যাস বিদ্যমান না থাকলে, N/A উল্লেখ করুন।

  2. CTS-এর অধীনে ঐচ্ছিক পরীক্ষায় পিক্সেল ফর্ম্যাট যোগ করুন, যদি এটির একটি যুক্ত OpenGL ES ফর্ম্যাট থাকে। এটি করার জন্য, AHBFormatAsString(int32_t format) AHardwareBufferGLTest.cppFORMAT_CASE(...) এবং GL_FORMAT_CASE(...) সহ নতুন GL ফর্ম্যাটটি যুক্ত করুন, যা নিম্নরূপ দেখানো হয়েছে:

    const char* AHBFormatAsString(int32_t format) {
      switch (format) {
          ...
          FORMAT_CASE(R8G8B8A8_UNORM);
          ...
          GL_FORMAT_CASE(GL_RGB8);
      }
      return "";
    }
    
  3. এরপরে, 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 মানগুলির অন্তত একটি সেট নির্দিষ্ট করুন৷ প্রয়োজন হলে আরো মান যোগ করুন।

  4. AHardwareBuffer.cpp এ, এর মধ্যে পাওয়া স্ট্যাটিক অ্যাসার্টের শেষ খুঁজুন:

    // ----------------------------------------------------------------------------
    // Validate hardware_buffer.h and PixelFormat.aidl agree
    // ----------------------------------------------------------------------------
    

    নতুন পিক্সেল ফরম্যাটের জন্য একটি নতুন static_assert যোগ করুন, PixelFormat:: enum ব্যবহার করে HAL_PIXEL_FORMAT ধ্রুবকের সাথে নয়। RGBA_8888 পিক্সেল বিন্যাসের জন্য একই উদাহরণ ব্যবহার করে 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");
    
  5. AHardwareBufferTest.cppPrintAhbFormat() এর শেষে নতুন পিক্সেল বিন্যাস যুক্ত করে উপযুক্ত পরীক্ষায় নতুন পিক্সেল বিন্যাস যোগ করুন। বিদ্যমান কোড কনভেনশন অনুসরণ করুন, যেমনটি নীচে দেখানো হয়েছে:

    void PrintAhbFormat(std::ostream& os, uint64_t format) {
        switch (format) {
            ...
            FORMAT_CASE(R8G8B8A8_UNORM);
            default: os << "unknown"; break;
        }
    }
    
  6. HardwareBuffer.javaHardwareBuffer SDK-তে নতুন পিক্সেল ফর্ম্যাট যোগ করুন : @IntDef এ একটি নতুন এন্ট্রি যুক্ত করে। উদাহরণস্বরূপ, RGBA_8888 ফরম্যাটের এন্ট্রিটি নিম্নরূপ দেখানো হয়েছে:

    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = { "RGB", "BLOB", "YCBCR_", "D_", "DS_", "S_" }, value = {
      ...
      RGBA_8888,
    })
    

    যদি উপাদানের মানগুলি স্বাক্ষরবিহীন স্বাভাবিক না হয়, তাহলে ভেরিয়েবলের নামে স্পষ্টভাবে মানটি নির্দেশ করুন। উদাহরণস্বরূপ, একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা 16-বিট লাল চ্যানেলের পরিবর্তনশীল নামটি শুধুমাত্র R_16UI হতে হবে, এবং একটি অতিরিক্ত স্বাক্ষরবিহীন পূর্ণসংখ্যা 16-বিট সবুজ চ্যানেল বিন্যাসের সাথে একই বিন্যাস অবশ্যই RG_16UI16UI হতে হবে।

  7. @Format এর শেষে একটি নতুন পাবলিক মেম্বার ভেরিয়েবল যোগ করে HardwareBuffer.javastatic int হিসেবে নতুন পিক্সেল ফরম্যাট যোগ করুন:

    @Format
    ...
    /** Format: 8 bits each red, green, blue, alpha */
    public static final int RGBA_8888 = 0x1;
    

    এই enum এন্ট্রিতে PixelFormat.aidl এবং hardware_buffer.h এর হেক্স মান একই হতে হবে। বিদ্যমান নিয়মাবলী অনুসরণ করুন.

  8. এই কোড পরিবর্তনগুলির সাথে নির্মাণের প্রচেষ্টা একটি বিল্ড ত্রুটি তৈরি করে:

    android_developer:~/android/aosp-main: 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
    

    উপরের কমান্ডটি চালানোর ফলে সঠিক ফাইলটি স্বাভাবিকভাবে তৈরি করতে সক্ষম হওয়ার জন্য আপডেট হয়।

  9. 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 আপডেট করুন।

নতুন পিক্সেল বিন্যাসের জন্য ভলকান WSI পরিবর্তন

নিম্নরূপ Vulkan WSI আপডেট করুন:
  1. swapchain.cppGetNativePixelFormat(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;
    }
    
  2. পিক্সেল ফরম্যাটে কাজ করার জন্য ভলকান এক্সটেনশনের প্রয়োজন হলে ভলকান এক্সটেনশনটি জিজ্ঞাসা করুন। উদাহরণ সাইড এক্সটেনশনের জন্য, 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::vector props(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;
        }
    }
    

    Google swapchain.cpp এ একটি উদাহরণ বা ডিভাইস এক্সটেনশন প্রকাশ করার জন্য প্রয়োজনীয় অবকাঠামো পরিচালনা করে। Vulkan লোডার থেকে এক্সটেনশন সঠিকভাবে সেটআপ করার জন্য প্রাথমিক পরিবর্তন তালিকার প্রয়োজন নেই।

  3. এরপরে, বিন্যাস এবং কালারস্পেস জোড়া গণনা করুন:
    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});
    }
    

    আপনার অবশ্যই সামঞ্জস্যপূর্ণ বিন্যাস এবং কালারস্পেস জোড়া সম্পর্কে জ্ঞান থাকতে হবে।

  4. external/deqp এ অবস্থিত dEQP-VK তে নতুন ফর্ম্যাট যোগ করুন।
  5. vktApiExternalMemoryTests.cpp এবং vktExternalMemoryUtil.cpp এ Vulkan কনফরমেন্স টেস্ট আপডেট করুন বিদ্যমান সোর্স থেকে প্রয়োজনীয় পরিবর্তনগুলি অনুমান করে বা তথ্যের জন্য আপনার Android সমর্থনের সাথে যোগাযোগ করে।

নতুন পিক্সেল বিন্যাসের জন্য EGL পরিবর্তন

নিম্নরূপ EGL আপডেট করুন:

  1. 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 {
        ...
      }
    }
    
  2. dEQP-এ নতুন ফরম্যাট যোগ করতে, androidFormats enum-এ একটি নতুন এন্ট্রি যোগ করুন, নিম্নরূপ দেখানো হয়েছে:
    static const GLenum androidFormats[] =
    {
      ...
      GL_RGBA8,
      ...
    };
    

আপনার আপডেট জমা দিন

আপনার পরিবর্তন তালিকা স্পিন আপ করতে অবদানকারীদের জন্য অনুসরণ করুন এবং উপযুক্ত দলের সাথে শেয়ার করুন।