@@ -9,14 +9,6 @@
99import Metal
1010import UIKit
1111
12−class TextureRef {
13− var texture: MTLTexture
14−
15− init(texture: MTLTexture) {
16− self.texture = texture
17− }
18−}
19−
2012class MetalMetaballRenderer: MetaballRenderer {
2113
2214 typealias TargetView = UIImageView
@@ -30,7 +22,7 @@ class MetalMetaballRenderer: MetaballRenderer {
3022 var previousSize = CGSize.zero
3123
3224 let context = MTLContext()
33− var renderingTexture: TextureRef!
25+ var renderingTexture: MTLTexture!
3426 var imageBuffer: UnsafeMutablePointer<Void>!
3527
3628 let dataSource: MetaballDataSource
@@ -50,31 +42,17 @@ class MetalMetaballRenderer: MetaballRenderer {
5042 updateFrame()
5143 }
5244
53− if metalIsBusy {
54− dirty = true
55− return
56− } else {
57− metalIsBusy = true
58− dirty = false
59− }
60−
6145 dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INTERACTIVE.rawValue), 0)) { () -> Void in
6246
6347 // Render graphics to metal texture
6448 self.renderToRenderingTexture()
65− self.metalIsBusy = false
6649
6750 // Transform metal texture into image
68− let uiimage = self.image(texture: self.renderingTexture.texture)
51+ let uiimage = self.createImageFromTexture()
6952
7053 dispatch_async(dispatch_get_main_queue(), { () -> Void in
7154 // Send image to view
7255 self.targetView.image = uiimage
73−
74− // If the image is dirty, update it
75− if self.dirty {
76− self.updateTargetView()
77− }
7856 })
7957 }
8058 }
@@ -87,7 +65,7 @@ class MetalMetaballRenderer: MetaballRenderer {
8765 let textureDescriptor =
8866 MTLTextureDescriptor.texture2DDescriptorWithPixelFormat(.BGRA8Unorm, width: width, height: height, mipmapped: false)
8967
90− renderingTexture = TextureRef(texture: context.device.newTextureWithDescriptor(textureDescriptor))
68+ renderingTexture = context.device.newTextureWithDescriptor(textureDescriptor)
9169 }
9270
9371 let kernelFunction: MTLFunction?
@@ -107,7 +85,7 @@ class MetalMetaballRenderer: MetaballRenderer {
10785
10886 let commandEncoder = commandBuffer.computeCommandEncoder()
10987 commandEncoder.setComputePipelineState(pipeline)
110− commandEncoder.setTexture(renderingTexture.texture, atIndex: 0)
88+ commandEncoder.setTexture(renderingTexture, atIndex: 0)
11189 let metaballInfoBuffer = metaballBuffer()
11290 commandEncoder.setBuffer(metaballInfoBuffer, offset: 0, atIndex: 0)
11391 commandEncoder.dispatchThreadgroups(threadGroups,
@@ -122,7 +100,9 @@ class MetalMetaballRenderer: MetaballRenderer {
122100 }
123101 }
124102
125− func image(texture texture: MTLTexture) -> UIImage {
103+ func createImageFromTexture() -> UIImage {
104+ let texture = renderingTexture
105+
126106 // Get image info
127107 let imageSize = CGSizeMake(CGFloat(texture.width),
128108 CGFloat(texture.height))