Как указать устройство для Metal Compute в подклассе CIImageProcessorKernel? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть пользовательский CIFilter, реализованный с использованием подкласса CIImageProcessorKernel. Само ядро ​​очень просто:

@implementation ErosionFilterKernel

+ (BOOL)processWithInputs:(NSArray<id<CIImageProcessorInput>> *)inputs
                arguments:(NSDictionary<NSString *,id> *)arguments
                   output:(id<CIImageProcessorOutput>)output
                    error:(NSError *__autoreleasing *)error
{
    error = error ?: &(NSError * __autoreleasing){ nil };

    id<MTLCommandBuffer> commandBuffer = output.metalCommandBuffer;
    id<MTLTexture> sourceTexture = [inputs.firstObject metalTexture];
    id<MTLTexture> destinationTexture = output.metalTexture;

    NSInteger distance = [arguments[@"erosionDistance"] integerValue] ?: 1;

    MPSImageAreaMin *erodeFilter = [[MPSImageAreaMin alloc] initWithDevice:commandBuffer.device
                                                               kernelWidth:distance
                                                              kernelHeight:distance];
    [erodeFilter encodeToCommandBuffer:commandBuffer sourceTexture:sourceTexture destinationTexture:destinationTexture];
    return YES;
}

@end

Это прекрасно работает, так как дает ожидаемый результат. Проблема У меня есть то, что он использует встроенный графический процессор на MacBook Pro с двумя графическими процессорами, и я хотел бы, чтобы он использовал дискретный графический процессор. Если я передаю результат MTLCreateSystemDefaultDevice() (дискретный графический процессор) в -[MPSImageAreaMin initWithDevice:...], я получаю ошибку подтверждения:

- [MTLDebugComputeCommandEncoder setComputePipelineState:] сбой проверки asutetion computePipelineState связан с другим устройством

Вероятно, это связано с тем, что экземпляр MTLComputeCommandEncoder, используемый внутренне оборудованием, отвечающим за работу -encodeToCommandBuffer:sourceTexture:destinationTexture:, уже настроен для использования встроенного графического процессора. Я думаю это происходит от commandBuffer, извлеченного из объекта CIImageProcessorOutput.

Мой вопрос : возможно ли указать графический процессор, который будет использоваться -encodeToCommandBuffer:sourceTexture:destinationTexture:? Предположительно, это включает в себя настройку буфера команд вывода / металла, но я не уверен в этом.

1 Ответ

2 голосов
/ 01 ноября 2019

Какой графический процессор используется, определяется CIContext, который выполняет обработку изображения. Вы можете указать устройство с помощью инициализатора [CIContext contextWithMTLDevice:].

Кстати, поскольку в macOS 10.15 есть встроенный фильтр CIMorphologyRectangleMinimum, который делает то же самое. И есть также круговая версия , которая доступна с 10.13.

...