如何以编程方式获取最大纹理大小(宽度和高度)

How to get programmatically the maximum texture size (width and height)

如何以编程方式获取金属纹理的最大尺寸(宽度和高度)?使用 openGL 我可以做到:glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...) 但如何使用 Metal 做到这一点?

目前没有 API 检索 Metal 设备的最大纹理尺寸。您应该查阅 Metal Feature Set Tables 以获取此信息并将其包含在您的应用程序中。

对于 A9 和更新的 GPU 运行 当前版本 iOS/tvOS/iPadOS,2D 纹理的最大尺寸为 16384×16384。

正如@warrenm 所提到的,无法以编程方式获得设备支持的最大纹理大小。但是,下面的代码将根据设备类型为您提供硬编码大小。

int maxTexSize = 4096;

if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) {
    maxTexSize = 16384;
else if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v2] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v2]) {
    maxTexSize = 8192;
} else {
    maxTexSize = 4096;
}

iOS13 中有一个新的 API 应该会使这个过程更加健壮(对于 iOS 设备):

// If you use this you must be on iOS 13, so the code is valid for any device running that
func maxTextureDimension2(mtlDevice: MTLDevice) -> Int {
    // https://developer.apple.com/documentation/metal/mtldevice/3143473-supportsfamily
    let maxTexSize = mtlDevice.supportsFamily(.apple3) ? 16384 : 8192
    return maxTexSize
}

如果部署到较旧的 iOS 则使用@codeTiger 的答案。

PS: 算法直接来自 Warren Moore