Donanım Oluşturucu HAL'sini uygulama

Donanım Oluşturucu (HWC) HAL kompozit katmanlarının SurfaceFlinger, OpenGL ES (GLES) ve GPU'nun bileşim miktarını azaltır.

HWC, bindirmeler ve 2D kameralar gibi nesneleri soyutlayarak birleşik veriler oluşturur. özel pencere bileşimi donanımıyla haber verir. Böylece, kompozit pencerelerdir. HWC kullanarak pencereleri birleştirmek yerine GPU ile SurfaceFlinger bileşeni. Çoğu GPU, şunun için optimize edilmemiştir: katman oluşturduğunda ve GPU'nun SurfaceFlinger, uygulamalar kendi oluşturma işlemleri için GPU'yu kullanamaz.

HWC uygulamaları şunları desteklemelidir:

  • En az dört yer paylaşımı:
    • Durum çubuğu
    • Sistem çubuğu
    • Uygulama
    • Duvar kağıdı/arka plan
  • Ekrandan daha büyük katmanlar (örneğin, duvar kağıdı)
  • Eş zamanlı önceden çarpımlı piksel başına alfa karıştırma ve düzlem başına alfa karıştırma
  • Korunan video oynatma için donanım yolu
  • RGBA paketleme sırası, YUV biçimleri ve döşeme, kaydırma ve adım adım ilerleme mülkler

HWC'yi uygulamak için:

  1. Operasyonel olmayan bir HWC uygulayın ve tüm beste çalışmalarını GLES.
  2. HWC'ye beste yetkisini artımlı olarak vermek için bir algoritma uygulayın. Örneğin, yer paylaşımına yalnızca ilk üç veya dört yüzey için yetki verin. donanımına sahip olmamızı sağlar.
  3. HWC'yi optimize edin. Bu, şunları içerebilir:
    • GPU'dan alınan yükü en üst düzeye çıkaran ve HWC'ye gönderilir.
    • Ekranın güncellenip güncellenmediği algılanıyor. Doğru değilse başka bir bileşimini HWC yerine GLES olarak kullanabilirsiniz. Ekran tekrar güncellendiğinde, besteyi HWC'ye boşaltmaya devam edin.
    • Aşağıdakiler gibi yaygın kullanım alanlarına hazırlanma:
      • Durum çubuğunu, sistem çubuğunu, uygulamayı içeren ana ekran pencere ve animasyonlu duvar kağıtları
      • Dikey ve yatay modda tam ekran oyunlar
      • Altyazılı ve oynatma özellikli tam ekran video kontrol
      • Korumalı video oynatma
      • Bölünmüş çoklu pencere
ziyaret edin.

HWC temel bileşenleri

HWC, şunları sağlamak için iki temel öğe (katmanlar ve ekranlar) sağlar. kompozisyonu ve bunun ekran donanımıyla etkileşimini temsil eder. İlgili içeriği oluşturmak için kullanılan HWC ayrıca VSYNC üzerinde kontrol ve SurfaceFlinger'a geri çağırma da sağlar bir VSYNC etkinliği oluştuğunda bildirim gönderir.

HIDL arayüzü

Android 8.0 ve sonraki sürümler için Composer HAL adlı HIDL arayüzü iki türetilmiş bir IPC oluşturmaktır. Besteci HAL, eski hwcomposer2.h arayüzü. Satıcılar Composer HAL'si sağlıyorsa HWC'nin uygulanmasından sonra, Composer HAL, SurfaceFlinger'ı kullanabilirsiniz. Tedarikçi firmalar HWC'nin eski bir uygulamasını sağlıyorsa Composer, Composer HAL, hwcomposer2.h işlevindeki işlev işaretçilerini yükler, HIDL çağrılarını işlev işaretçi çağrılarına yönlendirme.

HWC, belirli bir ekranın özelliklerini belirleyen işlevler sağlar; - farklı ekran yapılandırmaları (4k veya 1080p gibi) arasında geçiş yapın çözünürlük) ve renk modları (doğal renk veya gerçek sRGB gibi) ve sonra destekleniyorsa ekranı açar, kapatır veya düşük güç moduna geçirir.

İşlev işaretçileri

Tedarikçiler Composer HAL'yi doğrudan uyguluyorsa SurfaceFlinger işlevlerini çağırır HIDL IPC aracılığıyla öğrenebilirsiniz. Örneğin, bir katman oluşturmak için SurfaceFlinger Composer HAL'sinde createLayer().

