Donanım Oluşturucu (HWC) HAL, SurfaceFlinger'dan alınan katmanları birleştirerek OpenGL ES (GLES) ve GPU'nun gerçekleştirdiği bileşim miktarını azaltır.
HWC, kaplamalar ve 2 boyutlu parçacıklar gibi nesneleri kompozit yüzeylere soyutlar ve özel pencere kompozisyon donanımıyla kompozit pencerelerle iletişim kurar. SurfaceFlinger'ın GPU ile birleşimi yerine pencereleri birleştirmek için HWC'yi kullanın. Çoğu GPU kompozisyon için optimize edilmemiştir ve GPU, SurfaceFlinger'dan katmanlar oluşturduğunda uygulamalar GPU'yu kendi oluşturma işlemleri için kullanamaz.
HWC uygulamaları şunları desteklemelidir:
- En az dört kaplama:
- 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 çoğaltılmış piksel başına alfa harmanlama ve düzlem başına alfa harmanlama
- Korumalı video oynatımı için donanım yolu
- RGBA paketleme sırası, YUV formatları ve döşeme, kaydırma ve adım özellikleri
HWC'yi uygulamak için:
- Operasyonel olmayan bir HWC uygulayın ve tüm kompozisyon çalışmalarını GLES'e gönderin.
- Kompozisyonu HWC'ye aşamalı olarak devretmek için bir algoritma uygulayın. Örneğin, yalnızca ilk üç veya dört yüzeyi HWC'nin kaplama donanımına devredin.
- HWC'yi optimize edin. Bu şunları içerebilir:
- GPU'dan alınan yükü maksimuma çıkaran yüzeylerin seçilmesi ve bunların HWC'ye gönderilmesi.
- Ekranın güncellenip güncellenmediğinin algılanması. Değilse, güç tasarrufu sağlamak için kompozisyonu HWC yerine GLES'e devredin. Ekran tekrar güncellendiğinde kompozisyonu HWC'ye aktarmaya devam edin.
- Aşağıdakiler gibi yaygın kullanım senaryolarına hazırlık:
- Durum çubuğunu, sistem çubuğunu, uygulama penceresini ve canlı duvar kağıtlarını içeren ana ekran
- Dikey ve yatay modda tam ekran oyunlar
- Altyazılı ve oynatma kontrollü tam ekran video
- Korumalı video oynatma
- Bölünmüş ekranlı çoklu pencere
HWC ilkelleri
HWC, kompozisyon çalışmasını ve bunun ekran donanımıyla etkileşimini temsil etmek için iki temel öğe ( katman ve ekran) sağlar. HWC ayrıca VSYNC üzerinde kontrol sağlar ve bir VSYNC olayı meydana geldiğinde bunu bildirmek için SurfaceFlinger'a geri arama sağlar.
HIDL arayüzü
Android 8.0 ve üzeri, HWC ile SurfaceFlinger arasında bağlayıcı IPC için Composer HAL adı verilen bir HIDL arabirimi kullanır. Composer HAL, eski hwcomposer2.h
arayüzünün yerini alır. Satıcılar HWC'nin Composer HAL uygulamasını sağlıyorsa Composer HAL, SurfaceFlinger'dan gelen HIDL çağrılarını doğrudan kabul eder. Satıcılar HWC'nin eski bir uygulamasını sağlıyorsa, Composer HAL, hwcomposer2.h
işlev işaretçilerini yükleyerek HIDL çağrılarını işlev işaretçisi çağrılarına yönlendirir.
HWC, belirli bir ekranın özelliklerini belirlemek için işlevler sağlar; farklı ekran yapılandırmaları (4k veya 1080p çözünürlük gibi) ve renk modları (yerel renk veya gerçek sRGB gibi) arasında geçiş yapmak için; ve destekleniyorsa ekranı açmak, kapatmak veya düşük güç moduna geçirmek için.
İşlev işaretçileri
Satıcılar Composer HAL'yi 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'de createLayer()
öğesini çağırır.
Satıcılar hwcomposer2.h
arayüzünü uygularsa, Composer HAL, hwcomposer2.h
işlev işaretçilerini çağırır. hwcomposer2.h
yorumlarında, HWC arayüz işlevleri, arayüzde adlandırılmış alanlar olarak bulunmayan LowerCamelCase adlarıyla anılır. Hemen hemen her işlev, hwc2_device_t
tarafından sağlanan getFunction
kullanılarak bir işlev işaretçisi istenerek yüklenir. Örneğin, createLayer
işlevi, HWC2_PFN_CREATE_LAYER
türünde bir işlev işaretçisidir ve numaralandırılmış HWC2_FUNCTION_CREATE_LAYER
değeri getFunction
iletildiğinde döndürülür.
Composer HAL işlevleri ve HWC işlevi geçiş işlevleri hakkında ayrıntılı belgeler için bkz composer
. HWC işlev işaretçilerine ilişkin ayrıntılı belgeler için hwcomposer2.h
dosyasına bakın.
Katman ve ekran tutamaçları
Katmanlar ve görüntüler, HWC tarafından oluşturulan tanıtıcılar tarafından yönetilir. Tutamaçlar SurfaceFlinger'a karşı opaktır.
SurfaceFlinger yeni bir katman oluşturduğunda, doğrudan uygulamalar için Layer
türünü veya geçiş uygulamaları için hwc2_layer_t
türünü döndüren createLayer
öğesini çağırır. SurfaceFlinger bu katmanın bir özelliğini değiştirdiğinde, SurfaceFlinger hwc2_layer_t
değerini, değişikliği yapmak için gereken diğer bilgilerle birlikte uygun modifikasyon fonksiyonuna iletir. hwc2_layer_t
türü bir işaretçiyi veya dizini tutacak kadar büyüktür.
Fiziksel ekranlar çalışırken takılarak oluşturulur. Fiziksel bir ekran çalışırken takıldığında, HWC bir tanıtıcı oluşturur ve tanıtıcıyı çalışırken takılabilir geri arama aracılığıyla SurfaceFlinger'a iletir. Sanal ekranlar, SurfaceFlinger'ın bir ekran istemek için createVirtualDisplay()
öğesini çağırmasıyla oluşturulur. HWC sanal ekran kompozisyonunu destekliyorsa bir tanıtıcı döndürür. Ardından SurfaceFlinger, ekranların kompozisyonunu HWC'ye devreder. HWC sanal ekran kompozisyonunu desteklemiyorsa SurfaceFlinger tanıtıcıyı oluşturur ve ekranı birleştirir.
Kompozisyon işlemlerini görüntüleme
SurfaceFlinger, birleştirilecek yeni içeriğe sahipse VSYNC başına bir kez uyanır. Bu yeni içerik, uygulamalardan gelen yeni görüntü arabellekleri veya bir veya daha fazla katmanın özelliklerinde yapılan bir değişiklik olabilir. SurfaceFlinger onu uyandırdığında:
- Varsa işlemleri yönetir.
- Varsa yeni grafik arabelleklerini mandallar.
- Adım 1 veya 2, ekran içeriğinde bir değişikliğe yol açtıysa yeni bir kompozisyon gerçekleştirir.
Yeni bir kompozisyon gerçekleştirmek için SurfaceFlinger, uygun olduğu şekilde katmanları oluşturur ve yok eder veya katman durumlarını değiştirir. Ayrıca setLayerBuffer
veya setLayerColor
gibi çağrıları kullanarak katmanları mevcut içerikleriyle günceller. Tüm katmanlar güncellendikten sonra SurfaceFlinger, HWC'ye katmanların durumunu incelemesini ve kompozisyonun nasıl ilerleyeceğini belirlemesini söyleyen validateDisplay
çağırır. Varsayılan olarak SurfaceFlinger, her katmanı, katmanın HWC tarafından birleştirileceği şekilde yapılandırmaya çalışır; ancak bazı durumlarda SurfaceFlinger, katmanları GPU geri dönüşü aracılığıyla birleştirir.
validateDisplay
çağrısından sonra SurfaceFlinger, HWC'nin kompozisyonu gerçekleştirmeden önce katman kompozisyon türlerinden herhangi birinin değiştirilmesini isteyip istemediğini görmek için getChangedCompositionTypes
çağırır. Değişiklikleri kabul etmek için SurfaceFlinger, acceptDisplayChanges
öğesini çağırır.
SurfaceFlinger bileşimi için herhangi bir katman işaretlenmişse SurfaceFlinger bunları hedef arabellekte birleştirir. SurfaceFlinger daha sonra arabelleği ekrana vermek için setClientTarget
çağırır, böylece arabellek ekranda görüntülenebilir veya SurfaceFlinger bileşimi için işaretlenmemiş katmanlarla daha da birleştirilebilir. SurfaceFlinger kompozisyonu için hiçbir katman işaretlenmemişse SurfaceFlinger kompozisyon adımını atlar.
Son olarak SurfaceFlinger, HWC'ye kompozisyon işlemini tamamlamasını ve nihai sonucu göstermesini bildirmek için presentDisplay
çağırır.
Çoklu ekranlar
Android 10 birden fazla fiziksel ekranı destekler. Android 7.0 ve sonraki sürümlerde kullanılması amaçlanan bir HWC uygulaması tasarlarken, HWC tanımında bulunmayan bazı kısıtlamalar vardır:
- Tam olarak bir adet dahili ekranın olduğu varsayılmaktadır. Dahili ekran, önyükleme sırasında ilk hotplug'un rapor ettiği ekrandır. Dahili ekran çalışırken 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 çalışırken takılabilir. Çerçeve, ilk dahili ekrandan sonraki tüm çalışırken takılabilir ekranların harici ekranlar olduğunu varsayar; dolayısıyla, daha fazla dahili ekran eklenirse bunlar hatalı bir şekilde
Display.TYPE_BUILT_IN
yerineDisplay.TYPE_HDMI
olarak sınıflandırılır.
Yukarıda açıklanan SurfaceFlinger işlemleri ekran başına gerçekleştirilirken, yalnızca bir ekranın içeriği güncellense bile tüm aktif ekranlar için sırayla gerçekleştirilir.
Örneğin, harici ekran güncellenirse sıra şu şekildedir:
// 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 ekran kompozisyonu, harici ekran kompozisyonuna benzer. Sanal ekran kompozisyonu ile fiziksel ekran kompozisyonu arasındaki fark, sanal ekranların çıktıyı ekran yerine Gralloc arabelleğine göndermesidir. Donanım Oluşturucu (HWC), çıktıyı bir arabelleğe yazar, tamamlama çitini sağlar ve arabelleği bir tüketiciye (video kodlayıcı, GPU, CPU vb.) gönderir. Ekran ardışık düzeni belleğe yazıyorsa, sanal ekranlar 2D/blitter veya katmanları kullanabilir.
Modlar
SurfaceFlinger validateDisplay()
HWC yöntemini çağırdıktan sonra her kare üç moddan birinde olur:
- GLES — GPU tüm katmanları birleştirerek doğrudan çıktı arabelleğine yazar. HWC kompozisyonla ilgilenmiyor.
- KARIŞIK — GPU, bazı katmanları çerçeve arabelleğiyle birleştirir ve HWC, çerçeve arabelleğini ve kalan katmanları birleştirerek doğrudan çıkış arabelleğine yazar.
- HWC — HWC tüm katmanları birleştirir ve doğrudan çıktı arabelleğine yazar.
Çıkış biçimi
Sanal ekran arabelleği çıktı formatları modlarına bağlıdır:
- GLES modu — EGL sürücüsü, çıktı arabellek biçimini
dequeueBuffer()
içinde, genellikleRGBA_8888
ayarlar. Tüketicinin, sürücünün ayarladığı çıktı biçimini kabul edebilmesi gerekir, aksi takdirde arabellek okunamaz. - MIXED ve HWC modları — Tüketicinin CPU erişimine ihtiyacı varsa formatı tüketici belirler. Aksi takdirde format
IMPLEMENTATION_DEFINED
olur ve Gralloc, kullanım bayraklarına göre en iyi formatı ayarlar. Örneğin, tüketici video kodlayıcıysa ve HWC formatı verimli bir şekilde yazabiliyorsa Gralloc bir YCbCr formatı ayarlar.
Senkronizasyon çitleri
Senkronizasyon (senkronizasyon) çitleri Android grafik sisteminin çok önemli bir yönüdür. Ç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 bloke olur.
Örneğin, bir uygulama GPU'da üretilen bir arabelleği gönderdiğinde aynı zamanda bir senkronizasyon çiti nesnesi de gönderir. Bu çit, GPU'nun ara belleğe yazmayı tamamladığını bildirir.
HWC, arabellekler görüntülenmeden önce GPU'nun arabellek yazmayı bitirmesini gerektirir. Senkronizasyon çitleri, arabellekler yazıldığında arabellekler ve sinyallerle birlikte grafik boru hattından geçirilir. Bir arabellek görüntülenmeden önce HWC, senkronizasyon çitinin sinyal verip vermediğini kontrol eder ve eğer varsa arabelleği görüntüler.
Senkronizasyon çitleri hakkında daha fazla bilgi için bkz . Donanım Oluşturucu Entegrasyonu .