LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-10

この記事は、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の解説を行いました。
次回以降、さらに他の箇所についての解説を行なっていきます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1