首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vertexFunction :在.metal文件中定义的.metal一旦为MSL cikernel设置编译器和链接器选项,就变为零。

vertexFunction :在.metal文件中定义的.metal一旦为MSL cikernel设置编译器和链接器选项,就变为零。
EN

Stack Overflow用户
提问于 2019-08-07 09:43:58
回答 2查看 930关注 0票数 4

VertexFunction和FragmentFunction在.metal文件中定义得很好,但是当我在苹果公司的文档苹果公司的文档:-fcikernel标志之后指定编译器和链接器选项,而在MTLLINKER_FLAGS中在用户定义的设置中指定-cikernel平面时,它们就变成了零。

我需要上面的设置与MSL (金属阴影语言)的cikernel。实际上,带有核心图像内核语言的Core在12.0中被否决了。

如何同时使用顶点/片段金属着色器和MSL cikernel?

代码语言:javascript
复制
let library = self.device?.makeDefaultLibrary()!
let pipeLineDescriptor = MTLRenderPipelineDescriptor()
pipeLineDescriptor.vertexFunction=library.makeFunction(name: "myVertexShader")
pipeLineDescriptor.fragmentFunction=library.makeFunction(name: "myFragmentShader")
EN

回答 2

Stack Overflow用户

发布于 2020-02-15 09:05:03

在Xcode 11中对Frank的答案进行了更新,正如Giraff所提到的,金属编译器只是忽略了不以.metal结尾的输入文件。为了确保CI内核文件不受常规金属管道的影响,我将扩展名为".mcikernel“,并将其放入构建规则脚本:

代码语言:javascript
复制
mkdir -p ${DERIVED_FILES_DIR}/kernels
cp ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/${INPUT_FILE_BASE}.metal
xcrun metal -fcikernel ${DERIVED_FILES_DIR}/${INPUT_FILE_BASE}.metal -c -o ${DERIVED_FILES_DIR}/kernels/${INPUT_FILE_BASE}.air
xcrun metallib -cikernel -o ${DERIVED_FILES_DIR}/kernels/${INPUT_FILE_BASE}.metallib ${DERIVED_FILES_DIR}/kernels/${INPUT_FILE_BASE}.air
票数 1
EN

Stack Overflow用户

发布于 2021-05-16 06:46:47

我无法让现有的任何一个答案正常工作(AlterEgo答案似乎不完整,比如没有显示输入/输出文件设置)。

无论如何,苹果的WWDC视频推荐如下。

使用以下方法创建一个名为MyKernels.ci.metal的金属文件:

代码语言:javascript
复制
#include <metal_stdlib>
using namespace metal;

#include <CoreImage/CoreImage.h>
 
extern "C" float4 do_nothing(coreimage::sample_t s) {
    return s;
}

接下来,添加两个构建规则,它们都取消选中“每个体系结构运行一次”。规则1:

代码语言:javascript
复制
Source Files with names matching:
*.ci.metal

xcrun metal -c -I $MTL_HEADER_SEARCH_PATHS -fcikernel "${INPUT_FILE_PATH}" -o "${SCRIPT_OUTPUT_FILE_0}"

output files:
$(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).air

第二:

代码语言:javascript
复制
Source Files with names matching:
*.ci.air

xcrun metallib -cikernel "${INPUT_FILE_PATH}" -o "${SCRIPT_OUTPUT_FILE_0}"

output files:
$(METAL_LIBRARY_OUTPUT_DIR)/$(INPUT_FILE_BASE).metallib

使用:

代码语言:javascript
复制
let url = Bundle.main.url(forResource: "MyKernels", withExtension: "ci.metallib")!
let data = try! Data(contentsOf: url)
kernel = try! CIColorKernel(functionName: "do_nothing", fromMetalLibraryData: data)

注意,建议将fckernelcikernel标志添加到Build Settings中的其他答案是不推荐的。如果使用常规金属,它们会引起问题,可能还有其他问题。此解决方案将仅在具有.ci.metal扩展名的文件上使用这些标志。

构建规则的截图:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57391441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档