Senkronizasyon çerçevesi

Senkronizasyon çerçevesi, korelasyon içindeki bağımlılıkları ve Android grafik sisteminde farklı eşzamansız işlemler gerçekleştirebilirsiniz. Çerçeve Bileşenlerin arabelleklerin ne zaman serbest bırakıldığını bildirmesini sağlayan bir API sağlar. Çerçeve ayrıca çekirdekten sürücüler arasında senkronizasyon temel öğelerinin iletilmesini sağlar otomatikleştirmeyi sağlar.

Örneğin, bir uygulama GPU'da yapılacak işleri sıraya alabilir. GPU bu resmi çizmeye başlar. Resim çizilmemiş olsa da belleğe henüz eklenmiş değilse, arabellek işaretçisi pencereye ve GPU çalışmasının ne zaman biteceğini belirten bir çitle somut olarak ortaya koyar. Pencere birleştirici, önceden işlemeye başlar ve bu çalışmayı ekran denetleyicisine iletir. Benzer şekilde CPU, yapılmasını şart koşar. GPU bittikten sonra, ekran denetleyicisi resim hemen görüntülenir.

Senkronizasyon çerçevesi, uygulamacıların senkronizasyon kaynaklarını kendi donanım bileşenlerinde senkronize edebilir. Son olarak, çerçeve, grafik ardışık düzeninin daha iyi anlaşılmasını sağlar. hata ayıklama.

Açık senkronizasyon

Açık senkronizasyon, grafik arabelleklerinin üreticilerini ve tüketicilerini etkinleştirir işin bitmesini bekleyeceklerini ortaya koyabilir. Açık senkronizasyon: örneğidir.

Açık senkronizasyonun avantajları şunlardır:

  • Cihazlar arasında daha az davranış değişimi
  • Daha iyi hata ayıklama desteği
  • İyileştirilmiş test metrikleri

Senkronizasyon çerçevesinin üç nesne türü vardır:

  • sync_timeline
  • sync_pt
  • sync_fence

senkronizasyon_zaman çizelgesi

sync_timeline, zaman çizelgesinde monoton ve giderek daha fazla her sürücü örneği için (ör. GL bağlamı) uygulaması gereken 2D ekran denetleyicisi veya 2D parlaklıktır. sync_timeline sayım özel bir donanım parçası için çekirdeğe gönderilen iş ilanlarıdır. sync_timeline, operasyonların sırası hakkında garanti sağlar ve donanıma özgü uygulamalar sunar.

sync_timeline öğesini uygularken aşağıdaki yönergeleri izleyin:

  • Sürücüler, zaman çizelgeleri ve sınırları basitleştirmek için yararlı adlar verin hata ayıklama.
  • timeline_value_str ve pt_value_str uygulayın hata ayıklama çıktısını daha okunabilir hale getirmek için zaman çizelgesinde operatörler kullanır.
  • Kullanıcı alanı kitaplıkları sağlamak için driver_data dolgusunu uygulayın. Örneğin, GL kitaplığı gibi, gizli zaman çizelgesi verilerine erişebilir. data_driver, tedarikçilerin sabit öğe ile ilgili bilgileri iletmesine olanak tanır Komut satırları oluşturmak için sync_fence ve sync_pts karar verebilir.
  • Kullanıcı alanının açıkça bir çit oluşturmasına veya sinyalini göstermesine izin vermeyin. Açıkça sinyal veya parmak izi oluşturulması, hizmet reddi saldırısına neden olur. ardışık düzen işlevselliğini durdurur.
  • sync_timeline, sync_pt veya sync_fence öğelerini açıkça görebilirsiniz. API, Google Ads'de işlevlerine dahildir.

senkronizasyon_pt

sync_pt, tek bir değer veya puandır: sync_timeline. Nokta üç durumu vardır: etkin, sinyalli ve hata. Puanlar etkin durumda başlar ve sinyal ya da hata durumlarına geçiş yapar. Örneğin, bir resim tüketicinin artık tamponu kullanması gerekmiyor, bir sync_pt sinyali var Bu şekilde, görüntü üreticisi arabelleğe tekrar yazmanın uygun olduğunu bilir.

senkronizasyon_fence

sync_fence, sync_pt değerden oluşan bir koleksiyondur sıklıkla farklı sync_timeline üst öğeleri vardır (ekran için denetleyici ve GPU) ekleyin. sync_fence, sync_pt ve sync_timeline, sürücülerin ve kullanıcı alanının kullandığı temel bileşenlerdir. ve bağımlılıklarını görmek için kullanabilirsiniz. Bir çitin sinyali verildiğinde her şey verilen komutların tamamlanması garanti edilir çünkü çekirdek sürücüsü veya donanım bloğu, komutları sırayla yürütür.

