Hardware Composer HAL'ı Uygulama

Donanım Besteleyici (HWC) HAL bileşimin miktarını azaltarak SurfaceFlinger alınan katmanları kompozit OpenGL ES (flanşlar) ve grafik işlemcisi gerçekleştirin.

HWC, bindirmeler ve 2B blitterler gibi nesneleri kompozit yüzeylere soyutlar ve özel pencere kompozisyon donanımı ile kompozit pencerelere iletişim kurar. Pencereleri birleştirmek için GPU ile SurfaceFlinger kompoziti kullanmak yerine 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 bindirme:
    • Durum çubuğu
    • Sistem çubuğu
    • Uygulama
    • Duvar kağıdı/arka plan
  • Ekrandan daha büyük olan katmanlar (örneğin, bir duvar kağıdı)
  • Eşzamanlı önceden çarpılmış piksel başına alfa harmanlama ve düzlem başına alfa harmanlama
  • Korumalı video oynatma için donanım yolu
  • RGBA paketleme sırası, YUV biçimleri ve döşeme, kıvrılma 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 aşamalı olarak HWC'ye devretmek için bir algoritma uygulayın. Örneğin, HWC'nin kaplama donanımına yalnızca ilk üç veya dört yüzeyi devredin.
  3. HWC'yi optimize edin. Bu şunları içerebilir:
    • GPU'dan alınan yükü maksimize eden yüzeylerin seçilmesi ve HWC'ye gönderilmesi.
    • Ekranın güncellenip güncellenmediğini algılama. Değilse, güç tasarrufu için kompozisyonu HWC yerine GLES'e devredin. Ekran tekrar güncellendiğinde, kompozisyonu HWC'ye boşaltmaya devam edin.
    • Aşağıdakiler gibi yaygın kullanım durumları için hazırlanıyor:
      • 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ı ve oynatma kontrolü ile tam ekran video
      • Korumalı video oynatma
      • Bölünmüş ekran çoklu pencere

HWC ilkelleri

HWC iki temeli sağlar katmanları ve görüntüler , bileşim, çalışma ve gösterge donanımı ile etkileşimini göstermek için. HWC da üzerinde kontrol sağlayan VSYNC ve VSYNC olay meydana geldiğinde SurfaceFlinger için bir geri arama bunu bildirmek için.

HIDL arayüzü

Android 8.0 ve üstü kullanımları için bir HIDL HWC ve SurfaceFlinger arasında binderized IPC için arayüz denilen Besteci HAL. Besteci HAL mirası değiştirir hwcomposer2.h arayüzü. Satıcılar HWC'nin bir Composer HAL uygulamasını sağlıyorsa, Composer HAL, SurfaceFlinger'dan gelen HIDL çağrılarını doğrudan kabul eder. Satıcıları resirkülasyonlu bir miras uygulamasında sağlarsanız, Besteci HAL yükler gelen işaretçileri işlev hwcomposer2.h işlev işaretçisi çağrıları içine HIDL aramaları yönlendirme.

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'ı doğrudan uygularsa, SurfaceFlinger işlevlerini HIDL IPC aracılığıyla çağırır. Örneğin, bir katman oluşturmak için, SurfaceFlinger'a çağırır createLayer() Besteci HAL ile.

Satıcıları uygularsanız hwcomposer2.h arayüzü, içine Besteci HAL aramaları hwcomposer2.h işlev işaretçileri. In hwcomposer2.h yorumları, HWC arayüz fonksiyonları adlandırılmış alanları olarak arayüzde bulunmayan lowerCamelCase adlarıyla anılır. Hemen hemen her fonksiyonu kullanılarak bir işlev işaretçisi isteyerek yüklenir getFunction sağladığı hwc2_device_t . Örneğin, işlev createLayer tipi bir fonksiyonu işaretçi HWC2_PFN_CREATE_LAYER numaralandırılmış değeri, döndürülen, HWC2_FUNCTION_CREATE_LAYER geçirilir getFunction .

Fonksiyonlar passthrough Besteci HAL işlevleri ve HWC işlevi hakkında ayrıntılı belgelere için bkz composer . HWC işlev işaretçileri ayrıntılı belgelerden için bkz hwcomposer2.h .

Katman ve ekran tutamaçları

Katmanlar ve görüntüler, HWC tarafından oluşturulan tutamaçlar tarafından manipüle edilir. Tutamaçlar SurfaceFlinger'a karşı opaktır.

SurfaceFlinger'a yeni bir katman oluşturur, bu aramaları createLayer tipi döner, Layer direkt uygulamalarda ya yönelik hwc2_layer_t passthrough uygulamaları için. SurfaceFlinger'a bu tabakanın bir özellik değiştirir, SurfaceFlinger'a geçer hwc2_layer_t modifikasyonu için gerekli herhangi bir başka bilgi ile birlikte uygun düzenleme işlevi değeri. hwc2_layer_t türü bir işaretçi veya bir dizin ya tutacak geniş yeterlidir.

Fiziksel ekranlar, çalışırken takılarak oluşturulur. Fiziksel bir ekran çalışırken takıldığında, HWC bir tutamaç oluşturur ve tutamacı çalışırken takılabilir geri çağırma yoluyla SurfaceFlinger'a iletir. Sanal görüntüler çağırarak SurfaceFlinger tarafından oluşturulur createVirtualDisplay() bir ekran istemek için. HWC sanal görüntü kompozisyonunu destekliyorsa, bir tanıtıcı döndürür. Ardından SurfaceFlinger, ekranların kompozisyonunu HWC'ye devreder. HWC sanal görüntü kompozisyonunu desteklemiyorsa, SurfaceFlinger tutamacı oluşturur ve ekranı birleştirir.

Kompozisyon işlemlerini görüntüleme