Satıcılar hwcomposer2.h arayüzünü uyguluyorsa Composer HAL çağrılarını hwcomposer2.h işlev işaretçilerine çağırır. hwcomposer2.h yorumda, HWC arayüz işlevleri arayüzde bulunmayan küçükCamelCase adlarıyla adlandırılır alan olarak ayarlayabilirsiniz. Neredeyse her işlev bir istekle yüklenir. işlev işaretçisini (getFunction) sağlayan hwc2_device_t. Örneğin, createLayer fonksiyonu olan HWC2_PFN_CREATE_LAYER türünde bir işlev işaretçisi Numaralı HWC2_FUNCTION_CREATE_LAYER değeri şu olduğunda döndürülür: getFunction içerisine aktarıldı.

Composer HAL işlevleri ve HWC işlevi geçişi hakkında ayrıntılı belgeler için işlevleri için bkz. composer. Ayrıntılı belgeler için HWC işlevi işaretçileri için hwcomposer2.h.

Katman ve görüntüleme herkese açık kullanıcı adları

Katmanlar ve ekranlar, HWC tarafından oluşturulan herkese açık kullanıcı adları ile değiştirilir. Tutma yerleri SurfaceFlinger'da opaktır.

SurfaceFlinger yeni bir katman oluşturduğunda createLayer çağırır. Bu, doğrudan için Layer türünü döndüren bir uygulamaları veya geçiş uygulamaları için hwc2_layer_t. Zaman SurfaceFlinger bu katmanın bir özelliğini değiştirir. SurfaceFlinger, hwc2_layer_t değerini uygun değişiklik işlevine aktarın ve değişikliği yapmak için gereken diğer bilgileri içermelidir. İlgili içeriği oluşturmak için kullanılan hwc2_layer_t türü, bir işaretçi veya dizin.

Fiziksel ekranlar hotspot'a eklenerek oluşturulur. Fiziksel bir ekran çalışır durumda olduğunda, HWC bir herkese açık kullanıcı adı oluşturur ve bu tutma yerini SurfaceFlinger'a iletir. geçici olarak devre dışı bırakabilirsiniz. Sanal ekranlar SurfaceFlinger tarafından oluşturulur createVirtualDisplay() aranıyor. HWC sanal görüntü bileşimini destekliyorsa bir herkese açık kullanıcı adı döndürür. Ardından, SurfaceFlinger Serginin bestesini HWC'ye delege eder. HWC, sanal makineyi desteklemiyorsa SurfaceFlinger, herkese açık kullanıcı adını oluşturur ve ekranı birleştirir.

Görüntüleme bileşimi işlemleri

SurfaceFlinger, yeni bir içeriğe sahip olduğunda VSYNC başına bir defa uyanır: birleşimdir. Bu yeni içerik, uygulamalardan alınan yeni resim arabellekleri olabilir veya Bir veya daha fazla katmanın özelliklerinde bir değişiklik. SurfaceFlinger olduğunda onu uyandırır:

  1. Mevcut olan işlemleri gerçekleştirir.
  2. Varsa yeni grafik arabellekleri kilitler.
  3. 1. veya 2. adımın bir değişiklikle sonuçlanması durumunda yeni bir beste yapar değişiklik gösterir.

SurfaceFlinger yeni bir beste yapmak için, uygun şekilde, katmanları yok eden veya katman durumlarını değiştiren. Ayrıca, katmanlarını mevcut içerikleriyle birlikte kullanarak, setLayerBuffer veya setLayerColor. Tüm katmanlar SurfaceFlinger'ın validateDisplay çağrısı yaptığı bu aramada HWC’ye başvurarak katmanların durumunu inceleyebilir ve bileşimin nasıl devam edebilir. SurfaceFlinger varsayılan olarak her katmanı yapılandırmaya çalışır katman HWC tarafından birleştirilir. bazı durumlarda SurfaceFlinger, GPU yedeği aracılığıyla katmanları birleştirir.

validateDisplay numaralı telefona yapılan aramadan sonra, SurfaceFlinger aramaları HWC'nin olup olmadığını görmek için getChangedCompositionTypes işlemini gerçekleştirmeden önce katman bileşimi türlerinden herhangi birinin değiştirilmesini bileşimi. SurfaceFlinger, değişiklikleri kabul etmek için acceptDisplayChanges

Herhangi bir katman SurfaceFlinger kompozisyonu için işaretlenmişse SurfaceFlinger hedef arabellekte birleştirir. SurfaceFlinger ve ardından çağrılar setClientTarget işlevinden yararlanarak arabelleği, arabellek ekranda görüntülenebilir veya şimdiki SurfaceFlinger kompozisyonu için işaretlenmemiş. Herhangi bir katman işaretli değilse SurfaceFlinger bileşimi, SurfaceFlinger beste adımını atlar.

Son olarak, SurfaceFlinger presentDisplay numarasını arayarak HWC'ye eklemeniz gerekir.

Birden çok ekran

