Move all Metal setup to the Renderer
This commit is contained in:
parent
e18a956875
commit
3ce38b4b8b
2 changed files with 23 additions and 23 deletions
|
@ -20,9 +20,14 @@ class Renderer: NSObject, MTKViewDelegate {
|
||||||
var terrainGridSize = CGSize(width: 11, height: 11)
|
var terrainGridSize = CGSize(width: 11, height: 11)
|
||||||
var terrain = Terrain()
|
var terrain = Terrain()
|
||||||
|
|
||||||
func setupMetal(withDevice device: MTLDevice, pixelFormat: MTLPixelFormat) {
|
func setupMetal(withView view: MTKView) {
|
||||||
|
guard let device = MTLCreateSystemDefaultDevice() else {
|
||||||
|
fatalError("Unable to create system Metal device")
|
||||||
|
}
|
||||||
self.device = device
|
self.device = device
|
||||||
|
|
||||||
|
setup(view: view, withDevice: device)
|
||||||
|
|
||||||
guard let queue = device.makeCommandQueue() else {
|
guard let queue = device.makeCommandQueue() else {
|
||||||
fatalError("Unable to create Metal command queue")
|
fatalError("Unable to create Metal command queue")
|
||||||
}
|
}
|
||||||
|
@ -30,12 +35,15 @@ class Renderer: NSObject, MTKViewDelegate {
|
||||||
self.commandQueue = queue
|
self.commandQueue = queue
|
||||||
|
|
||||||
let bundle = Bundle(for: type(of: self))
|
let bundle = Bundle(for: type(of: self))
|
||||||
guard let library = try? device.makeDefaultLibrary(bundle: bundle) else {
|
self.library = try! device.makeDefaultLibrary(bundle: bundle)
|
||||||
fatalError("Unable to create default Metal library")
|
|
||||||
}
|
|
||||||
self.library = library
|
|
||||||
|
|
||||||
setupRenderPipeline(withDevice: device, library: library, pixelFormat: pixelFormat)
|
setupRenderPipeline(withDevice: device, library: library, pixelFormat: view.colorPixelFormat)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setup(view: MTKView, withDevice device: MTLDevice) {
|
||||||
|
view.device = device
|
||||||
|
view.clearColor = MTLClearColor(red: 1, green: 0, blue: 0, alpha: 1)
|
||||||
|
view.colorPixelFormat = .bgra8Unorm
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupRenderPipeline(withDevice device: MTLDevice, library: MTLLibrary, pixelFormat: MTLPixelFormat) {
|
func setupRenderPipeline(withDevice device: MTLDevice, library: MTLLibrary, pixelFormat: MTLPixelFormat) {
|
||||||
|
@ -43,7 +51,7 @@ class Renderer: NSObject, MTKViewDelegate {
|
||||||
let fragmentShader = library.makeFunction(name: "passthroughFragment")
|
let fragmentShader = library.makeFunction(name: "passthroughFragment")
|
||||||
|
|
||||||
let desc = MTLRenderPipelineDescriptor()
|
let desc = MTLRenderPipelineDescriptor()
|
||||||
desc.label = "Pixel Pipeline"
|
desc.label = "Passthrough Pipeline"
|
||||||
desc.vertexFunction = vertexShader
|
desc.vertexFunction = vertexShader
|
||||||
desc.fragmentFunction = fragmentShader
|
desc.fragmentFunction = fragmentShader
|
||||||
if let renderAttachment = desc.colorAttachments[0] {
|
if let renderAttachment = desc.colorAttachments[0] {
|
||||||
|
@ -65,6 +73,8 @@ class Renderer: NSObject, MTKViewDelegate {
|
||||||
terrain.generateVertexes(intoBuffer: buffer, size: terrainGridSize)
|
terrain.generateVertexes(intoBuffer: buffer, size: terrainGridSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - MTKViewDelegate
|
||||||
|
|
||||||
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
|
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
|
||||||
print("Size of \(view.debugDescription) will change to \(size)")
|
print("Size of \(view.debugDescription) will change to \(size)")
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,34 +11,24 @@ import MetalKit
|
||||||
|
|
||||||
class TerrainViewController: NSViewController {
|
class TerrainViewController: NSViewController {
|
||||||
|
|
||||||
var renderer: Renderer!
|
let renderer = Renderer()
|
||||||
|
|
||||||
private var metalView: MTKView! {
|
private var metalView: MTKView {
|
||||||
return view as? MTKView
|
return view as! MTKView
|
||||||
}
|
}
|
||||||
|
|
||||||
override func loadView() {
|
override func loadView() {
|
||||||
guard let device = MTLCreateSystemDefaultDevice() else {
|
let v = MTKView()
|
||||||
fatalError("Couldn't create system default Metal device")
|
|
||||||
}
|
|
||||||
let v = MTKView(frame: CGRect(), device: device)
|
|
||||||
v.translatesAutoresizingMaskIntoConstraints = false
|
v.translatesAutoresizingMaskIntoConstraints = false
|
||||||
v.widthAnchor.constraint(greaterThanOrEqualToConstant: 640).isActive = true
|
v.widthAnchor.constraint(greaterThanOrEqualToConstant: 640).isActive = true
|
||||||
v.heightAnchor.constraint(greaterThanOrEqualToConstant: 480).isActive = true
|
v.heightAnchor.constraint(greaterThanOrEqualToConstant: 480).isActive = true
|
||||||
view = v
|
view = v
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewDidLoad() {
|
|
||||||
renderer = Renderer()
|
|
||||||
metalView.delegate = renderer
|
|
||||||
}
|
|
||||||
|
|
||||||
override func viewWillAppear() {
|
override func viewWillAppear() {
|
||||||
super.viewWillAppear()
|
super.viewWillAppear()
|
||||||
guard let device = metalView.device else {
|
metalView.delegate = renderer
|
||||||
return
|
renderer.setupMetal(withView: metalView)
|
||||||
}
|
|
||||||
renderer.setupMetal(withDevice: device, pixelFormat: metalView.colorPixelFormat)
|
|
||||||
renderer.prepareToRender()
|
renderer.prepareToRender()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue