İçeriğe atla

toprak.run/apple/metal/01-giris

METAL SHADING LANGUAGE · BÖLÜM 1

Giriş

ASIL METİN Apple — Metal Shading Language Specification, Sürüm 4

1.1 Bu Belgenin Amacı

1.2 Bu Belirtimin Organizasyonu

Metal, GPU’nun grafik ve hesaplama işlem gücünden yararlanan uygulamalar geliştirmenizi sağlar. Bu belge, GPU üzerinde çalışan grafik ve veri-paralel hesaplama kodu olan bir gölgelendirici programı yazmak için kullanacağınız Metal Shading Language (MSL) dilini açıklamaktadır.

Gölgelendirici programları GPU’nun farklı programlanabilir birimleri üzerinde çalışır. MSL, grafik ve hesaplama programları arasında daha sıkı bir entegrasyona olanak tanıyan tek ve birleşik bir dildir. MSL C++ tabanlı olduğundan, size tanıdık gelecek ve kullanımı kolay olacaktır.

MSL, Metal programlarının yürütülmesini ve isteğe bağlı olarak derlenmesini yöneten Metal framework ile birlikte çalışır. Metal, clang ve LLVM kullanır; böylece GPU üzerinde optimize edilmiş performans sağlayan bir derleyici elde edersiniz.

Bu belge aşağıdaki bölümlerden oluşur:

  • Bu bölüm, “Giriş,” Metal ile C++17 arasındaki benzerlikleri ve farklılıkları kapsayan bu belgeye bir giriş niteliğindedir. Ayrıca ön işlemci yönergeleri, matematiksel içsel fonksiyon seçenekleri ve optimizasyonu kontrol etmeye yönelik seçenekler dâhil olmak üzere Metal derleyicisi için mevcut seçenekleri ayrıntılı biçimde açıklar.
  • “Veri Türleri” bölümünde Metal veri türleri listelenir; buna vektörleri, matrisleri, tamponları, dokuları ve örnekleyicileri temsil eden türler de dahildir. Ayrıca tür hizalaması ve tür dönüşümü de ele alınır.
  • “Operatörler” bölümünde Metal operatörleri listelenir.
  • “Adres Alanları” bölümünde, erişim kısıtlamalarına sahip bellek nesneleri ayırmak için ayrık adres alanları açıklanır.
  • “Fonksiyon ve Değişken Bildirimleri” bölümünde, kısıtlamaları belirten isteğe bağlı özniteliklerle birlikte fonksiyonların ve değişkenlerin nasıl bildirileceği ayrıntılı olarak açıklanır.
  • “Metal Standart Kütüphanesi” bölümünde yerleşik Metal fonksiyonlarından oluşan bir koleksiyon tanımlanır.
  • “Sayısal Uyumluluk” bölümünde, matematiksel işlemlerde doğruluk dâhil olmak üzere kayan noktalı sayıların temsil edilmesine ilişkin gereksinimler açıklanır.

iOS ve macOS için bu belgede açıklanan özelliklerin (fonksiyonlar, enumerations, türler, öznitelikler veya operatörler) desteği, aksi belirtilmedikçe Metal 1 sürümünden itibaren mevcuttur.

Bu belgenin geri kalanında X.Y kısaltması “Metal sürümü X.Y” anlamına gelir; örneğin 2.1, Metal 2.1’i ifade eder. Bir özelliğin MSL gölgelendirme dilinde destekleniyor olması, tüm GPU’larda desteklendiği anlamına gelmeyebilir. Ayrıntılar için developer.apple.com adresindeki Metal Feature Set Tables dokümanına başvurun.

1.3 Metal 4’te Yenilikler

Metal 4 aşağıdaki yeni özellikleri sunar:

  • C++17 tabanlı (bölüm 1.5)
  • Sampler LOD bias, minimum ve maksimum reduction (bölüm 2.10)
  • Vertex başına değerler (Per-Vertex values) (bölüm 2.19)
  • Kullanıcı anotasyonları (bölüm 5.1.12)
  • snorm10a2 için pack ve unpack işlemleri (bölüm 6.14)
  • Metal Performance Primitives (bölüm 7)
  • Intersection Function Buffers (bölümler 2.17.1, 5.1.6, 5.2.3.7, 6.18.2, 6.18.4 ve 6.18.8)
  • Tensorlar (bölüm 2.21)
  • Cube ve cube array dokuları için texture atomics (bölümler 6.12.6 ve 6.12.7)
  • Raster ve depth stencil durumları için dolaylı komut tamponu (indirect command buffer) desteği (bölüm 6.16.1)