Android 10, birden fazla fiziksel ekranı destekler. Android 7.0 ve sonraki sürümlerde kullanılmak üzere tasarlanmış bir HWC uygulaması tasarlarken HWC tanımında yer almayan bazı kısıtlamalar da vardır:

  • Tam olarak bir dahili ekran olduğu varsayılır. Dahili ekranı, başlatma sırasındaki ilk hotspot'un bildirdiği ekrandır. başlatın. Dahili ekran takılıp takıldıktan sonra bağlantıları iptal edebilir.
  • Dahili ekrana ek olarak herhangi bir sayıda harici ekran da hotspot olarak takılabilir cihazın normal çalışma esnasında gösterilebilir. Çerçeve, tüm çalışanların ilk dahili ekrandan sonraki hotspot'lar harici ekrandır, yani daha fazla dahili ekranlar eklendiğinde, bunlar yanlış bir şekilde -Display.TYPE_HDMI Display.TYPE_BUILT_IN.

Yukarıda açıklanan SurfaceFlinger işlemleri gerçekleştirilirken bu reklamlar tüm etkin ekranlarda sırayla gösterilir. yalnızca bir ekranın içeriği güncellendiğinden emin olun.

Örneğin, harici ekran güncellenirse sıra şu şekilde olur:

// In Android 9 and lower:

// Update state for internal display
// Update state for external display
validateDisplay(<internal display>)
validateDisplay(<external display>)
presentDisplay(<internal display>)
presentDisplay(<external display>)

// In Android 10 and higher:

// Update state for internal display
// Update state for external display
validateInternal(<internal display>)
presentInternal(<internal display>)
validateExternal(<external display>)
presentExternal(<external display>)

Sanal görüntü bileşimi

Sanal görüntü bileşimi, harici ekrana benziyor bileşimi. Sanal görüntü bileşimi ile fiziksel arasındaki fark görüntü bileşimi, sanal görüntülerin çıktıyı bir Gralloc arabelleğine göndermesidir. bir alan vardır. Donanım Oluşturucu (HWC), çıkışı bir arabelleğe yazar, tamamlama çitini sağlar ve tamponu tüketiciye (örneğin, video kodlayıcı, GPU, CPU vb.) kullanabilirsiniz. Sanal ekranlar 2D/sesli veya görüntü ardışık düzeni belleğe yazarsa yer paylaşımlı reklamlar oluşturur.

Modlar

SurfaceFlinger, aşağıdakileri çağırdıktan sonra her kare üç moddan birinde olur: validateDisplay() HWC yöntemi:

  • GLES: GPU, tüm katmanları birleştirerek çıkış arabelleğine aktarmanızı sağlar. HWC, beste sürecine dahil değildir.
  • KARMA - GPU, bazı katmanları framebuffer ve HWC, framebuffer'ı ve kalan katmanları bir araya getirir yazmanızı sağlar.
  • HWC: HWC, tüm katmanları birleştirir ve doğrudan yazma işlemleri yapar ekleyeceğim.

Çıkış biçimi

Sanal görüntü arabelleği çıkış biçimleri, modlarına bağlıdır:

  • GLES modu: EGL sürücüsü, çıkış arabelleğini ayarlar biçimi dequeueBuffer() olur (genellikle RGBA_8888). Tüketici, sürücünün ayarladığı çıkış biçimini veya arabellek okunamıyor.
  • KARMA ve HWC modları: Tüketicinin CPU'ya ihtiyacı varsa biçimi tüketici belirler. Aksi halde biçim IMPLEMENTATION_DEFINED ve Gralloc, kullanıma sunuyoruz. Örneğin Gralloc, video kodlayıcı ve HWC, biçimi verimli bir şekilde yazabilir.
ziyaret edin.

Senkronizasyon duvarları

Senkronizasyon (senkronizasyon) sınırları, Android grafiklerinin önemli bir bileşenidir. bahsedeceğim. Raptiyeler, CPU'nun eşzamanlı GPU çalışmalarından bağımsız olarak çalışmasını sağlar. yalnızca gerçek bir bağımlılık olduğunda engelleme yapar.

Örneğin bir uygulama, aynı zamanda bir bir senkronizasyon çiti nesnesi gönderir. Bu çit, müşterinin ne zaman GPU, arabelleğe yazmayı bitirdi.

HWC, arabellekler sonlandırılmadan önce GPU bitirme yazma arabelleklerinin görüntülenir. Senkronizasyon sınırları, arabelleklerle grafik ardışık düzeninden geçer ve tamponlar yazıldığında sinyal gönderir. Bir tampon görüntülenmeden önce, HWC senkronizasyon bölmesinin sinyal verip vermediğini kontrol eder, varsa arabellek.

Sınırları senkronize etme hakkında daha fazla bilgi için Donanım Oluşturucu Entegrasyon.