Android'e eklenen tüm yeni piksel biçimleri, Android Arayüz Tanımlama Dili (AIDL) ve Android Donanım Arabelleği (AHB)'ne dahil edilmelidir. AIDL ve AHB, işlevselliği genişletirken dikkatli bir süreç gerektiren katı kararlılık ve standardizasyon koşullarına sahiptir. Tüm yeni piksel biçimlerinin AOSP'ye eklenmesi ve tüm güncellemelerin AIDL ve AHB uzmanları tarafından ayrı ayrı onaylanması gerekir. Bu dikkatli onay süreci, platformdaki yeni piksel biçimlerinin standartlaştırılmasında önemli bir faktördür.
Bu sayfada, gerekli AOSP kodu değişiklikleri ve AOSP'ye yeni piksel biçimleri eklemek için gereken süreç özetlenmektedir.
Yeni bir piksel biçimi eklemeden önce kaynağı indirin ve yamaları Yama gönderme bölümünde belirtildiği şekilde yükleyin.
AIDL'ye yeni bir piksel biçimi ekleme
Yeni bir piksel biçimi için destek eklemek, AIDL'de bulunan PixelFormat.aidl dosyalarının her ikisinde de değişiklik yapılmasını gerektirir. AIDL kaynak kodu için
hardware/interfaces/graphics/common/aidl/ bölümüne bakın.
AIDL'ye yeni bir piksel biçimi eklemek için aşağıdaki adımları uygulayın:
- Mevcut kod kuralına uyarak ve girişinizin onaltılık değerini önceki girişten bir fazla olacak şekilde ayarlayarak
PixelFormat.aidliçindekiPixelFormatenum'unun sonuna yeni piksel biçimini yeni bir giriş olarak ekleyin. Kod değişikliklerinizi önceki girişlerle eşleştirin.RGBA_8888piksel biçimi girişi için aşağıdaki örneğe bakın:/** * 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'da değişiklik yaptıktan sonra kodu oluşturduğunuzda aşağıdaki hata mesajını görürsünüz: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.
-
Bu hatayı temizlemek için hata mesajında belirtildiği gibi aşağıdaki komutu çalıştırarak
aidl_apidizinindekiPixelFormat.aidldeğerini değiştirin:m android.hardware.graphics.common-update-api
Yukarıdaki komutun çalıştırılması, normal şekilde derleme yapabilmek için doğru dosyayı günceller.
AHB'ye yeni bir piksel biçimi ekleme
Yeni bir piksel biçimi için destek eklemek hardware_buffer.h ve AHardwareBuffer.cpp üzerinde değişiklik yapılmasını gerektirir.
AHB kaynak kodu için frameworks/native/libs/nativewindow bölümüne bakın.
AHB'ye yeni bir piksel biçimi eklemek için aşağıdaki adımları uygulayın:
hardware_buffer.hiçinde,AHardwareBuffer_Formatenum'unun sonuna yeni bir giriş olarak yeni piksel biçimini ekleyin. Mevcut kod kurallarına uyun.RGBA_8888piksel biçimi örneğini kullanarak yeni piksel biçimi girişini aşağıdaki gibi ekleyin:/** * Corresponding formats: * Vulkan: VK_FORMAT_R8G8B8A8_UNORM * OpenGL ES: GL_RGBA8 */ AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1,
Yeni piksel biçimine AHB'de bir ad verildiğini unutmayın. Bu ad,
AHARDWAREBUFFER_FORMAT_ile başlamalı, kanal kısaltmaları ve bit derinlikleriyle devam etmeli ve kodlamayla bitmelidir. Bu enum girişi,PixelFormat.aidliçindekiyle aynı onaltılık değere sahip olmalıdır.Piksel biçiminin, ilişkili bir Vulkan veya OpenGL ES biçimine sahip olması beklenir. Gerekirse ilişkili biçimi belirtin. İlişkili bir biçim yoksa
N/Adeğerini belirtin.-
İlişkili bir OpenGL ES biçimi varsa piksel biçimini CTS kapsamındaki isteğe bağlı testlere ekleyin. Bunu yapmak için yeni GL biçimini
AHardwareBufferGLTest.cppAHBFormatAsString(int32_t format)ileFORMAT_CASE(...)veGL_FORMAT_CASE(...)için yeni biçime ekleyin. Bu biçim aşağıdaki gibi gösterilir:const char* AHBFormatAsString(int32_t format) { switch (format) { ... FORMAT_CASE(R8G8B8A8_UNORM); ... GL_FORMAT_CASE(GL_RGB8); } return ""; } -
Ardından,
AHardwareBufferGLTest.cppöğesine aşağıdaki şekilde gösterilen yeni bir test ekleyin: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);En az bir
AHardwareBuffer_Descdeğer grubu belirtin. Gerekirse daha fazla değer ekleyin. -
AHardwareBuffer.cppiçinde, bulunan statik onaylamaların sonunu bulun:// ---------------------------------------------------------------------------- // Validate hardware_buffer.h and PixelFormat.aidl agree // ----------------------------------------------------------------------------
static_assertsabitini değil,PixelFormat::enum'ını kullanarak yeni piksel biçimi için yeni birstatic_assertekleyin.HAL_PIXEL_FORMATAdd a new pixel format to AIDL (AIDL'ye yeni bir piksel biçimi ekleme) başlıklı makaledekiRGBA_8888piksel biçimi için aynı örneği kullanarak yeni piksel biçimi girişini aşağıdaki gibi ekleyin:static_assert(static_cast
(aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888) == AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, "HAL and AHardwareBuffer pixel format don't match"); -
Yeni piksel biçimini,
AHardwareBufferTest.cppiçindePrintAhbFormat()öğesinin sonuna ekleyerek uygun testlere ekleyin. Aşağıda gösterildiği gibi mevcut kod kuralına uyun:void PrintAhbFormat(std::ostream& os, uint64_t format) { switch (format) { ... FORMAT_CASE(R8G8B8A8_UNORM); default: os << "unknown"; break; } } -
Yeni piksel biçimini
HardwareBuffer.javaiçindekiHardwareBufferSDK'sına ekleyin:@IntDeföğesine yeni bir giriş ekleyerek. Örneğin,RGBA_8888biçiminin girişi aşağıdaki gibi gösterilir:@Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "RGB", "BLOB", "YCBCR_", "D_", "DS_", "S_" }, value = { ... RGBA_8888, })Bileşen değerleri işaretsiz normalleştirilmemişse değeri değişken adında açıkça belirtin. Örneğin, yalnızca işaretsiz tam sayı 16 bit kırmızı kanalı biçimindeki değişken adı
R_16UIolmalıdır. Aynı biçimdeki ek işaretsiz tam sayı 16 bit yeşil kanalı biçimindeki değişken adı iseRG_16UI16UIolmalıdır. -
static intolarak yeni piksel biçimini ekleyin.HardwareBuffer.java,@Format'in sonuna yeni bir genel üye değişkeni ekleyerek:@Format ... /** Format: 8 bits each red, green, blue, alpha */ public static final int RGBA_8888 = 0x1;
Bu enum girişi,
PixelFormat.aidlvehardware_buffer.hdeğerleriyle aynı onaltılık değere sahip olmalıdır. Mevcut kurallara uyun. -
Bu kod değişiklikleriyle derleme yapmaya çalışmak derleme hatası oluşturur:
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. ****************************** ...Bu hatayı temizlemek için hata mesajında belirtildiği gibi aşağıdaki komutu çalıştırarak
current.txtdeğerini değiştirin:m api-stubs-docs-non-updatable-update-current-api
Yukarıdaki komutun çalıştırılması, normal şekilde derleme yapabilmek için doğru dosyayı günceller.
-
Yeni piksel biçimini,
HardwareBufferTest.javaiçindekiparamsForTestCreateOptionalFormats()öğesinin sonuna ekleyerek Java testlerine ekleyin. Şu şekilde gösterilir:private static Object[] paramsForTestCreateOptionalFormats() { return new Integer[]{ HardwareBuffer.RGBA_8888 };
Pencere sistemi entegrasyonuna yeni bir piksel biçimi ekleme
Yeni piksel biçimini bir grafik API'sindeki çerçeve arabelleği biçimi olarak kullanmak için ilgili grafik API'si için uygun pencere sistemi entegrasyonuna (WSI) ekleyin. Vulkan API'yi kullanan bir uygulama veya sistem süreci için Vulkan Swapchain'i güncelleyin. OpenGL ES API'yi kullanan bir uygulama veya sistem süreci için EGL API'sini güncelleyin.
Yeni piksel biçimleri için Vulkan WSI değişiklikleri
Vulkan WSI'yi aşağıdaki şekilde güncelleyin:
-
swapchain.cppiçindeGetNativePixelFormat(VkFormat format)işlevine yeni bir durum ekleyin: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; } - Piksel biçiminin çalışması için Vulkan uzantısı gerekiyorsa Vulkan uzantısını sorgulayın.
Örneğin, yan uzantılar için
instance_datasimgesini aşağıdaki gibi kullanın:bool colorspace_ext = instance_data.hook_extensions.test(ProcHook::EXT_swapchain_colorspace);
Cihaz tarafı uzantıları için aşağıdakileri kullanın:
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; } } Google, bir örnek veya cihaz uzantısını
swapchain.cpp'ya sunmak için gereken altyapıyı yönetir. İlk değişiklik listesinin, Vulkan yükleyicisinden uzantıların doğru şekilde ayarlanmasını gerektirmez. - Ardından, biçim ve renk alanı çiftlerini numaralandırın:
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}); }Uyumlu biçim ve renk alanı çiftleri hakkında bilgi sahibi olmanız gerekir.
- Yeni biçimi
dEQP-VKkonumundakiexternal/deqpbölümüne ekleyin. - Mevcut kaynaktan gerekli değişiklikleri çıkararak veya bilgi için Android Destek Ekibi ile iletişime geçerek
vktApiExternalMemoryTests.cppvevktExternalMemoryUtil.cpp'daki Vulkan Uygunluk Testleri'ni güncelleyin.
Yeni piksel biçimleri için EGL değişiklikleri
EGL'yi aşağıdaki şekilde güncelleyin:
getNativePixelFormat()işlevinde, yeni piksel biçimi için AIDL enum'unu döndürmek üzereif-elseağacını değiştirin.RGBA_8888piksel biçimi örneğini kullanarak:if (a == 0) { ... } else { if (componentType == EGL_COLOR_COMPONENT_TYPE_FIXED_EXT) { if (colorDepth > 24) { ... } else { *format = PixelFormat::RGBA_8888; } } else { ... } }- Yeni biçimi dEQP'ye eklemek için
androidFormatsenum'una aşağıdaki gibi yeni bir giriş ekleyin:static const GLenum androidFormats[] = { ... GL_RGBA8, ... };
Güncellemenizi gönderme
Değişiklik listelerinizi oluşturmak ve bunları uygun ekiple paylaşmak için katkıda bulunanlar bölümündeki talimatları uygulayın.