I have an array of 3 MTLBuffers. They are created and then reused. They are managed with semaphores to avoid conflicts. I need to write to them using a struct I created. I'm having trouble binding to the MTLBuffer and assign my struct format to it. I'm converting this from OBJ-C to SWIFT. The OBJ-C code works. I'm getting an error in SWIFT "Cast from '(any MTLBuffer)?' to unrelated type 'AAPLUniforms' always fails" How can I do this?
The struct
typedef struct{
matrix_float4x4 mvpMatrix;
float pointSize;} AAPLUniforms;
I create the array of MTLBuffers here
/ Create and allocate the dynamic uniform buffer objects.
for i in 0..<AAPLMaxRenderBuffersInFlight {
// Indicate shared storage so that both the CPU can access the buffers
let storageMode: MTLResourceOptions = .storageModeShared
dynamicUniformBuffers[i] = device.makeBuffer(
length: MemoryLayout<AAPLUniforms>.size,
options: storageMode)
dynamicUniformBuffers[i]?.label = String(format: "UniformBuffer%lu", i)
}
I'm getting an error "Cast from '(any MTLBuffer)?' to unrelated type 'AAPLUniforms' always fails" trying at bind the MTLBuffer to the struct type
func updateState() {
var uniforms = dynamicUniformBuffers[currentBufferIndex] as? AAPLUniforms
uniforms?.pointSize = AAPLBodyPointSize
uniforms?.mvpMatrix = projectionMatrix!
}
The working OBJC code looks like this
- (void)updateState{
AAPLUniforms *uniforms = (AAPLUniforms *)_dynamicUniformBuffers[_currentBufferIndex].contents;
uniforms->pointSize = AAPLBodyPointSize;
uniforms->mvpMatrix = _projectionMatrix;
CodePudding user response:
What you need is the pointer to the actual memory of the MTLBuffer
's contents. You get that using its contents()
method, which will return an UnsafeMutableRawPointer
. You can then call its bindMemory
method to bind (cast) it to UnsafeMutablePointer<AAPLUniforms>
. After that, you can use its pointee
property to access your AAPLUniforms
instance.
I think this should do what you want:
let uniformsPtr = dynamicUniformBuffers[currentBufferIndex]!.contents()
.bindMemory(to: AAPLUniforms.self, capacity: 1)
uniformsPtr.pointee.pointSize = AAPLBodyPointSize
uniformsPtr.pointee.mvpMatrix = projectionMatrix!