Komut dosyalarını OpenGL ES 3.1'e taşıma

GPU bilişiminin ideal olduğu iş yükleri için RenderScript komut dosyalarını OpenGL ES (GLES), Kotlin veya Java dilinde yazılmış ya da NDK kullanan uygulamalara izin verir GPU donanımından faydalanmaları gerekecek. Aşağıdaki üst düzey genel bakış, aşağıdaki amaçlarla OpenGL ES 3.1 işlem gölgelendiricilerini kullanmanıza yardımcı olur: RenderScript komut dosyalarını değiştirin.

GLES Başlatma

RenderScript bağlam nesnesi oluşturmak yerine aşağıdaki adımları uygulayın: kullanarak GLES ekran dışı bağlamı oluşturun:

  1. Varsayılan ekranı al

  2. Varsayılan ekranı kullanarak GLES sürümünü belirterek EGL'yi başlatın.

  3. Şu yüzey türüne sahip bir EGL yapılandırması seçin: EGL_PBUFFER_BIT.

  4. EGL bağlamı oluşturmak için ekranı ve yapılandırmayı kullanın.

  5. Ekran dışı yüzey oluşturmak için eglCreatePBufferSurface. Bağlam yalnızca bilgi işlem için kullanılacak. Çok küçük (1x1) teşekkür ederiz.

  6. Oluşturma ileti dizisini ve çağrıyı oluşturma eglMakeCurrent; görüntü, yüzey, ve EGL bağlamını kullanır.

Örnek uygulama, GLSLImageProcessor.kt. Daha fazla bilgi edinmek için bkz. EGLSurfaces ve OpenGL ES.

GLES hata ayıklama çıkışı

OpenGL'den yararlı hatalar alma, hata ayıklama kaydını etkinleştirmek için bir uzantı kullanır hata ayıklama çıktısı geri çağırması yapar. Bu işlemi SDK'dan yapma yöntemi, glDebugMessageCallbackKHR, hiç uygulanmamıştır ve istisna. Örnek uygulama NDK kodundan geri çağırma için bir sarmalayıcı içerir.

GLES Ayırmaları

Bir RenderScript ayırması, bir Sabit depolama dokusu veya Gölge Depolama Arabellek Nesnesi. Salt okunur resimlerde Sampler Object kullanabilir ve böylece filtre uygulayabilirsiniz.

GLES kaynakları, GLES içinde ayrılır. Bellek kopyalamayı önlemek için diğer Android bileşenleriyle etkileşimde bulunurken bize KHR Görseller için paylaşıma izin veren uzantı 2D dizi örneğidir. Bu uzantı Android cihazlar için gerekliydi Android 8.0 ile başlar. İlgili içeriği oluşturmak için kullanılan grafik-çekirdek Android Jetpack kitaplığı bu resimlerin yönetilen kod ve eşleme içinde oluşturulması için destek içerir bunları ayrı bir HardwareBuffer'e aktarmak için:

val outputBuffers = Array(numberOfOutputImages) {
  HardwareBuffer.create(
    width, height, HardwareBuffer.RGBA_8888, 1,
    HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE
  )
}
val outputEGLImages = Array(numberOfOutputImages) { i ->
    androidx.opengl.EGLExt.eglCreateImageFromHardwareBuffer(
        display,
        outputBuffers[i]
    )!!
}

Ne yazık ki, bu yöntem, tüm dokümanlar için gereken sabit depolama doğrudan arabelleğe yazmak için bir bilgi işlem gölgelendiricisi. Örnekte kullanılanlar: Kullanılan depolama alanı dokusunu kopyalamak için glCopyTexSubImage2D bunu KHR Image içinde görebilirsiniz. OpenGL sürücüsü EGL Image Storage uzantısı, , kopyalamayı önlemek için paylaşılan sabit bir depolama dokusu oluşturmak amacıyla kullanılabilir.

GLSL işlem gölgelendiricilerine dönüştürme

RenderScript komut dosyalarınız, GLSL bilgi işlem gölgelendiricilerine dönüştürülür.

GLSL bilgi işlem gölgelendiricisi yazma

OpenGL ES'de,işlem gölgelendiricileri OpenGL Gölgelendirme Dili (GLSL) olarak değiştirin.

Küresel komut dosyalarının uyarlanması

Alfabedeki karakter özelliklerine göre, istediğiniz her tür üniformayı kullanabilirsiniz. veya gölgelendirici içinde değiştirilmeyen genel öğeler için tek tip arabellek nesneleri:

