Как определить максимально допустимый размер 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