42 lines
1.6 KiB
Swift
42 lines
1.6 KiB
Swift
|
|
import MetalKit
|
|
|
|
public class MetalView: NSObject, MTKViewDelegate {
|
|
weak var view: MTKView!
|
|
let commandQueue: MTLCommandQueue!
|
|
let device: MTLDevice!
|
|
let cps: MTLComputePipelineState!
|
|
|
|
public init?(mtkView: MTKView, shader: String) {
|
|
view = mtkView
|
|
view.clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1)
|
|
view.colorPixelFormat = .bgra8Unorm
|
|
device = MTLCreateSystemDefaultDevice()!
|
|
commandQueue = device.makeCommandQueue()
|
|
let library = try! device.makeLibrary(source: shader, options: nil)
|
|
let function = library.makeFunction(name:"k")!
|
|
cps = try! device.makeComputePipelineState(function: function)
|
|
|
|
super.init()
|
|
view.delegate = self
|
|
view.device = device
|
|
}
|
|
|
|
public func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {}
|
|
|
|
public func draw(in view: MTKView) {
|
|
if let drawable = view.currentDrawable,
|
|
let commandBuffer = commandQueue.makeCommandBuffer(),
|
|
let commandEncoder = commandBuffer.makeComputeCommandEncoder() {
|
|
commandEncoder.setComputePipelineState(cps)
|
|
commandEncoder.setTexture(drawable.texture, index: 0)
|
|
let groups = MTLSize(width: Int(view.frame.width)/4, height: Int(view.frame.height)/4, depth: 1)
|
|
let threads = MTLSize(width: 8, height: 8,depth: 1)
|
|
commandEncoder.dispatchThreadgroups(groups,threadsPerThreadgroup: threads)
|
|
commandEncoder.endEncoding()
|
|
commandBuffer.present(drawable)
|
|
commandBuffer.commit()
|
|
}
|
|
}
|
|
}
|