Как определить максимально допустимый размер MTLTextureDescriptor

Я выполняю манипуляции с изображениями, используя UIGraphicsImageRenderer(size: size, format: format). Если изображение слишком велико, оно завершится ошибкой с утверждением:

failed assertion `MTLTextureDescriptor has width (15488) greater than the maximum allowed size of 8192.'

Я бы хотел предотвратить это, сначала проверив, что изображение не превышает максимально допустимый размер. Я не уверен, что 8192 является константой для всех устройств, и хотел бы получить это программно, а не жестко кодировать.

2 ответа

Решение

Программно невозможно получить максимальный размер текстуры, поддерживаемый устройством. Однако приведенный ниже код даст вам жестко заданный размер в зависимости от типа устройства.

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;
}

Я не смог найти программный способ определить максимальный размер текстуры.

Жестко запрограммированный условный оператор в Swift будет выглядеть так:

      static var max1DTextureWidth: Int = {
    var maxLength = 8192;

    // It's recommended to use your shared device
    let device = MTLCreateSystemDefaultDevice()!

    if device.supportsFamily(.apple1) || device.supportsFamily(.apple2) {
        maxLength = 8192 // A7 and A8 chips
    } else {
        maxLength = 16384 // A9 and later chips
    }
    return maxLength
}()

Важно найти таблицу на странице 7 этого документа, чтобы ваш код обновлялся каждый год.

https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf

также найдите эту документацию для семейства GPU и карты чипов.

https://developer.apple.com/documentation/metal/mtlgpufamily#3189618

Другие вопросы по тегам