             }
             
             for (block, texture) in textures {
-                blocks.append((block, (texture, 0, 0)))
+                blocks[block] = texture
             }
             
             commandBuffer.addCompletedHandler { _ in
                 
                 for (block, texture) in textures {
-                    
-                    for y in stride(from: block.minY, to: block.maxY, by: self.blockSize) {
-                        for x in stride(from: block.minX, to: block.maxX, by: self.blockSize) {
-                            
-                            let _block = Block(x: x, y: y, width: self.blockSize, height: self.blockSize)
-                            self.cache[_block] = (texture, x - block.minX, y - block.minY)
-                        }
-                    }
+                    self.cache[block] = texture
                 }
             }
         }

        
        var pool = WeakDictionary<MTLCommandQueue, CIContextPool>()
        
        var table: [Block: (MTLTexture, Int, Int)] = [:]
        
        subscript(block: Block) -> (MTLTexture, Int, Int)? {
            get {
                return lck.synchronized { table[block] }
            }
            set {
                lck.synchronized { table[block] = newValue }
            }
        }
    }

            
            guard let blitCommandEncoder = commandBuffer.makeBlitCommandEncoder() else { return }
            
            for (block, texture) in blocks {
                
                let _minX = max(block.minX, minX)
                let _minY = max(block.minY, minY)