Gölgelendirici içinde değiştirilen genel öğeler için Sabit depolama dokusu veya Gölge Depolama Arabellek Nesnesi.

Hesaplamaları Yürütme

Compute gölgelendiriciler, grafik ardışık düzeninin bir parçası değildir. genel amaçlıdır ve paralelliği son derece yüksek işleri hesaplamak için tasarlanmıştır. Bu sayede nasıl yürüttükleri üzerinde daha fazla kontrol sahibi olmakla birlikte, nasıl paralel hale getirildiğini biraz daha iyi anlarsınız.

Compute programını oluşturma ve başlatma

Compute programının oluşturulması ve başlatılmasının bir GLES gölgelendiriciyle çalışır.

  1. Programı ve programla ilişkili Compute gölgelendiriciyi oluşturun.

  2. Gölgelendirici kaynağını ekleyin, gölgelendiriciyi derleyin (ve sonuçları kontrol edin) bakın).

  3. Gölgelendiriciyi ekleyin, programı bağlayın ve programı kullanın.

  4. İstediğiniz üniformaları oluşturun, başlatın ve bağlayın.

Hesaplama başlatma

Compute gölgelendiriciler, bir serideki soyut 1D, 2D veya 3D alanda çalışır ve tüm çalışma gruplarını temsil eder. Bunlar, gölgelendirici kaynak kodunda tanımlanır ve gölgelendiricinin geometrisine ve minimum çağrı boyutuna göre değişiklik gösterir. Aşağıdaki gölgelendirici 2D görüntü üzerinde çalışır ve çalışma gruplarını iki boyutlar:

private const val WORKGROUP_SIZE_X = 8
private const val WORKGROUP_SIZE_Y = 8
private const val ROTATION_MATRIX_SHADER =
    """#version 310 es
    layout (local_size_x = $WORKGROUP_SIZE_X, local_size_y = $WORKGROUP_SIZE_Y, local_size_z = 1) in;

Çalışma grupları, GL_MAX_COMPUTE_SHARED_MEMORY_SIZE tarafından tanımlanan anıları paylaşabilir, ve veri analizi için en az 32 KB dosya boyutumemoryBarrierShared() tutarlı belleğe erişimi sağlar.

Çalışma grubu boyutunu tanımlayın

Sorun alanınız 1’lik çalışma grubu boyutlarıyla iyi çalışsa bile, uygun çalışma grubu boyutunun, Compute gölgelendiriciyi paralel hale getirmek açısından önemlidir. Boyut çok küçükse GPU sürücüsü hesaplamanızı paralel yapmayabilir yeter. İdeal olarak bu boyutlar GPU başına ayarlanmalıdır, ancak makul varsayılan ayarlar, çalışma grubu gibi mevcut cihazlarda yeterince iyi çalışıyor. 8x8 boyutunu belirtir.

GL_MAX_COMPUTE_WORK_GROUP_COUNT var, ancak çok önemli; olmalı üç eksende de en az 65.535 olmalıdır.

Gölgelendiriciyi gönder

Hesaplamaları yürütmenin son adımı, ve şu gibi dağıtma işlevlerinin glDispatchCompute. Görevlendirme işlevi çalışma grubu sayısını ayarlamak için aşağıdaki adımları uygulayın:

GLES31.glDispatchCompute(
  roundUp(inputImage.width, WORKGROUP_SIZE_X),
  roundUp(inputImage.height, WORKGROUP_SIZE_Y),
  1 // Z workgroup size. 1 == only one z level, which indicates a 2D kernel
)

Değeri döndürmek için önce bellek bariyeri:

GLES31.glMemoryBarrier(GLES31.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT)

Birden fazla çekirdeği birbirine bağlamak için: (örneğin, ScriptGroup kullanarak kodu taşımak için), yeni bir kod oluşturun ve ve çıkışa erişimlerini bellekle senkronize ederek birden çok program oluşturabilirsiniz. engeller.

Örnek uygulama , iki hesaplama görevini gösterir:

  • HUE rotasyonu: Tek bir Compute gölgelendirici olan işlem görevi. Görüntüleyin Kod örneği için GLSLImageProcessor::rotateHue.
  • Bulanıklaştırma: Sırayla iki hesaplama yapan daha karmaşık bir işlem görevi gölgelendiriciler. Kod örneği için bkz. GLSLImageProcessor::blur.

Bellek bariyerleri hakkında daha fazla bilgi edinmek için Görünürlüğü sağlama yanı sıra Paylaşılan değişkenler ,