1.4 Referanslar

Metal

Aşağıda apple.com üzerindeki Metal dokümantasyonuna bağlantı bulunmaktadır:

https://developer.apple.com/documentation/metal

Metal 4 ile birlikte Metal programlama dili, genişletmeler ve kısıtlamalar içeren C++17 tabanlı bir belirtimdir. Dilin gramerinin ayrıntılı açıklaması için C++17 belirtimine (ISO/IEC 14882:2017) başvurun. Metal’in önceki dil sürümleri, genişletmeler ve kısıtlamalar içeren C++14 tabanlı bir belirtimdir.

Bu bölüm ve alt bölümleri, Metal’de desteklenen C++17 ve C++14 diline yapılan değişiklikleri ve kısıtlamaları açıklar.

Metal ön işlemci yönergeleri ve derleyici seçenekleri hakkında daha fazla bilgi için bu belgenin 1.6 bölümüne bakın.

Metal, C++17 ve C++14 belirtiminin 13. bölümünde tanımlandığı şekilde overloading (aşırı yükleme) destekler. Metal, fonksiyon aşırı yükleme kurallarını bir argümanın adres alanı özniteliğini de kapsayacak şekilde genişletir. Metal grafik ve kernel fonksiyonlarını aşırı yükleyemezsiniz. (Grafik ve kernel fonksiyonlarının tanımı için bu belgenin 5.1 bölümüne bakın.)

1.5.2 Şablonlar

Metal, C++17 ve C++14 belirtiminin 14. bölümünde tanımlandığı şekilde şablonları destekler.

1.5.3 Ön İşleme Yönergeleri

Aşağıdaki C++ özellikleri Metal’de mevcut değildir (bölüm numaraları C++ belirtimine karşılık gelir):

  • lambda ifadeleri (bölüm 5.1.2) — Metal 3.2’den önce
  • dynamic_cast operatörü (bölüm 5.2.7)
  • tür tanımlama (type identification) (bölüm 5.2.8)
  • new ve delete operatörleri (bölümler 5.3.4 ve 5.3.5)
  • noexcept operatörü (bölüm 5.3.7)
  • goto ifadesi (bölüm 6.6)
  • register, thread_local depolama öznitelikleri (bölüm 7.1.1)
  • virtual fonksiyon özniteliği (bölüm 7.1.2)
  • türetilmiş sınıflar (bölümler 10 ve 11)
  • istisna işleme (exception handling) (bölüm 15)

Metal, C++17 ve C++14 belirtiminin 16. bölümünde tanımlanan ön işleme yönergelerini destekler.

1.5.4 Kısıtlamalar

Tüm işletim sistemleri: Metal 3.2 ve sonrasında lambda ifadeleri desteklenir.

Metal kodunda C++ standart kütüphanesini kullanmayın. Bunun yerine Metal’in kendi standart kütüphanesi vardır; bu belge içinde 5. bölümde ele alınmaktadır.

Metal, pointer kullanımını sınırlar:

  • Pointer olan Metal grafik ve kernel fonksiyon argümanlarını Metal device, constant, threadgroup, threadgroup_imageblock, object_data veya ray_data adres alanı özniteliği ile bildirmeniz gerekir. (Metal adres alanı öznitelikleri hakkında daha fazla bilgi için bu belgenin 4. bölümüne bakın.)
  • Metal 2.3 ve sonrası fonksiyon pointer’larını destekler.

Metal, hesaplama (kernel) bağlamında özyinelemeli fonksiyon çağrılarını (C++ bölüm 5.2.2, madde 9) Metal 2.4’ten itibaren destekler.

Bir Metal fonksiyonunu main olarak adlandıramazsınız.

Metal derleyicisini çevrimiçi (Metal kaynaklarını derlemek için uygun API’lerle birlikte) veya çevrimdışı kullanabilirsiniz. Çevrimdışı derlenmiş Metal kaynaklarını uygun Metal API’leri kullanarak ikili dosyalar olarak yükleyebilirsiniz.

