Donanım Oluşturucu HAL'yi Uygulama

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:

  1. Operasyonel olmayan bir HWC uygulayın ve tüm kompozisyon çalışmalarını GLES'e gönderin.
  2. 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.
  3. 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:

  1. Varsa işlemleri yönetir.
  2. Varsa yeni grafik arabelleklerini mandallar.
  3. 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 yerine Display.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, genellikle RGBA_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 .