MetalDay 10

[iOS]MetalでGPUコンピューティング(7) MTLCommandBuffer

More than 1 year has passed since last update.

この記事は、Metal Advent Calendar2016の10日目です。

これまで、MetalのGPUコンピューティングについて解説記事を書いてきました。

[iOS] MetalでGPUコンピューティング (1) 最小限のコードの記述と特性の把握

[iOS] MetalでGPUコンピューティング (2) 群知能

[iOS] MetalでGPUコンピューティング (3) MTLDevice

[iOS] MetalでGPUコンピューティング (4) MTKView

[iOS] MetalでGPUコンピューティング (5) MTLLibrary

[iOS] MetalでGPUコンピューティング (6) MTLCommandQueue


本記事では、前回に引き続きAppleが提供するサンプルコードの解説を行います。

扱うサンプルコードは、前回と同じライフゲームのアプリ、MetalGameOfLifeです。

MetalGameOfLife

IMG_5933.PNG

(実行画面)

今回は、サンプルコード内のMTLCommandBufferについて解説を行います。

MTLCommandBufferのオブジェクトはGPUに引き渡されるエンコードされた命令を格納しています。

MTLCommandBufferはクラスではなくプロトコルです。

MTLCommandBufferのオブジェクトは、MTLCommandQueueにより生成され、生成元のキューの内部でのみ実行することができます。全てのコマンドバッファは、生成元のコマンドキューに追加された順番に実行されることが保証されています。

コマンドキューの生成は一度だけですが、コマンドバッファは毎フレームごとに生成、実行されます。

繰り返しになるのですが、このサンプルコードは、主に以下のファイルで構成されています。

AAPLRender.h

AAPLRender.m

AAPLViewController.h

AAPLViewController.m

Sharder.metal

このうち、AAPLRender.mには並列コンピューティング及び描画のCPU側のロジックが、Shader.metalには頂点シェーダー、フラグメントシェーダー、GPUコンピューティング用のシェーダーが書かれています。

ここからは、サンプルコード内におけるMTLCommandBufferの使用箇所を解説していきます。

AAPLRender.mに以下の記述があります。MTLCommandQueueのcommandBufferメソッドによりコマンドバッファが生成されています。この記述は毎フレームごとに呼ばれる箇所にあります。


AAPLRender.m

id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];


また、以下のコードでは、コマンドバッファからMTLComputeCommandEncoderのオブジェクトの生成を行なっています。


AAPLRender.m

id<MTLComputeCommandEncoder> commandEncoder = [commandBuffer computeCommandEncoder];


このコマンドエンコーダーオブジェクトは、コマンドバッファにコンピューティングのコマンドを格納します。

以下のコードでは、コマンドバッファからMTLRenderCommandEncoderのオブジェクトの生成を行なっています。


AAPLRender.m

id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];


このコマンドエンコーダーオブジェクトは、コマンドバッファにレンダリング用のコマンドを格納します。

MTLCommandBufferから生成できるコマンドエンコーダーオブジェクトには、以下の4つがあります。


  • MTLRenderCommandEncoder

  • MTLComputeCommandEncoder

  • MTLBlitCommandEncoder

  • MTLParallelRenderCommandEncoder.

このうち、MTLBlitCommandEncoderは画像データのコピーに用いるエンコーダー、MTLParallelRenderCommandEncoderはマルチスレッドでレンダリングする際のエンコーダーです。

コマンドバッファに対してGPUコンピューティングの設定、及びレンダリングの設定が為された後、コマンドバッファがコミットされます。


AAPLRender.m

[commandBuffer presentDrawable:self.view.currentDrawable];

...
[commandBuffer commit];

このように、MTLCommandBufferはGPUへのエンコードされたコマンドを格納する役割を担っています。

今回はライフゲームのサンプルコード内におけるMTLCommandQueueの解説を行いました。

次回以降、さらに他の箇所についての解説を行なっていきます。