Her VSYNC için bir kez, birleştirilecek yeni içerik varsa SurfaceFlinger uyanır. Bu yeni içerik, uygulamalardan gelen yeni görüntü arabellekleri veya bir veya daha fazla katmanın özelliklerinde bir değişiklik olabilir. SurfaceFlinger onu uyandırdığında:

  1. Varsa işlemleri yönetir.
  2. Varsa, yeni grafik arabelleklerini kilitler.
  3. Adım 1 veya 2, ekran içeriğinde bir değişikliğe neden olduysa, yeni bir kompozisyon gerçekleştirir.

Yeni bir kompozisyon gerçekleştirmek için, SurfaceFlinger katmanları oluşturur ve yok eder veya uygun olduğu şekilde katman durumlarını değiştirir. Aynı zamanda gibi çağrıları kullanarak, mevcut içeriğiyle katmanları günceller setLayerBuffer veya setLayerColor . Tüm katmanları güncellendikten sonra SurfaceFlinger'a çağırır validateDisplay katmanlarının durumunu incelemek ve kompozisyon devam edecek belirlemek için HWC söyler. Varsayılan olarak, SurfaceFlinger her katmanı, katman HWC tarafından birleştirilecek şekilde yapılandırmaya çalışır; ancak bazı durumlarda SurfaceFlinger, GPU yedeği aracılığıyla katmanları birleştirir.

Çağrısının ardından validateDisplay , SurfaceFlinger'a çağırır getChangedCompositionTypes HWC kompozisyonunu gerçekleştirmeden önce değişti katman kompozisyonu türlerinin herhangi istiyorsa görmek için. Değişiklikleri kabul etmek için, SurfaceFlinger'a çağırır acceptDisplayChanges .

SurfaceFlinger bileşimi için herhangi bir katman işaretlenirse, SurfaceFlinger bunları hedef arabellekte birleştirir. SurfaceFlinger'a aranmamanızı setClientTarget tamponu ekranda ya da daha fazla SurfaceFlinger'a bileşim için işaretlenmeyen tabakalar ile karma böylece görüntü tampon elde edildi. SurfaceFlinger kompozisyonu için hiçbir katman işaretlenmemişse, SurfaceFlinger kompozisyon adımını atlar.

Son olarak, SurfaceFlinger'a çağırır presentDisplay kompozisyon sürecini tamamlayıp nihai sonucu görüntülemek için HWC anlatmak için.

Çoklu ekranlar

Android 10, birden çok 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 ekran var olduğunu kabul ediyor. Dahili ekran, ilk hotplug'ın önyükleme sırasında bildirdiği ekrandır. Dahili ekran 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 ekranında sonuçta hotplugs artık iç görüntüler eklenir eğer öyleyse, bunlar yanlış kategorize ediyoruz, dış görüntüler varsayar Display.TYPE_HDMI yerine Display.TYPE_BUILT_IN .

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 etkin ekranlar için sırayla gerçekleştirilir.

Örneğin, harici ekran güncellenirse sıra şöyledir:

// 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ü kompozisyonu

Sanal görüntü kompozisyonu, harici ekran kompozisyonuna benzer. Sanal görüntü kompozisyonu ile fiziksel görüntü kompozisyonu arasındaki fark, sanal ekranların çıktıyı ekran yerine Gralloc arabelleğine göndermesidir. Hardware Composer (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. Görüntü ardışık düzeni belleğe yazıyorsa, sanal görüntüler 2B/blitter veya bindirmeleri kullanabilir.

Modlar

SurfaceFlinger'a aramalardan sonra Her bir çerçeve üç moddan birinde olduğu validateDisplay() HWC yöntemi:

  • Flanşlar - grafik işlemcisi çıkış tampon çözeltisine doğrudan yazma, tüm katmanları kompozit. HWC, kompozisyona dahil değildir.
  • KARMA - grafik işlemcisi arabelleðine bazı katmanları kompozit ve HWC çıkış tampon çözeltisine doğrudan yazma, çerçeve belleği ve kalan tabakalar kompozit.
  • HWC - HWC tüm katmanları kompozit ve çıkış tampon çözeltisine doğrudan yazar.

Çıkış formatı

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

  • Flanşlar modu - EGL sürücü çıkış tamponu biçimini belirler dequeueBuffer() , tipik olarak, RGBA_8888 . Tüketici, sürücünün ayarladığı çıktı biçimini kabul edebilmelidir veya arabellek okunamaz.
  • KARIŞIK ve HWC modları - Tüketici CPU erişmesi gerekiyorsa, tüketici formatını ayarlar. Aksi halde, biçim olduğu IMPLEMENTATION_DEFINED ve Gralloc kullanım bayrakları göre en iyi biçimi belirler. Örneğin, tüketici video kodlayıcıysa ve HWC bu 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'nun eşzamanlı GPU çalışmasından bağımsız olarak çalışmasına izin vererek yalnızca gerçek bir bağımlılık olduğunda bloke eder.

Örneğin, bir uygulama GPU'da üretilen bir arabelleği gönderdiğinde, aynı zamanda bir eşitleme çiti nesnesi de gönderir. Bu çit, GPU arabelleğe yazmayı bitirdiğinde sinyal verir.

HWC, arabellekler görüntülenmeden önce GPU'nun arabellek yazmayı bitirmesini gerektirir. Senkronizasyon çitleri, arabellekler ve arabellekler yazıldığında sinyal ile grafik boru hattından geçirilir. Bir arabellek görüntülenmeden önce, HWC, senkronizasyon çitinin sinyal verip vermediğini kontrol eder ve varsa, arabelleği görüntüler.

Senkron çitler hakkında daha fazla bilgi için bkz Donanım Besteci Entegrasyonu .