Bu bölüm, Metal derleyicisinin desteklediği derleyici seçeneklerini açıklar ve bunları şu kategorilere ayırır:

  • ön işlemci seçenekleri
  • matematiksel içsel fonksiyon seçenekleri
  • optimizasyonu kontrol eden seçenekler
  • çeşitli derleme seçenekleri
  • bağlama (linking)

Aşağıdaki seçenekler, gerçek derlemeden önce her program kaynağı üzerinde çalışan Metal ön işlemcisini kontrol eder.

Metal, bir tanımın içeriğini sanki bir #define yönergesi içinde yer alıyormuş gibi ayrıştırır ve işler. Bu seçenek, özellikleri etkinleştirmek veya devre dışı bırakmak için Metal kodunu derlemenize olanak tanır. Bu seçeneği birden fazla kez kullanabilirsiniz ve ön işlemci tanımları göründükleri sırayla işler.

dir dizinini başlık dosyaları için arama yoluna ekler. Bu seçenek yalnızca çevrimdışı derleyici için kullanılabilir.

__METAL.IOS__     // iOS Metal dili ile derlenmişse ayarlanır
__METAL__         // Birleşik Metal dili ile derlenmişse ayarlanır
                  // -std=metal3.0 veya üzeri ile ayarlanır

Tanımları kullanarak yalnızca daha yeni dil sürümlerinde mevcut olan gölgelendirme dili özelliklerini koşullu olarak uygulayabilirsiniz (bkz. bölüm 1.6.10 Derleyici Seçenekleri — Dil Sürümünü Kontrol Etme).

Sürüm numarası MajorMinorPatch biçimindedir. Örneğin:

  • Metal 1.2 için, patch 0 → __METAL.VERSION__ değeri 120 olur
  • Metal 2.1 için, patch 1 → __METAL.VERSION__ değeri 211 olur

Metal 2’de sunulan özellikleri kullanan kodu koşullu olarak dâhil etmek için, kod içinde ön işlemci tanımını kullanabilirsiniz.

1.6.1 Ön İşlemci Derleyici Seçenekleri

-D name

name makrosunu 1 tanımıyla önceden tanımlar.

-D name=definition

-I dir

dir dizinini başlık dosyaları için arama yolu dizinlerine ekler.

1.6.2 Ön İşlemci Tanımları

Metal derleyicisi varsayılan olarak aşağıdakiler dâhil olmak üzere bir dizi ön işlemci tanımı ayarlar:

__METAL.VERSION__   // Metal dilinin revizyonunu belirtir
__METAL.MACOS__     // macOS Metal dili ile derlenmişse ayarlanır

1.6.3 Math Intrinsics Derleyici Seçenekleri

Bu seçenek, 6.5 bölümünde açıklanan tek hassasiyetli kayan nokta matematik fonksiyonlarının fast veya precise sürümünü çağırmasını belirler. Varsayılan değer fast’tir. Apple silicon için, Apple GPU Family 4 ile başlayarak matematik fonksiyonları INF ve NaN değerlerine uygun davranır.

Bu seçenek, derleyicinin kayan nokta optimizasyonlarında ne kadar agresif olabileceğini belirler. Varsayılan değer fast’tir.

Seçeneği relaxed olarak ayarlarsanız, derleyicinin kayan nokta matematiği hakkında agresif ve potansiyel olarak bilgi kaybına yol açabilecek varsayımlar yapmasına izin verir; ancak yine de INF ve NaN değerlerine uyulur. Bunlar şunları içerir:

  • işaretli sıfırların olmaması
  • reciprocal kullanımına izin verilmesi
  • yeniden ilişkilendirmeye (reassociation) izin verilmesi
  • FP contract değerinin fast olarak ayarlanması

Bu özellik Apple silicon tarafından desteklenir.

Aşağıdaki bölüm, hız ve doğruluk arasında denge kurarak kayan nokta aritmetiği konusunda derleyici davranışını kontrol etmeye yönelik seçenekleri açıklar.

Matematik fonksiyonları hakkında daha fazla bilgi için bölüm 6.5’e bakın. Normal ve hızlı matematik fonksiyonlarının göreli hata değerleri hakkında daha fazla bilgi için bölüm 8.4’e bakın.

Bu seçenekler, IEEE 754 standardını ihlal edebilecek kayan nokta aritmetiği optimizasyonlarını etkinleştirir veya devre dışı bırakır. Ayrıca tek hassasiyetli kayan nokta skaler ve vektör türleri için matematik fonksiyonlarının yüksek hassasiyetli varyantını etkinleştirir veya devre dışı bırakırlar.

