-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComputeShader.swift
More file actions
60 lines (46 loc) · 1.76 KB
/
ComputeShader.swift
File metadata and controls
60 lines (46 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//
// ComputeShader.swift
// tetracono
//
// Created by Eric Li on 7/25/18.
// Copyright © 2018 O-R-G inc. All rights reserved.
//
import CoreMedia
import Metal
class ComputeShader {
var outputTexture: MTLTexture?
var inputTexture: MTLTexture?
private var pipelineState: PipelineStateConfiguration
private var computePipelineState: MTLComputePipelineState?
init(computeShader: String) {
pipelineState = PipelineStateConfiguration(pixelFormat: .bgra8Unorm, vertexShader: "", fragmentShader: "", computeShader: computeShader)
commonInit()
}
deinit {
print("Deinit Filter")
}
func calculateWithCommandBuffer(buffer: MTLCommandBuffer, configureEncoder: ((_ commandEncoder: MTLComputeCommandEncoder) -> Void)?) {
if let computePipelineState = computePipelineState, let computeCommandEncoder = buffer.makeComputeCommandEncoder() {
computeCommandEncoder.pushDebugGroup("Base Filter Compute Encoder")
computeCommandEncoder.setComputePipelineState(computePipelineState)
configureEncoder?(computeCommandEncoder)
computeCommandEncoder.endEncoding()
computeCommandEncoder.popDebugGroup()
}
}
private func configurePipeline() {
if pipelineState.computeShader.count > 0 {
if computePipelineState != nil {
return
}
do {
computePipelineState = try MetalDevice.createComputePipeline(computeFunctionName: pipelineState.computeShader)
} catch {
print("Could not create compute pipeline state.")
}
}
}
private func commonInit() {
configurePipeline()
}
}