Donanım Oluşturucu (HWC) HAL, SurfaceFlinger'dan alınan katmanları birleştirerek OpenGL ES (GLES) ve GPU'nun gerçekleştirdiği kompozisyon miktarını azaltır.
HWC, yüzeyleri birleştirmek için yer paylaşımları ve 2D blitter'ler gibi nesneleri soyutlar ve pencereleri birleştirmek için özel pencere oluşturma donanımıyla iletişim kurar. SurfaceFlinger'ın GPU ile birleştirmesini beklemek yerine pencereleri birleştirmek için HWC'yi kullanın. Ç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 (ör. duvar kağıdı)
- Aynı anda piksel başına önceden çarpılmış alfa harmanlaması ve düzlem başına alfa harmanlaması
- Korunan video oynatma için donanım yolu
- RGBA paketleme sırası, YUV biçimleri ve tiling, swizzling ve stride özellikleri
HWC'yi uygulamak için:
- Operasyonel olmayan bir HWC uygulayın ve tüm beste çalışmalarını GLES.
- HWC'ye beste yetkisini artımlı olarak vermek için bir algoritma uygulayın. Örneğin, HWC'nin yer paylaşımı donanımına yalnızca ilk üç veya dört yüzeyi atayın.
- HWC'yi optimize edin. Bu ayar ve özellikler arasında şunlar yer alabilir:
- GPU'dan alınan yükü en üst düzeye çıkaran yüzeyleri seçip bunları HWC'ye gönderme.
- Ekranın güncellenip güncellenmediği algılanıyor. Aksi takdirde, güç tasarrufu yapmak için derlemeyi HWC yerine GLES'e atayın. Ekran tekrar güncellendiğinde, derlemeyi HWC'ye aktarmaya 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
- Korunan video oynatma
- Bölünmüş ekran çoklu pencere
HWC temel bileşenleri
HWC, kompozisyon çalışmasını ve ekran donanımıyla etkileşimini temsil etmek için iki primitif (katmanlar ve ekranlar) sağlar. İ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, HWC ile SurfaceFlinger arasında bağlayıcılı IPC için Composer HAL adlı bir HIDL arayüzü kullanır. Composer HAL, eski hwcomposer2.h
arayüzünün yerini alır. Tedarikçiler HWC için bir Composer HAL uygulaması sağlarsa Composer HAL, SurfaceFlinger'dan gelen HIDL çağrılarını doğrudan kabul eder. Tedarikçiler HWC'nin eski bir uygulamasını sağlıyorsa Composer HAL, işlev işaretçilerini hwcomposer2.h
'den yükler ve HIDL çağrılarını işlev işaretçisi çağrılarına yönlendirir.
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'i doğrudan uygularsa SurfaceFlinger, işlevlerini HIDL IPC aracılığıyla çağırır. Ö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, hwc2_device_t
tarafından sağlanan getFunction
kullanılarak işlev işaretçisi istenerek yüklenir. Örneğin, createLayer
işlevi, HWC2_PFN_CREATE_LAYER
türüne sahip bir işlev işaretçisidir ve HWC2_FUNCTION_CREATE_LAYER
listelenmiş değeri getFunction
'a iletildiğinde döndürülür.
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 ekran sapları
Katmanlar ve ekranlar, HWC tarafından oluşturulan tutamaçlarla değiştirilir. Tutma yerleri SurfaceFlinger'da opaktır.
SurfaceFlinger yeni bir katman oluşturduğunda createLayer
işlevini çağırır. Bu işlev, doğrudan uygulamalar için Layer
türü veya geçiş uygulamaları için hwc2_layer_t
türü döndürür. 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. hwc2_layer_t
türü, bir işaretçi veya dizin tutacak kadar büyüktür.
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 ekran kompozisyonunu desteklemiyorsa SurfaceFlinger, imleci oluşturur ve ekranı oluşturur.
Görüntü 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 tarafından uyandırıldığında:
- Mevcut olan işlemleri gerçekleştirir.
- Varsa yeni grafik arabelleklerini sabitler.
- 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 güncellendikten sonra SurfaceFlinger, validateDisplay
işlevini çağırır. Bu işlev, HWC'ye katmanların durumunu incelemesini ve kompozisyonun nasıl ilerleyeceğini belirlemesini söyler. 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
işlevini çağırır.
Herhangi bir katman SurfaceFlinger kompozisyonu için işaretlenmişse SurfaceFlinger
hedef arabellekte birleştirir. Ardından SurfaceFlinger, arabelleği ekrana vermek için setClientTarget
işlevini çağırır. Böylece arabellek ekranda görüntülenebilir veya SurfaceFlinger kompozisyonu için işaretlenmemiş katmanlarla daha da birleştirilebilir. 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 tasarlanan bir HWC uygulamasında, HWC tanımında bulunmayan bazı kısıtlamalar vardır:
- Tam olarak bir dahili ekran olduğu varsayılır. Dahili ekran, önyükleme sırasında ilk hotplug'ın bildirdiği ekrandır. Dahili ekran, sıcak takıldıktan sonra bağlantısı kesilemez.
- Dahili ekrana ek olarak, cihazın normal çalışması sırasında herhangi bir sayıda harici ekran takılabilir. Ç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 ekran başına gerçekleştirilir ancak yalnızca bir ekranın içeriği güncellense bile tüm etkin ekranlar için sırayla gerçekleştirilir.
Ö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 ekran kompozisyonu
Sanal görüntü bileşimi, harici ekrana benziyor bileşimi. Sanal görüntü bileşimi ile fiziksel görüntü 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 arabelleği bir tüketiciye (ör. video kodlayıcı, GPU, CPU vb.) gönderir. Görüntü ardışık düzeni belleğe yazarsa sanal ekranlar 2D/blitter veya yer paylaşımları kullanabilir.
Modlar
SurfaceFlinger, validateDisplay()
HWC yöntemini çağrdıktan sonra her çerçeve üç moddan birinde olur:
- 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 çıkış arabelleğine yazar.
Çı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ği biçimini
dequeueBuffer()
olarak (genellikleRGBA_8888
) ayarlar. 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 takdirde biçim
IMPLEMENTATION_DEFINED
olur ve Gralloc, kullanım işaretlerine göre en iyi biçimi ayarlar. Örneğin Gralloc, video kodlayıcı ve HWC, biçimi verimli bir şekilde yazabilir.
Senkronizasyon duvarları
Senkronizasyon (senkronizasyon) sınırları, Android grafiklerinin önemli bir bileşenidir. bahsedeceğim. Çitler, CPU çalışmasının eşzamanlı GPU çalışmasından bağımsız olarak ilerlemesine olanak tanır ve yalnızca gerçek bir bağımlılık olduğunda engeller.
Ö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 çitleri, grafik ardışık düzeninden arabellekler ve arabellekler yazılırken sinyal ile geçirilir. 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.