Senkronizasyon çerçevesi, birden fazla tüketicinin veya üreticinin, ve bağımlılık bilgilerini tek bir fonksiyonla paylaşarak tampon kullanmayı parametresinden sonra bir değer girin. Çitler bir dosya tanımlayıcısı ile desteklenir ve örneğine bakalım. Örneğin, bir çit iki İki ayrı imaj tüketicisinin tamamlandığını belirten sync_pt değerleri bir tampon okumayı öğreteceğim. Çit sinyali alındığında, görüntü üreticileri hem tükettiğini görüyoruz.

sync_pt değerleri gibi çitler etkin durumda başlar ve durumu şuna göre değiştirir: ve puanlarının durumu. Tüm sync_pt değerleri sinyal haline gelirse sync_fence sinyale dönüşür. Bir sync_pt düşerse hata durumuna geçirirse sync_fence öğesinin tamamında hata durumu görüntülenir.

sync_fence üyeliği, kurallar bittikten sonra değiştirilemez oluşturuldu. Bir çitte birden fazla nokta elde etmek için birleştirme İki farklı çitten alınan noktaların üçüncü bir çite eklendiği uygulamadır. Bu noktalardan biri başlangıçtaki çimde işaret edilmiş, diğeri ise işaretlenmemişse devre dışı da bırakabilirsiniz.

Açık senkronizasyon yapmak için aşağıdakileri sağlayın:

  • Senkronizasyon çerçevesini uygulayan çekirdek alanı alt sistemi sürücüye yönelik bir çağrıdır. Çitlere karşı dikkatli olması gereken sürücüler Donanım Oluşturucu'ya erişen veya iletişim kuran her şeyi içerir. Önemli dosyalar şunlardır:
    • Temel uygulama:
      • kernel/common/include/linux/sync.h
      • kernel/common/drivers/base/sync.c
    • kernel/common/Documentation/sync.txt adresindeki belgeler
    • Şurada çekirdek alanıyla iletişim kuracak şekilde platform/system/core/libsync.
  • Tedarikçi firmanın uygun senkronizasyonu sağlaması gerekir. validateDisplay() ve HAL'de presentDisplay() işlevi var.
  • Çitlerle ilgili iki GL uzantısı (EGL_ANDROID_native_fence_sync ve EGL_ANDROID_wait_sync) ve grafiklerde çit desteği gerekir.

Örnek olay: Ekran sürücüsü uygulama

Senkronizasyon işlevini destekleyen API'yi kullanmak için Ekran arabellek işlevine sahip bir ekran sürücüsü geliştirmenize yardımcı olabilir. Şu tarihten önce: senkronizasyon çerçevesi vardı, bu işlev dma-buf bu arabellekleri ekrana koyun ve arabellek görünür durumdayken engelleyin. Örneğin, örnek:

/*
 * assumes buffer is ready to be displayed.  returns when buffer is no longer on
 * screen.
 */
void display_buffer(struct dma_buf *buffer);

Senkronizasyon çerçevesiyle, display_buffer işlevi daha karmaşıktır. Arabellek ekranda gösterilirken arabellek, tamponun ne zaman hazır olacağını belirten bir çitle ekleyebilirsiniz. Sıraya alabilirsiniz ve sınır ortadan kalktıktan sonra işe başlayabileceksiniz.

İşleri sıraya alındıktan sonra başlatmak ve işleri bir engel oluştuktan sonra başlatmak hiçbir şeyi engellemez. Kendi çitinizi hemen iade edersiniz; bu da tamponun devre dışı bırakılır. Tamponları sıraya alırken çekirdek bağımlılıklarını görebilirsiniz:

/*
 * displays buffer when fence is signaled.  returns immediately with a fence
 * that signals when buffer is no longer displayed.
 */
struct sync_fence* display_buffer(struct dma_buf *buffer, struct sync_fence
*fence);

Senkronizasyon entegrasyonu

Bu bölümde, çekirdek-uzay senkronizasyonu çerçevesinin Android çerçevesinin kullanıcı alanı kısımları ve iletişim kurması gereken sürücüler olabiliyor. Çekirdek alanı nesneleri, kullanıcı alanıdır.

Entegrasyon kuralları

Android HAL arayüz kurallarını uygulayın:

  • API, bir sync_pt ile ilişkili bir dosya tanımlayıcısı sağlıyorsa Tedarikçi firmanın sürücüsünün veya API'yi kullanan HAL'nin, dosya açıklayıcıyı kapatması gerekir.
  • Tedarikçi firma sürücüsü veya HAL, API işlevine sync_pt bağlantısı verilse bile, tedarikçi firma sürücüsü veya HAL dosya açıklayıcısını kapatın.
  • Çit dosyası tanımlayıcısını, tedarikçi firma sürücüsünü veya HAL, açıklayıcıyı kopyalamalıdır.

