Hi Jacob - I think you’re right. “capacity” should be the count of type T elements in my buffer. So in my case that line should read
let shadowPtr = constantBufferForFrame.contents().bindMemory(to: ShadowPass.self, capacity: shadowPassData.count) The withMemoryRebound calls need similar adjustments. The pointer to MainPass is actually a single structure to it should be safe to do this let mainPtr : UnsafeMutablePointer<MainPass> = shadowPtr.advanced(by: 1).withMemoryRebound(to: MainPass.self, capacity: 1) { $0.pointee = mainPassFrameData } Whereas the unsafe pointer to <ObjectData> is actually a buffer of renderable objects, so this should work: var ptr : UnsafeMutablePointer<ObjectData> = mainPtr.advanced(by: 1).withMemoryRebound(to: ObjectData.self, capacity: objectsToRender) {_ in } There are surely ways to refactor and simplify this, but I’m trying to retain as much of the original sample code approach as possible. However, the compiler still segs badly. Xcode also borks an internal error often. Only cleaning or restarting the project can clear up that state. Compilers (or Playgrounds for that matter) should never crash, and I’m not sure where to file this bug : Swift or Apple radar against Xcode or both? I now Xcode 8 is beta but…it’s been doing this for quite a while now... In both our “close to the metal” (no pun intended) cases, it seems like a lot of churning for very little gain. Don’t you think? The easier, but “unsafe” casting afforded previously did the trick with the normal caveats. Don’t get me wrong, I love Swift and “get" all the neat type safety features. Guess we can’t have our cake and eat it too, especially when interfacing with “unsafe” C APIs. Anyway, back to rtfm … maybe some of the Swift Gods can chime in? ;-) I must be doing something stupid...Patrice > On Sep 3, 2016, at 2:32 AM, Jacob Bandes-Storch <jtban...@gmail.com> wrote: > > Hi Patrice, > I don't have a solution for you, but I just wanted to point out what I think > may be an error with your use of the new UnsafeRawPointer APIs: > > constantBufferForFrame.contents().bindMemory(to: ShadowPass.self, capacity: > MemoryLayout<ShadowPass>.size) > > I believe the `capacity` should actually be the number of ShadowPass elements > in the buffer, not the size of each element. Using `bindMemory(to: > ShadowPass.self` already implies that MemoryLayout<ShadowPass>.size is the > size of each element. > > More info at > https://developer.apple.com/reference/swift/unsaferawpointer/2428875-bindmemory > > <https://developer.apple.com/reference/swift/unsaferawpointer/2428875-bindmemory> > > I just updated a small Metal project of mine to Swift 3. I ran into some > compiler (playground) crashes, but it does seem to work most of the time. > Although I only have 1 buffer :-) > https://github.com/jtbandes/Metalbrot.playground > <https://github.com/jtbandes/Metalbrot.playground> > > Jacob > > On Fri, Sep 2, 2016 at 11:00 AM, Patrice Kouame via swift-users > <swift-users@swift.org <mailto:swift-users@swift.org>> wrote: > Hi all - > > I’m converting Apple’s Swift Sample "Adopting Metal II: Designing and > Implementing a Real-World Metal Renderer” in Xcode 8 beta6 to the latest > UnsafeMutablePointer API for untyped memory access. > Changes are necessary in MetalView.swift (Apple hasn’t updated their sample > code for the latest beta yet…) > The Swift Compiler crashes (Segmentation Fault: 11) on the attempt: > > // Grab a pointer to the constant buffer's data store > // Since we are using Swift, it is easier to cast the pointer to the > ShadowPass type to fill the constant buffer > // We need to make a copy of these so the block captures the correct > data > > // let shadowPtr = > UnsafeMutablePointer<ShadowPass>(constantBufferForFrame.contents()) > let shadowPtr = constantBufferForFrame.contents().bindMemory(to: > ShadowPass.self, capacity: MemoryLayout<ShadowPass>.size) > shadowPtr.pointee = shadowPassData[0] > > //More Swift specific stuff - advance pointer and cast to MainPass > > // let mainPtr = UnsafeMutablePointer<MainPass>(shadowPtr.advanced(by: > 1)) > // mainPtr.pointee = mainPassFrameData > let mainPtr : UnsafeMutablePointer<MainPass> = > shadowPtr.advanced(by: 1).withMemoryRebound(to: MainPass.self, capacity: > MemoryLayout<MainPass>.size) { > $0.pointee = mainPassFrameData > } > > //Advance and cast to ObjectData > > // var ptr = UnsafeMutablePointer<ObjectData>(mainPtr.advanced(by: 1)) > var ptr : UnsafeMutablePointer<ObjectData> = mainPtr.advanced(by: > 1).withMemoryRebound(to: ObjectData.self, capacity: > MemoryLayout<ObjectData>.size) {_ in > } > > let shadowOffset = 0 > let mainPassOffset = MemoryLayout<ShadowPass>.size + shadowOffset > let objectDataOffset = MemoryLayout<MainPass>.size + mainPassOffset > > // Update position of all the objects > if multithreadedUpdate { > DispatchQueue.concurrentPerform(iterations: objectsToRender) { i > in > let thisPtr = ptr.advanced(by: i) > _ = self.renderables[i].UpdateData(ptr, deltaTime: 1.0/60.0) > } > } > else { > for index in 0..<objectsToRender { > ptr = renderables[index].UpdateData(ptr, deltaTime: 1.0/60.0) > } > } > > ptr = ptr.advanced(by: objectsToRender) > > _ = groundPlane!.UpdateData(ptr, deltaTime: 1.0/60.0) > > Any help is appreciated. I have the latest Xcode log handy if necessary. > Here’s a clip of the stack trace. > > 0 swift 0x000000010714a99d > PrintStackTraceSignalHandler(void*) + 45 > 1 swift 0x000000010714a3e6 SignalHandler(int) + 470 > 2 libsystem_platform.dylib 0x00007fff91461bba _sigtramp + 26 > 3 libsystem_platform.dylib 000000000000000000 _sigtramp + 1857676384 > 4 swift 0x00000001047207b3 (anonymous > namespace)::SILGenApply::visitExpr(swift::Expr*) + 51 > 5 swift 0x0000000104723ace (anonymous > namespace)::SILGenApply::visitApplyExpr(swift::ApplyExpr*) + 5182 > 6 swift 0x0000000104711cc1 > prepareApplyExpr(swift::Lowering::SILGenFunction&, swift::Expr*) + 273 > 7 swift 0x00000001047624e7 swift::ASTVisitor<(anonymous > namespace)::RValueEmitter, swift::Lowering::RValue, void, void, void, void, > void, swift::Lowering::SGFContext>::visit(swift::Expr*, > swift::Lowering::SGFContext) + 103 > 8 swift 0x0000000104762313 > swift::Lowering::SILGenFunction::emitExprInto(swift::Expr*, > swift::Lowering::Initialization*) + 195 > 9 swift 0x000000010474fbc3 > swift::Lowering::SILGenFunction::emitPatternBinding(swift::PatternBindingDecl*, > unsigned int) + 195 > 10 swift 0x00000001047077bd > swift::ASTVisitor<swift::Lowering::SILGenFunction, void, void, void, void, > void, void>::visit(swift::Decl*) + 125 > 11 swift 0x00000001047c0019 swift::ASTVisitor<(anonymous > namespace)::StmtEmitter, void, void, void, void, void, > void>::visit(swift::Stmt*) + 4169 > 12 swift 0x00000001047809ba > swift::Lowering::SILGenFunction::emitFunction(swift::FuncDecl*) + 314 > 13 swift 0x00000001046fd775 > swift::Lowering::SILGenModule::emitFunction(swift::FuncDecl*)::$_1::operator()(swift::SILFunction*) > const + 1877 > 14 swift 0x00000001046fc322 > swift::Lowering::SILGenModule::emitFunction(swift::FuncDecl*) + 626 > 15 swift 0x00000001047c7007 (anonymous > namespace)::SILGenType::emitType() + 1271 > 16 swift 0x00000001047c6a9e > swift::Lowering::SILGenModule::visitNominalTypeDecl(swift::NominalTypeDecl*) > + 30 > 17 swift 0x0000000104709093 > swift::Lowering::SILGenModule::emitSourceFile(swift::SourceFile*, unsigned > int) + 1795 > 18 swift 0x000000010470ad4d > swift::SILModule::constructSIL(swift::ModuleDecl*, swift::SILOptions&, > swift::FileUnit*, llvm::Optional<unsigned int>, bool, bool) + 1629 > 19 swift 0x00000001045621bf > performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, > llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*) + 19487 > 20 swift 0x000000010455b2c5 > swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, > swift::FrontendObserver*) + 17029 > 21 swift 0x000000010451888d main + 8685 > 22 libdyld.dylib 0x00007fff91255255 start + 1 > > > Patrice > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org <mailto:swift-users@swift.org> > https://lists.swift.org/mailman/listinfo/swift-users > <https://lists.swift.org/mailman/listinfo/swift-users> > >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users