Fast Math Optimizasyonları

  • No NaNs: Optimizasyonların argümanların ve sonuçların NaN olmadığını varsaymasına izin verir.
  • No INFs: Optimizasyonların argümanların ve sonuçların pozitif veya negatif sonsuzluk olmadığını varsaymasına izin verir.
  • No Signed Zeroes: Optimizasyonların sıfırın işaretini önemsiz kabul etmesine izin verir.
  • Allow Reciprocal: Bölme yerine reciprocal kullanımına izin verir.
  • Allow Reassociation: Kayan nokta sonuçlarını değiştirebilecek cebirsel olarak eşdeğer dönüşümlere izin verir.
  • Allow Contract: İfadeler arasında kayan nokta contraction işlemlerine izin verir (örneğin çarpma ve toplamanın fused-multiply-add işlemi olarak birleştirilmesi).

Metal aşağıdaki seçenekleri Xcode 16 ve Metal Developer Tools for Windows 5 ile birlikte destekler (iOS 18 veya macOS 15 destekleyen SDK):

-fmetal-math-fp32-functions=<fast|precise>
-fmetal-math-mode=<fast, relaxed, safe>
  • fast: Kayan nokta matematiği hakkında agresif ve potansiyel olarak bilgi kaybına yol açabilecek varsayımlara izin verir (NaN yok, INF yok, işaretli sıfır yok, reciprocal kullanımına izin verilir, reassociation izinlidir, FP contract fast).
  • safe: Güvenli olmayan kayan nokta optimizasyonlarını devre dışı bırakır ve sonuçları etkileyebilecek dönüşümleri engeller. FP contract değerini on olarak ayarlar.

Eşdeğer seçenekler:

  • -fmetal-math-fp32-functions=fast ve -fmetal-math-mode=fast
  • -fmetal-math-fp32-functions=precise ve -fmetal-math-mode=safe

Fast math kullanıldığında derleyici bazı özellikleri varsayabilir. Örneğin fast math, shader’ın hiçbir zaman INF veya NaN üretmeyeceğini varsayar. Programda X/Y gibi bir ifade varsa derleyici Y değerinin asla sıfır olmayacağını varsayar. Eğer Y sıfır olabiliyorsa, program fast math ile derlendiğinde davranış tanımsız olur.

#pragma metal fp pragma yönergeleri, bir kaynak kodu bölümü için kayan nokta seçeneklerini belirtmenize olanak tanır.

Aşağıdaki pragma, bir kaynak kodu bölümü için kesin kayan nokta semantiğini ve kayan nokta istisna davranışını belirtmenizi sağlar. Yalnızca şu yerlerde kullanılabilir:

  • dosya veya namespace kapsamı
  • bir language linkage specification içinde
  • bir compound statement başlangıcında (yorumlar hariç)

Bir compound statement içinde kullanıldığında pragma yalnızca o ifadenin kapsamı içinde etkin olur.

Varsayılan olarak derleyici kayan nokta contraction işlemlerine izin verir (örneğin a*b+c ifadesini fused-multiply-add işlemine dönüştürmek). Bunu devre dışı bırakmak için uygun derleyici seçeneğini kullanın.

Derleyici ayrıca pragma ile contraction kontrolünü destekler:

  • off contraction işlemlerini devre dışı bırakır
  • on bir ifade içinde contraction işlemlerine izin verir
  • fast ifadeler arasında contraction işlemlerine izin verir

Ayrıca şu yönergeyi de kullanabilirsiniz:

#pragma METAL fp math_mode([relaxed | safe | fast])

1.6.4 Invariance Derleyici Seçenekleri

iOS 14 veya macOS 11 destekleyen bir SDK ile derleme yapıyorsanız vertex invariance desteği için aşağıdaki seçeneği kullanın:

-fpreserve-invariance

Bu seçenek, vertex shader’larda [[invariant]] ile işaretlenmiş hesaplamalar için invariance özelliğini korur. Ayarlanmazsa [[invariant]] yok sayılır.

