(控制台)输出?
我可以使用控制台输出(如Swift中的print
)来调试我的金属阴影语言代码吗?
如果是,如何?
如果不是,有没有其他方法可以从我的.metal文件输出变量? (也许通过使用commandEncoder-buffer将.metal文件中的数据传递给我的.swift文件?)
我没有成功尝试通过commandEncoder将引用传递给Int变量(位于我的.swift文件中)到我的.metal文件。 在.metal文件中,我为int变量赋值,但是如果我在swift文件中打印Int,那么赋值不在那里。
.swift文件:
...
var myMetalOutput: Int = 0
...
let printBuffer = device.newBufferWithBytes(&myMetalOutput, length: sizeof(Int), options: MTLResourceOptions.CPUCacheModeDefaultCache)
commandEncoder.setBuffer(printBuffer, offset: 0, atIndex: 8)
...
commandBuffer.commit()
drawable.present()
print("myMetalOutput: (myMetalOutput)")
...
.metal文件:
...
kernel void shader(..., device int &printBuffer [[8]], ...) {
...
printBuffer = 123;
...
}
控制台输出总是myMetalOutput: 0
如果有人需要它,这是一个可行的解决方案:
let device = MTLCreateSystemDefaultDevice()!
let commandQueue = device.newCommandQueue()
let defaultLibrary = device.newDefaultLibrary()!
let commandBuffer = commandQueue.commandBuffer()
let computeCommandEncoder = commandBuffer.computeCommandEncoder()
let program = defaultLibrary.newFunctionWithName("shader")
do
{
let computePipelineFilter = try device.newComputePipelineStateWithFunction(program!)
computeCommandEncoder.setComputePipelineState(computePipelineFilter)
var resultdata = [Int](count: 1, repeatedValue: 0)
let outVectorBuffer = device.newBufferWithBytes(&resultdata, length: sizeofValue(1), options: MTLResourceOptions.CPUCacheModeDefaultCache)
computeCommandEncoder.setBuffer(outVectorBuffer, offset: 0, atIndex: 0)
let threadsPerGroup = MTLSize(width:1,height:1,depth:1)
let numThreadgroups = MTLSize(width:1, height:1, depth:1)
computeCommandEncoder.dispatchThreadgroups(numThreadgroups, threadsPerThreadgroup: threadsPerGroup)
computeCommandEncoder.endEncoding()
commandBuffer.addCompletedHandler {commandBuffer in
let data = NSData(bytes: outVectorBuffer.contents(), length: sizeof(NSInteger))
var out: NSInteger = 0
data.getBytes(&out, length: sizeof(NSInteger))
print("data: (out)")
}
commandBuffer.commit()
}
catch
{
fatalError("newComputePipelineStateWithFunction failed ")
}
着色器:
kernel void shader(device int &printBuffer [[buffer(0)]], uint id [[ thread_position_in_grid ]]) {
printBuffer = 123;
}
这里有一些事情出错了。 首先, newBufferWithBytes(_:length:)
会复制您提供的数据,因此写入的地址不是原始变量的地址。 其次,在尝试读取结果之前,您似乎并未等待计算内核完成。 您可以拨打waitUntilCompleted()
上的相应命令缓冲区(该块当前线程),或者也可以称之为addCompletedHandler()
提供一个封闭,将异步当内核运行完成后调用。 此时,您应该能够从缓冲区读回数据。
没有工具可以从Metal着色器内部打印到命令行,因此写入缓冲区或纹理几乎是您的最佳选择。
链接地址: http://www.djcxy.com/p/32769.html上一篇: (Console) Output?
下一篇: Webpack loader equivalent of requirejs plugin load with XMLHttpRequest