Skip to content

Latest commit

 

History

History
79 lines (61 loc) · 3.71 KB

README.md

File metadata and controls

79 lines (61 loc) · 3.71 KB

Drew's fast Rust Metal bindings

Provides select Rust bindings for Apple Metal framework. May be compared to alternative crates metal, objrs_frameworks_metal, metal-rs, and metal-sys.

Part of the objr expanded universe, distinctive features of this library:

  • Fast. This crate is significantly faster than other crates. If you're struggling to get 60fps or ProMotion/adaptive refresh rate speeds, this is the solution for you.
    • The full set of optimization is far too many to list, but the big idea is to either do what native ObjC/Swift applications do, or do something faster.
    • Compile-time selectors. Most Rust crates do a runtime lookup for ObjC methods, which involves acquiring a lock and other yucky stuff, either on the first call or every call. Instead, we do what real ObjC compilers do, which is way faster. For more details, see objr
    • Smart pointers that provide global ARC inference. Like ARC, you don't need to write manual retain/release calls. Unlike ARC, the compiler usually doesn't need to write them either, meaning lower runtime memory management cost than even native code. For more details, see objr.
    • Runtime autorelease eliding, which keeps your objects out of autoreleasepools. For more details, see objr.
    • Pointer packing for optional types so they fit in a u64. For more details, see objr
    • Stack-allocated blocks. For more details, see blocksr
  • Safe APIs. Where possible APIs are designed with safe abstractions to provide familiar guarantees to Rust developers
  • Async bindings out of the box for shader compilation and similar tasks
  • Low-level. These bindings assume familiarity with bound APIs and are not documented separately. For details on how they work, see the native documentation.
  • Free for noncommercial or "small commercial" use.

Implementation status

Generally it's implemented enough that you can write basic high-performance rendering applications.

The following APIs are at least partially implemented. These implementations are incomplete but contain common functions or "the ones I use".

The objr macro system makes it very ergonomic to add new bindings for specific missing features or new Metal APIs.

Objects, etc.

  • MTLDevice
  • MTLCommandBuffer
  • MTLCommandQueue
  • MTLBuffer

Render passes

  • MTLRenderPassAttachmentDescriptor
  • MTLRenderPassColorAttachmentDescriptor
  • MTLRenderPassColorAttachmentDescriptorArray
  • MTLRenderPassDepthAttachmentDescriptor
  • MTLRenderPassDescriptor

Render pipelines

  • MTLRenderPipelineDescriptor
  • MTLRenderPipelineState
  • MTLRenderPipelineColorAttachmentDescriptor
  • MTLRenderPipelineColorAttachmentDescriptorArray

Encoders

  • MTLBlitCommandEncoder
  • MTLRenderCommandEncoder

Textures

  • MTLTexture
  • MTLTextureDescriptor

Depth/stencil

  • MTLDepthStencilDescriptor (primarily depth APIs)
  • MTLDepthStencilState

Types

  • MTLPixelFormat
  • MTLPrimitiveType
  • MTLOrigin
  • MTLSize

Protocols

  • MTLDrawable

Planned

Not yet implemented:

  • Compute
  • iOS

Out of scope

  • Compiling shaders at build-time. You can compile at runtime with this API (see tests), or write a build.rs script to build your shaders. Stay tuned for future crates!