Metal’in önceki sürümlerinde [[invariant]], en iyi çaba analizine dayanıyordu ve bazı durumlarda başarısız olabiliyordu. Bunun yerine artık derleyicinin invariant hesaplamanın parçası olmayan işlemleri işaretlediği korumacı bir invariant modeli kullanılmaktadır. Bu sayede invariant hesaplamaların invariant kalması garanti edilir.

Bu seçenek bazı optimizasyonları engelleyebileceği için performansı azaltabilir.

1.6.5 Optimizasyon Derleyici Seçenekleri

Bu seçenekler derleyici optimizasyon seviyesini kontrol eder:

  • -O2 — Performans için optimize eder (varsayılan).
  • -Os-O2 gibidir ancak kod boyutunu azaltmak için ek optimizasyonlar içerir.

1.6.6 Maksimum Toplam Threadgroup Boyutu Seçeneği

Bu seçenek, çeviri birimindeki her fonksiyon için bir threadgroup içindeki thread sayısını (value) belirtir.

[[max_total_threads_per_threadgroup]] özniteliği (bölümler 5.1.3, 5.1.7 ve 5.1.8’de açıklanmıştır) derleme seçeneğine göre önceliklidir. Değer 32 bit içinde sığmalıdır.

Bu seçenek, dinamik bir kütüphane için derlenmiş fonksiyonların bir PSO ile uyumlu olmasını sağlarken kullanışlıdır.

1.6.7 Texture Write Rounding Mode

Kayan nokta piksel türlerine yapılan texture yazımları için yuvarlama modunu aşağıdaki derleyici bayrağı ile yapılandırabilirsiniz:

-ftexture-write-rounding-mode

Yuvarlama Modları

  • native (varsayılan) — Texture yazımları donanımın yerel yuvarlama stratejisini kullanır.
  • rte — Texture yazımları en yakın çift sayıya yuvarlanır. (Tüm OS: Metal 2.3 ve sonrası)
  • rtz — Texture yazımları sıfıra doğru yuvarlanır. (Tüm OS: Metal 2.3 ve sonrası)

-ftexture-write-rounding-mode bayrağı şu platformlarda kullanılabilir:

  • macOS 11 ve sonrası
  • iOS 14 ve sonrası

native dışında hangi yuvarlama modlarının hangi GPU ailelerinde desteklendiği hakkında bilgi için Metal Feature Set Tables dokümanına bakın.

1.6.8 Modülleri Etkinleştirmek İçin Derleyici Seçenekleri

Derleyici, modüllerin kullanımını kontrol etmek için birden fazla seçeneği destekler. Bu seçenekler yalnızca çevrimdışı derleyici için kullanılabilir.

-fmodules

Modül özelliğini etkinleştirir.

-fimplicit-module-maps

module.modulemap veya benzeri adlara sahip module map dosyalarının örtük olarak aranmasını etkinleştirir. Varsayılan olarak -fmodules bu seçeneği etkinleştirir. -fno-implicit-module-maps derleyici seçeneği bunu devre dışı bırakır.

-fmodule-map-file=<file>

module.modulemap adlı module map dosyaları için örtük aramayı devre dışı bırakır. Module map dosyaları yalnızca -fmodulemap-file ile açıkça belirtilmişse veya başka bir module map dosyası tarafından dolaylı olarak kullanılıyorsa yüklenir.

Modül önbelleği için yolu belirtir. Belirtilmezse derleyici sistem için uygun bir varsayılan seçer.

Belirtilen module map dosyası, bulunduğu dizinden veya alt dizinlerinden bir başlık dosyası yüklendiğinde yüklenir.

-fmodules=[mode]

Desteklenen mod değerleri:

  • stdlib: Modül özelliğini etkinleştirir ancak module map aramasını Metal standart kütüphanesi ile sınırlar. iOS 16 veya macOS 13 destekleyen bir SDK ile varsayılan olarak etkinleştirilir.
  • all: Modül özelliğini etkinleştirir (-fmodules ile eşdeğer).
  • none: Modül özelliğini devre dışı bırakır.

Eğer iOS 16 veya macOS 13 destekleyen bir SDK ile derleme yapıyorsanız, -fmodules için ek seçenekler mevcuttur.


1.6.9 Günlüğe Kaydı Etkinleştirmek İçin Derleyici Seçenekleri

Derleme sırasında günlüğe kaydı etkinleştirmek için (Bkz. Bölüm 6.19) aşağıdaki derleyici seçeneğini sağlayın:

-fmetal-enable-logging

Tüm işletim sistemleri: Metal 3.2 ve sonrası Apple silicon için günlüğe kaydı destekler.


1.6.10 Dil Sürümünü Kontrol Eden Derleyici Seçenekleri

Aşağıdaki seçenek, derleyici tarafından kabul edilen birleşik grafik ve hesaplama dilinin sürümünü kontrol eder:

-std=

Kullanılacak dil revizyonunu belirler. Bu seçenek için bir değer sağlanmalıdır ve aşağıdakilerden biri olmalıdır:

iOS Dil Sürümleri

  • ios-metal1.0: iOS 8 için birleşik grafik ve hesaplama dili revizyon 1 programlarını destekler. (Kullanımdan kaldırılmış)
  • ios-metal1.1: iOS 9 için revizyon 1.1 programlarını destekler.
  • ios-metal1.2: iOS 10 için revizyon 1.2 programlarını destekler.
  • ios-metal2.0: iOS 11 için revizyon 2 programlarını destekler.
  • ios-metal2.1: iOS 12 için revizyon 2.1 programlarını destekler.
  • ios-metal2.2: iOS 13 için revizyon 2.2 programlarını destekler.
  • ios-metal2.3: iOS 14 için revizyon 2.3 programlarını destekler.
  • ios-metal2.4: iOS 15 için revizyon 2.4 programlarını destekler.

macOS Dil Sürümleri

  • macos-metal1.1 veya osx-metal1.1: macOS 10.11 için revizyon 1.1 programlarını destekler.
  • macos-metal1.2 veya osx-metal1.2: macOS 10.12 için revizyon 1.2 programlarını destekler.
  • macos-metal2.0 veya osx-metal2.0: macOS 10.13 için revizyon 2 programlarını destekler.
  • macos-metal2.1: macOS 10.14 için revizyon 2.1 programlarını destekler.
  • macos-metal2.2: macOS 10.15 için revizyon 2.2 programlarını destekler.
  • macos-metal2.3: macOS 11 için revizyon 2.3 programlarını destekler.
  • macos-metal2.4: macOS 12 için revizyon 2.4 programlarını destekler.

Not: macos-*, macOS 10.13 SDK ve sonrasında kullanılabilir.

Birleşik Metal Dil Sürümleri

iOS 16, macOS 13 ve tvOS 16 itibarıyla Metal, platformlar arasında gölgelendirici dilini birleştirmiştir:

  • metal3.0: iOS 16, macOS 13 ve tvOS 16 için revizyon 3 programlarını destekler.
  • metal3.1: iOS 17, macOS 14, tvOS 17 ve visionOS 1 için revizyon 3.1 programlarını destekler.
  • metal3.2: iOS 18, macOS 15, tvOS 18 ve visionOS 2 için revizyon 3.2 programlarını destekler.
  • metal4.0: iOS 26, macOS 26, tvOS 26 ve visionOS 26 için revizyon 4 programlarını destekler.

Dil standardı 3.2 ve üzerindeki yeni özellikler yalnızca Apple Silicon tarafından desteklenir.


1.6.11 Uyarıları İstemek veya Bastırmak İçin Derleyici Seçenekleri

Aşağıdaki seçenekler mevcuttur:

  • -Werror: Tüm uyarıları hataya dönüştürür.
  • -w: Tüm uyarı mesajlarını bastırır.

1.6.12 Hedef Koşulları

