Я пытаюсь настроить некоторые вычислительные ядра, которые требуют интерполяции некоторых радиальных профилей коэффициентов Фурье.По сути, мне нужно быть осторожным в одном индексе, но интерполировать в другом.Я подумал, что реализация этих массивов 1D текстуры позволит мне использовать встроенные функции интерполяции моего графического процессора.Просматривая документацию Metal, кажется, что MTLTextureType1DArray
с MTLPixelFormatR32Float
будет правильной настройкой для этого.
Я настраиваю свое описание текстуры как
MTLTextureDescriptor *textureDescriptor = [[MTLTextureDescriptor alloc] init];
textureDescriptor.pixelFormat = MTLPixelFormatR32Float;
textureDescriptor.textureType = MTLTextureType1DArray;
textureDescriptor.width = numRadialPoints;
textureDescriptor.height = 1;
textureDescriptor.depth = 1;
textureDescriptor.arrayLength = numArrays;
textureDescriptor.mipmapLevelCount = 1;
textureDescriptor.sampleCount = 1;
textureDescriptor.resourceOptions = MTLResourceCPUCacheModeWriteCombined | MTLResourceStorageModeManaged;
textureDescriptor.cpuCacheMode = MTLCPUCacheModeWriteCombined;
textureDescriptor.storageMode = MTLStorageModeManaged;
textureDescriptor.usage = MTLTextureUsageShaderRead;
Что я не могу понять, так это как теперь загрузить данные текстуры.Моя первая попытка была
_texture = [device newTextureWithDescriptor:textureDescriptor];
[_texture replaceRegion:MTLRegionMake2D(0, 0, numRadialPoints, numArrays) mipmapLevel:0 withBytes:floatbuffer bytesPerRow:4*numRadialPoints];
Но это приводит к ошибке, поскольку высоты не совпадают.
_validateReplaceRegion:144: failed assertion `(origin.y + size.height)(163) must be <= height(1).'
Как загрузить данные в MTLTextureType1DArray?