- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义的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
这工作得很好,因为它产生了预期的结果。 我遇到的问题是它在带有两个 GPU 的 MacBook Pro 上使用集成 GPU,而我希望它使用独立 GPU。如果我将 MTLCreateSystemDefaultDevice()
(离散 GPU)的结果传递给 -[MPSImageAreaMin initWithDevice:...]
,我会收到断言失败:
-[MTLDebugComputeCommandEncoder setComputePipelineState:] failed assertion computePipelineState is associated with a different device
这可能是因为负责运行 -encodeToCommandBuffer:sourceTexture:destinationTexture:
的机器内部使用的 MTLComputeCommandEncoder
实例已设置为使用集成 GPU 。我认为这来自从CIImageProcessorOutput
对象中提取的commandBuffer
。
我的问题:是否可以指定 -encodeToCommandBuffer:sourceTexture:destinationTexture:
使用的 GPU?据推测,这涉及自定义输出/金属命令缓冲区,但我不确定。
最佳答案
使用哪个 GPU 应由执行图像处理的 CIContext
确定。您应该能够使用 [CIContext contextWithMTLDevice:]
初始值设定项指定设备。
顺便说一下,从 macOS 10.15 开始,还有一个内置的 CIMorphologyRectangleMinimum
过滤器具有相同的作用。还有一个circular version自 10.13 起可用。
关于objective-c - 如何在 CIImageProcessorKernel 子类中为 Metal Compute 指定设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58664137/
我是一名优秀的程序员,十分优秀!