如何调试Core Image内核中的语法错误?

时间:2012-12-07 00:17:17

标签: macos quartz-graphics core-image

在编写新的Core Image过滤器时,您需要在Core Image Kernel Language中编写内核,这是一种轻微变异的OpenGL着色器语言。你可以在运行时用这样的东西编译它们......

NSString *myCode = ...
NSArray *kernels = [CIKernel kernelsWithString:myCode];

问题是任何语法错误,你只需返回一个nil而不是一个数组。记录的API没有提供获取诊断信息的机制。

如果您按照Apple文档中的建议使用Quartz Composer中的过滤器,您会发现它可以为您提供语法错误信息。 (这仅适用于简单的过滤器。)

那么,如何获取错误的内核源文件的诊断信息呢?

更新:根据具体情况,您可能会在控制台上显示格式化的行。如果您很幸运,那么您不必担心这一点,只需寻找以下几行:

8: error: in function kernel vec4 clipDetection (uniform in sampler, uniform in float)
8: error: unknown variable name: gratuitous

当然,如果你仍然需要掌握这些信息......

1 个答案:

答案 0 :(得分:4)

如果在CIKernel类上使用内省,则会找到kernelsWithString:messageLog:方法。它没有公共接口,但不要让它阻止你......

NSString *myCode = ...
NSMutableArray *messageLog = [NSMutableArray array];
NSArray *kernels = [[CIKernel class] performSelector:@selector(kernelsWithString:messageLog:) withObject:myCode withObject:messageLog];
if ( messageLog.count > 0) NSLog(@"Error: %@", messageLog.description);

messageLog参数想成为一个可变数组。如果出现错误,将会有一些字典。这些内容在互联网上无法显示,但它们看起来像这样(在我向内核的源添加“无故错误”的情况下)......

2012-12-06 17:56:53.077 MyProgram[14334:303] Error: (
        {
        CIKernelMessageDescription = "kernel vec4 clipDetection (uniform in sampler, uniform in float)";
        CIKernelMessageLineNumber = 8;
        CIKernelMessageType = CIKernelMessageTypeFunctionName;
    },
        {
        CIKernelMessageDescription = "unknown variable name: gratuitous";
        CIKernelMessageLineNumber = 8;
        CIKernelMessageType = CIKernelMessageTypeError;
    }
)

与往常一样,请考虑将其保留在运输代码中。它没有记录,Apple可以随时对它做任何事情。他们甚至可能会记录下来。