繁体   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