簡體   English   中英

金屬數據類型對應的Swift數據類型?

[英]Corresponding Swift Data types for Metal data types?

我正在傳遞我的金屬內核和着色器函數一個參數結構。 在任何地方都找不到指定用於與Metal中的數據類型匹配的Swift數據類型的地方。

我已經盡力猜測在Swift端要使用哪種數據類型,但是在結構中定義變量的順序似乎很挑剔。 這使我相信它們並不一致。

例如,以下是我在Metal中使用的數據類型:

struct ComputeParameters {
    bool yesNo;
    int count;
    float scale;
    float2 point;
    float4 color;
};

這是我在Swift中對應的結構:

struct ComputeParameters {
    var yesNo: Bool = false
    var count: Int32 = 0
    var scale: Float32 = 1.0
    var point: float2 = float2(0.0, 0.0)
    var color: float4 = float4(0.0, 0.0, 0.0, 1.0)
}

這是我從上面使用的數據類型的表。

Metal _________ Swift

bool            Bool
int             Int32
float           Float32
float2          float2
float4          float4

那些是正確的嗎? 參數數據類型是否有記載的地方?

Swift中Int類型的大小取決於目標平台。 它可能等於Int32Int64 ,盡管Int64它們幾乎總是Int64 因此,您應該使用更明確的Int32類型來匹配Metal的32位int類型。

從Swift 5開始,不推薦使用float2float4而推薦使用SIMD2<Float>SIMD4<Float> 這些與Metal的float2float4完全對應。

我相信您的其余信件都是正確的。

但是,首先在Swift中定義這些結構可能並不明智。 Swift對於結構布局(填充,對齊和成員順序)不提供任何保證。 因此,您可能會發現Swift和MSL之間的布局不匹配(我還沒有看到這種情況發生,但關鍵是它可以 )。

我認為,當前的指南是在C / Objective-C中定義此類結構,然后通過橋接標頭將其導入。 這使得將memcpy樣式的結構副本復制到Metal緩沖區中的可能性更大。 始終要特別注意大小和對齊方式,尤其是由於手動重新排序結構成員可能會更改結構的大小和/或步幅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM