<div dir="ltr"><div>I don&#39;t think I&#39;m misunderstanding you, but I might be, so I&#39;ll add more detail:</div><div><br></div>If you look at the Metal article, you&#39;ll see that the (Swift) struct &quot;Vertex&quot; is used to specify the data that is sent to Metal for creating a buffer (using MTLDevice<span style="color:rgb(56,58,66);font-family:&#39;Droid Sans Mono&#39;,sans-serif;font-size:12px;white-space:pre-wrap;background-color:rgb(250,250,250)">.makeBuffer</span>). The result that the GPU will produce surely depends on the fields of the Vertex struct (x, y, z, r, g, b, a) being in the specified order (ie swapping the red channel with the x coordinate would produce an unexpected result).<br><div><br></div><div>And regarding the second example, pixel structs used for manipulating raster image data. Manipulating raster image data presumably includes stuff like displaying to screen, loading and saving raster images.</div><div>I currently use this way of doing this right now without any problems, but if the order of the fields (eg a, r, g, b) should change in the future, then my code would break (the colors of the images would at least not come out as expected).<br></div><div><br></div><div>/Jens</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jul 9, 2017 at 5:53 PM, Chris Lattner <span dir="ltr">&lt;<a href="mailto:clattner@nondot.org" target="_blank">clattner@nondot.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span class=""><blockquote type="cite"><div>On Jul 9, 2017, at 12:23 AM, Jens Persson &lt;<a href="mailto:jens@bitcycle.com" target="_blank">jens@bitcycle.com</a>&gt; wrote:</div><br class="m_939603476265006243Apple-interchange-newline"><div><div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Sat, Jul 8, 2017 at 6:28 PM, Chris Lattner via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word">Hi Susan,<div><br></div><div>Swift does not currently specify a layout for Swift structs.  You shouldn’t be using them for memory mapped i/o or writing to a file, because their layout can change.  When ABI stability for fragile structs lands, you will be able to count on it, but until then something like this is probably a bad idea.</div><div><br></div><div>-Chris</div></div></blockquote></div><br></div><div class="gmail_extra">Does this imply that you should never use Swift structs to eg interact with Metal?</div></div></div></blockquote><div><br></div></span>No.</div><div><br></div><div><span class=""><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra">This seems to be a very common practice. Here is a typical example (from a Metal tutorial at <a href="http://raywenderlich.com/" target="_blank">raywenderlich.com</a>):</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">struct Vertex {</div><div class="gmail_extra">  var x,y,z: Float     // position data</div><div class="gmail_extra">  var r,g,b,a: Float   // color data</div><div class="gmail_extra"><br></div><div class="gmail_extra">  func floatBuffer() -&gt; [Float] {</div><div class="gmail_extra">    return [x,y,z,r,g,b,a]</div><div class="gmail_extra">  }</div><div class="gmail_extra">}</div></div></div></div></blockquote><div><br></div></span><div>This doesn’t appear to expose the layout of the struct.</div><span class=""><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra">Also, does it imply that we cannot use structs (of only primitive types) like:</div><div class="gmail_extra"><br></div><div class="gmail_extra">struct RgbaFloatsLinearGamma {</div><div class="gmail_extra">    var r, g, b, a: Float</div><div class="gmail_extra">    …</div><div class="gmail_extra">}</div><div class="gmail_extra">struct BgraBytesSrgbGamma {</div><div class="gmail_extra">    var b, g, r, a: UInt8</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">for manipulating raster image data?</div></div></div></blockquote><div><br></div></span><div>I don’t see why that would be a problem.</div><span class=""><div><br></div><blockquote type="cite"><div><div dir="ltr"><div class="gmail_extra">I vaguely remember a swift evo discussion where it was concluded that such usage was considered OK provided the stored properties of the structs was only primitive types, but I can&#39;t find it now.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Perhaps it could be considered OK at least when the intended platforms are known to be only iOS devices?</div></div></div></blockquote><br></span></div><div>I think you’re misunderstanding what I’m saying.  It isn’t correct to take (e.g.) an unsafepointer to the beginning of a struct, and serialize that out to disk, and expect that the fields are emitted in some order with some specific padding between them.  None of the uses above try to do this.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>-Chris</div><div><br></div><br></font></span></div></blockquote></div><br></div>