Indeed. There is a difference between stride and size, but I interpreted
capacity incorrectly for my purposes. It should indicate the number of <T>
elements (not their size - right?) and the snippets below should work.
Still, compiler crashes and Xcode IDE is left in inconsistent state. So I
filed this Apple radar against Developer Tools.
28150447 - Swift 3 UnsafeMutablePointer conversion crashes the compiler
and IDE
Should I file a Swift bug too? Would that be helpful?
Regards, Patrice
> On Sep 3, 2016, at 11:39 AM, Gerard Iglesias via swift-users
> <[email protected]> wrote:
>
> Hello,
>
> I think that it is more secure to use stride in place of size, sometimes it
> is not the same value.
>
> I use it in my own use of raw bindings
>
> Regards
>
> Gérard
>
> Le 3 sept. 2016 à 10:03, Patrice Kouame via swift-users
> <[email protected] <mailto:[email protected]>> a écrit :
>
>> 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 <[email protected]
>>> <mailto:[email protected]>> 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
>>> <[email protected] <mailto:[email protected]>> 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
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>>>
>>>
>>
>> _______________________________________________
>> swift-users mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-users
>> <https://lists.swift.org/mailman/listinfo/swift-users>
> _______________________________________________
> swift-users mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users