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

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

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

নতুন পিক্সেল ফর্ম্যাট যোগ করার আগে, সোর্সটি ডাউনলোড করুন এবং Submitting patches এ বর্ণিত প্যাচগুলি আপলোড করুন।

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-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.
    
  2. এই ত্রুটিটি দূর করতে, aidl_api ডিরেক্টরিতে PixelFormat.aidl পরিবর্তন করতে ত্রুটি বার্তায় উল্লেখিত কমান্ডটি চালান:

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

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

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

নতুন পিক্সেল ফরম্যাটের জন্য সমর্থন যোগ করার জন্য hardware_buffer.h এবং AHardwareBuffer.cpp এ পরিবর্তন প্রয়োজন। AHB সোর্স কোডের জন্য 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 তে থাকা হেক্স মান অবশ্যই একই হতে হবে।

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

  2. CTS এর অধীনে ঐচ্ছিক পরীক্ষায় পিক্সেল ফর্ম্যাট যোগ করুন, যদি এর সাথে সম্পর্কিত OpenGL ES ফর্ম্যাট থাকে। এটি করার জন্য, AHardwareBufferGLTest.cppAHBFormatAsString(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 "";
    }
    
  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 পিক্সেল ফর্ম্যাটের জন্য একই উদাহরণ ব্যবহার করে 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");
    
  5. AHardwareBufferTest.cpp এর PrintAhbFormat() এর শেষে নতুন পিক্সেল ফর্ম্যাটটি যুক্ত করে উপযুক্ত পরীক্ষাগুলিতে নতুন পিক্সেল ফর্ম্যাট যুক্ত করুন। নীচে দেখানো কোড কনভেনশন অনুসরণ করুন:

    void PrintAhbFormat(std::ostream& os, uint64_t format) {
        switch (format) {
            ...
            FORMAT_CASE(R8G8B8A8_UNORM);
            default: os << "unknown"; break;
        }
    }
    
  6. HardwareBuffer.java তে HardwareBuffer 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.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 এর হেক্স মান একই হতে হবে। বিদ্যমান নিয়মাবলী অনুসরণ করুন।

  8. এই কোড পরিবর্তনগুলি ব্যবহার করে বিল্ড করার চেষ্টা করলে একটি বিল্ড ত্রুটি তৈরি হয়:

    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
    

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

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

নতুন পিক্সেল ফর্ম্যাটের জন্য Vulkan WSI পরিবর্তন

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

  1. 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;
    }
    
  2. যদি পিক্সেল ফর্ম্যাটের জন্য 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::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;
        }
    }
    

    swapchain.cpp তে একটি ইনস্ট্যান্স বা ডিভাইস এক্সটেনশন প্রকাশ করার জন্য প্রয়োজনীয় পরিকাঠামো Google পরিচালনা করে। 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 Conformance Tests আপডেট করুন, বিদ্যমান উৎস থেকে প্রয়োজনীয় পরিবর্তনগুলি অনুমান করে অথবা তথ্যের জন্য আপনার 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,
      ...
    };
    

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

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