Metal, gölgelendiricinin hangi platformda çalıştığını belirlemek için kullanılabilecek birkaç makro tanımlar. Aşağıdaki makrolar <TargetConditionals.h> içinde tanımlanmıştır:

  • TARGET_OS_MAC: Üretilen kod Mac OS X varyantı altında çalışır
  • TARGET_OS_OSX: Üretilen kod OS X aygıtları altında çalışır
  • TARGET_OS_IPHONE: Firmware, aygıt veya simülatör için üretilen kod
  • TARGET_OS_IOS: Üretilen kod iOS altında çalışır
  • TARGET_OS_TV: Üretilen kod tvOS altında çalışır
  • TARGET_OS_MACCATALYST: Üretilen kod macOS altında çalışır
  • TARGET_OS_SIMULATOR: Üretilen kod bir simülatör altında çalışır
  • TARGET_OS_VISION: Üretilen kod visionOS altında çalışır (2023 sonlarında yayımlanan SDK'larda kullanılabilir)

Metal derleyici sürücüsü, seçenekleri bağlayıcıya iletebilir. Bazı örnekler şunları içerir:

  • Çıktının dinamik bir kütüphane olduğunu belirtmek.
  • -dynamiclib ile birlikte kullanılarak dinamik kütüphanenin yükleyici tarafından nerede kurulmasının ve bulunmasının beklendiğini belirtmek. @executable_path ve @loader_path ile birlikte kullanılır.

GPU İkili Dosya Derleme Seçenekleri

Eğer iOS 16 veya macOS 13 destekleyen bir SDK ile derleme yapıyorsanız:

  • -gpu-family [gpu family name]: Derleme yapılacak MTLGPUFamily ile ilişkili mimarileri belirtir. Kullanılabilir aileler için Metal API belgelerine bakın.

1.6.15 Metal Kütüphane Sembol Dosyaları Üretmek İçin Seçenekler

Derleyicinin, AIR veya Metal kütüphane dosyasında (.metallib) kaynak bilgilerini saklamasını etkinleştirir.

-N [descriptor.mtlp-json]

Metal betik formatında pipeline tanımlayıcılarını belirtir. Tanımlayıcı dosyaları .mtlp-json ile bitmelidir.

Eğer iOS 15 veya macOS 12 destekleyen bir SDK ile derleme yapıyorsanız, aşağıdaki seçenekler bir Metal kütüphane sembol dosyası üretir:

  • -frecord-sources
  • -frecord-sources=flat

Bu seçenekler derleyicinin şunları yapmasını sağlar:

  • Bir AIR dosyası üretirken kaynak bilgilerini saklamak.
  • Bir Metal kütüphane dosyası üretirken kaynak bilgilerini eşlik eden bir sembol dosyasında (.metallibsym) saklamak.

Daha fazla bilgi için developer.apple.com üzerinde Generating and loading a Metal library symbol file bölümüne bakın.


Metal'de Koordinat Sistemleri

Metal, render hattı boyunca dönüştürülmüş grafik verilerini temsil etmek için kullanılan birkaç koordinat sistemi tanımlar.

Clip-Space Koordinatları

Dört boyutlu homojen bir vektör (x, y, z, w), clip-space koordinatlarında üç boyutlu bir noktayı belirtir. Bir vertex shader, konumları clip space içinde üretir. Metal, clip-space koordinatlarını normalize edilmiş aygıt koordinatlarına dönüştürmek için x, y ve z değerlerini w'ye böler.

Normalize Edilmiş Aygıt Koordinatları (NDC)

Normalize edilmiş aygıt koordinatları sol elli bir koordinat sistemi kullanır ve viewport içindeki konumlara eşlenir. Bu koordinatlar viewport boyutundan bağımsızdır.

  • Sol alt köşe: (-1.0, -1.0)
  • Sağ üst köşe: (1.0, 1.0)

Pozitif z değerleri kameradan uzağa doğru (ekranın içine doğru) yönelir. z koordinatının görünür kısmı 0.0 ile 1.0 arasındadır. Metal render hattı ilkel şekilleri bu kutuya göre kırpar.

Viewport Koordinatları

Rasterizer, normalize edilmiş aygıt koordinatlarını viewport koordinatlarına dönüştürür.

  • Piksel cinsinden ölçülür
  • Başlangıç noktası sol üst köşededir
  • Pozitif değerler sağa ve aşağı doğru uzanır

Viewport'ları bu koordinat uzayında belirtirsiniz ve Metal, NDC koordinatlarını viewport kapsamına eşler.

Eğer değişken rasterization oranı kullanılıyorsa (Bkz. Bölüm 6.15), viewport koordinat sistemi, render hedefinin fiziksel düzeninden bağımsız mantıksal bir koordinat sistemi haline gelir. Bir oran haritası, mantıksal koordinatlar (ekran uzayı) ile fiziksel piksel koordinatları arasındaki ilişkiyi belirler.

Doku Koordinatları

Doku koordinatları viewport koordinatlarına benzer bir sistem kullanır. Ayrıca normalize edilmiş değerler de kullanılabilir.

2D dokular için:

  • (0.0, 0.0) → görüntünün sol üst köşesi
  • (1.0, 1.0) → görüntünün sağ alt köşesi