@@ -2,40 +2,34 @@ import Foundation
22import Metal
33
44public class ShaderUniformSettings {
5- private var uniformValues : [ Float ] = [ ]
6- private var uniformValueOffsets : [ Int ] = [ ]
5+ let uniformLookupTable : [ String : Int ]
6+ private var uniformValues : [ Float ]
7+ private var uniformValueOffsets : [ Int ]
78 public var colorUniformsUseAlpha : Bool = false
89 let shaderUniformSettingsQueue = DispatchQueue (
910 label: " com.sunsetlakesoftware.GPUImage.shaderUniformSettings " ,
1011 attributes: [ ] )
11- let uniformLookupTable : [ String : Int ]
1212
13- public init ( uniformLookupTable: [ String : ( Int , MTLDataType ) ] ) {
13+ public init ( uniformLookupTable: [ String : ( Int , MTLStructMember ) ] , bufferSize : Int ) {
1414 var convertedLookupTable : [ String : Int ] = [ : ]
1515
16- var orderedDatatypes = [ MTLDataType ] ( repeating: . float , count: uniformLookupTable. count)
16+ var orderedOffsets = [ Int ] ( repeating: 0 , count: uniformLookupTable. count)
1717
18- for (key, value ) in uniformLookupTable {
19- let ( index, dataType ) = value
18+ for (key, uniform ) in uniformLookupTable {
19+ let ( index, structMember ) = uniform
2020 convertedLookupTable [ key] = index
21- orderedDatatypes [ index] = dataType
21+ orderedOffsets [ index] = structMember . offset / 4
2222 }
2323
2424 self . uniformLookupTable = convertedLookupTable
25-
26- for dataType in orderedDatatypes {
27- self . appendBufferSpace ( for: dataType)
28- }
25+ self . uniformValues = [ Float] ( repeating: 0.0 , count: bufferSize/ 4 )
26+ self . uniformValueOffsets = orderedOffsets
2927 }
3028
3129 public var usesAspectRatio : Bool { get { return self . uniformLookupTable [ " aspectRatio " ] != nil } }
3230
3331 private func internalIndex( for index: Int ) -> Int {
34- if ( index == 0 ) {
35- return 0
36- } else {
37- return uniformValueOffsets [ index - 1 ]
38- }
32+ return uniformValueOffsets [ index]
3933 }
4034
4135 // MARK: -
@@ -154,37 +148,6 @@ public class ShaderUniformSettings {
154148
155149 // MARK: -
156150 // MARK: Uniform buffer memory management
157-
158- func appendBufferSpace( for dataType: MTLDataType ) {
159- let uniformSize : Int
160- switch dataType {
161- case . float: uniformSize = 1
162- case . float2: uniformSize = 2
163- case . float3: uniformSize = 4 // Hack to fix alignment issues
164- case . float4: uniformSize = 4
165- case . float3x3: uniformSize = 12
166- case . float4x4: uniformSize = 16
167- default : fatalError ( " Uniform data type of value: \( dataType. rawValue) not supported " )
168- }
169- let blankValues = [ Float] ( repeating: 0.0 , count: uniformSize)
170-
171- let lastOffset = alignPackingForOffset ( uniformSize: uniformSize, lastOffset: uniformValueOffsets. last ?? 0 )
172- uniformValues. append ( contentsOf: blankValues)
173- uniformValueOffsets. append ( lastOffset + uniformSize)
174- }
175-
176- func alignPackingForOffset( uniformSize: Int , lastOffset: Int ) -> Int {
177- let floatAlignment = ( lastOffset + uniformSize) % 4
178- let previousFloatAlignment = lastOffset % 4
179- if ( uniformSize > 1 ) && ( floatAlignment != 0 ) && ( previousFloatAlignment != 0 ) {
180- let paddingToAlignment = 4 - floatAlignment
181- uniformValues. append ( contentsOf: [ Float] ( repeating: 0.0 , count: paddingToAlignment) )
182- uniformValueOffsets [ uniformValueOffsets. count - 1 ] = lastOffset + paddingToAlignment
183- return lastOffset + paddingToAlignment
184- } else {
185- return lastOffset
186- }
187- }
188151
189152 public func restoreShaderSettings( renderEncoder: MTLRenderCommandEncoder ) {
190153 shaderUniformSettingsQueue. sync {
0 commit comments