Post

Replies

Boosts

Views

Activity

Reply to 2D buffer visualization for GPGPU application
Thank you @MoreLightning, it is really tough to get up to date information on such subjects, and many examples are either in Obj-C or old swift versions which do not even build in the latest xcode :( Finally after looking through many tutorials I have found exactly what I need for 2D buffers visualization - there is a technique to use compute pipeline instead of render pipeline, and use a very basic kernel function to output texture directly into the view: &#9;&#9;func init() { &#9;&#9;&#9;&#9;...         let function = library?.makeFunction(name: "compute")         device.makeComputePipelineState(function: function as! MTLFunction) &#9;&#9;&#9;&#9;... &#9;&#9;} &#9;&#9;func draw(in view: MTKView) { &#9;&#9;&#9;&#9;if let commandBuffer = commandQueue.makeCommandBuffer() { &#9;&#9;&#9;&#9;&#9;&#9;if let renderEncoder = commandBuffer.makeComputeCommandEncoder() { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;if let drawable = view.currentDrawable { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;renderEncoder.setComputePipelineState(pipelineState) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;renderEncoder.setTexture(drawable.texture, index: 0) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;renderEncoder.setTexture(colorMap, index: 1) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;var w = pipelineState.threadExecutionWidth &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;var h = pipelineState.maxTotalThreadsPerThreadgroup / w &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;let threadsPerGroup = MTLSizeMake(w, h, 1) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;w = Int(drawable.texture.width) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;h = Int(drawable.texture.height) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;let threadsPerGrid = MTLSizeMake(w, h, 1) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;renderEncoder.dispatchThreads(threadsPerGrid, threadsPerThreadgroup: threadsPerGroup) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;renderEncoder.endEncoding() &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;commandBuffer.present(drawable) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;commandBuffer.commit() &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;} &#9;} and compute.metal: #include <metal_stdlib> using namespace metal; kernel void compute(texture2d<float, access::write> output [[texture(0)]], &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9; texture2d<float, access::sample> input [[texture(1)]], &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9; uint2 id [[thread_position_in_grid]]) { &#9;&#9;uint2 index = uint2(id.x, id.y); &#9;&#9;float4 color = input.read(index); &#9;&#9;output.write(color, id); } Kudos to metalkit.org/2019/01/31/intro-to-metal-compute.html
Nov ’20