Bir çit nesnesi, BufferQueue'den her geçtiğinde yeniden adlandırılır. Çekirdek çit desteği, çitlerin adlar için dizelere sahip olmasını sağlar. Bu nedenle, çerçeve, adını belirtmek için sıraya alınan pencere adını ve arabellek dizinini kullanır görebilirsiniz. Örneğin SurfaceView:0. Bu adlar görünürken kilitlenmenin kaynağını belirlemeye yardımcı olur, /d/sync çıkışı ve hata raporları.

ANativeWindow entegrasyonu

ANativeWindow her şeye duyarlıdır. dequeueBuffer, queueBuffer ve cancelBuffer özel parametrelere sahip.

OpenGL ES entegrasyonu

OpenGL ES senkronizasyon entegrasyonu iki EGL uzantısına dayanır:

  • EGL_ANDROID_native_fence_sync, şurada yerel Android çit dosyası tanımlayıcılarını sarmala veya oluştur: EGLSyncKHR nesne.
  • EGL_ANDROID_wait_sync, GPU tarafındaki gecikmelere izin verir yerine GPU'nun EGLSyncKHR kadar beklemesine neden olur. İlgili içeriği oluşturmak için kullanılan EGL_ANDROID_wait_sync uzantısı ile aynı EGL_KHR_wait_sync uzantısı.

Bu uzantıları bağımsız olarak kullanmak için İlişkili EGL_ANDROID_native_fence_sync uzantısı çekirdek desteği. Sonra, EGL_ANDROID_wait_sync etkinleştirin uzantısına sahip olursunuz. EGL_ANDROID_native_fence_sync uzantısı, ayrı bir yerel çit EGLSyncKHR nesnesinden oluşur türü. Bu nedenle, mevcut EGLSyncKHR için geçerli olan uzantılar nesne türlerinin EGL_ANDROID_native_fence için geçerli olması gerekmez kullanarak istenmeyen etkileşimleri önler.

EGL_ANDROID_native_fence_sync uzantısı, buna karşılık gelen bir yerel reklam kullanır yalnızca oluşturma sırasında ayarlanabilen ve mevcut bir senkronizasyon nesnesinden doğrudan sorgulanamaz. Bu özellik iki moddan birine ayarlanabilir:

  • Geçerli bir çit dosyası tanımlayıcısı, mevcut bir yereli sarmalar EGLSyncKHR nesnesinde Android çit dosyası tanımlayıcısı.
  • -1, EGLSyncKHR nesne.

Şunu ayıklamak için DupNativeFenceFD() işlev çağrısını kullanın: Yerel Android çit dosyası tanımlayıcısından EGLSyncKHR nesnesi. Bu, set özelliği sorgulamasıyla aynı sonuca sahiptir ancak bu kurala uygun hareket etmez (bu nedenle, işlemi) ekleyebilirsiniz. Son olarak, EGLSyncKHR nesnesini yok etmek kapanır dahili çit özelliği.

Donanım Oluşturucu entegrasyonu

Donanım Oluşturucu üç tür senkronizasyon engelini işler:

  • Parmaklıkları edinme, giriş arabellekleriyle birlikte setLayerBuffer ve setClientTarget çağrıları. Bunlar, arabelleğe alma için bekleyen bir yazma işlemini temsil eder ve SurfaceFlinger veya HWC, ilişkili arabellekteki verileri okuyarak performansı artırır.
  • Parmakları serbest bırakma komutu şu çağrıdan sonra alınır: presentDisplay, getReleaseFences aramasını kullanarak. Bunlar, aynı katmanda bulunan önceki arabellekten okunmayı bekleyen bir durumu temsil eder. CEVAP HWC önceki arabelleği artık kullanmadığında özel sınır sinyallerini serbest bırakın çünkü mevcut arabellek, ekrandaki önceki arabelleğin yerini almıştır. Yayın parmaklıkları, önceki arabelleklerle birlikte uygulamaya geri gönderilir geçerli beste sırasında değiştirilir. Uygulamanın bir sonraki aşamaya kadar beklemesi gerekir arabelleğe almaya devam edecek yeni içerikler yazmadan önce geri döndü.
  • Mevcut çitler, presentDisplay adlı kişiye çağrı. Mevcut çitler, kompozisyonu tamamlanmış veya alternatif olarak önceki karenin beste sonucuna artık gerek yok. Fiziksel için ifadesi görüntülenirse presentDisplay, ekranda geçerli kare görünür. Mevcut çitler döndürüldükten sonra güvenli değilse SurfaceFlinger hedef arabelleğine tekrar yazmak güvenlidir geçerlidir. Sanal ekranlarda, mevcut çitler okunması güvenli değildir.