У меня есть пользовательский 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:
? Предположительно, это включает в себя настройку буфера команд вывода / металла, но я не уверен в этом.