[iOS] Metal에서 GPU 컴퓨팅 (7) MTLCommandBuffer

이 기사는 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


(실행 화면)

이번은, 샘플 코드내의 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에서 생성할 수 있는 명령 인코더 객체에는 다음 네 가지가 있습니다.
  • MTLRenderCommandEncoder
  • MTLComputeCommandEncoder
  • MTLBlitCommandEncoder
  • MTLParallelRenderCommandEncoder.

  • 이 중 MTLBlitCommandEncoder는 이미지 데이터를 복사하는 데 사용되는 인코더이고 MTLParallelRenderCommandEncoder는 멀티 스레드로 렌더링 할 때 인코더입니다.

    커멘드 버퍼에 대해서 GPU 컴퓨팅의 설정, 및 렌더링의 설정이 이루어진 후, 커멘드 버퍼가 커밋됩니다.

    AAPLRender.m
    [commandBuffer presentDrawable:self.view.currentDrawable];
    ...
    [commandBuffer commit];
    

    이와 같이 MTLCommandBuffer는 GPU에 인코딩된 명령을 저장하는 역할을 한다.

    이번에는 라이프 게임 샘플 코드 내에서 MTLCommandQueue의 해설을 실시했습니다.
    다음 번 이후, 또 다른 개소에 대한 해설을 실시해 갑니다.

    좋은 웹페이지 즐겨찾기