C++ - Metal

Metal

Metal 프레임워크를 사용하면 시스템의 그래픽 처리 장치(GPU)에 직접 접근할수 있다. GPU를 사용하면 복잡한 장면을 빠르게 렌더링할수 있고 복잡한 작업을 병렬적으로(parallel) 실행 가능하다. Metal은 기능을 보완하는 다른 프레임워크와 함께 사용된다.

  • MetalFX - upscale(이미지나 비디오 등의 해상도를 상승시킴)
  • MetalKit - Metal에서 렌더링한 content를 화면에 출력

Metal-cpp는 overhead가 낮은 Metal을 위한 C++ 인터페이스이다. 이 인터페이스를 통해 C++로 작성된 애플리케이션에 Metal의 기능을 추가할 수 있다.

Build project

sample code를 공식 홈페이지에서 다운 받을수 있다.
아래는 sample code에 포함된 Makefile의 일부이다.

CC=clang++
FLAGS=-Wall -std=c++17 -I./metal-cpp -I./metal-cpp-extensions -fno-objc-arc $(DBG_OPT_FLAGS) $(ASAN_FLAGS)
LDFLAGS=-framework Metal -framework Foundation -framework Cocoa -framework CoreGraphics -framework MetalKit
VPATH=./metal-cpp
  • 헤더파일 경로 - /metal /metal-cpp-extensions
  • 오브젝트파일 경로 - Metal Foundation Cocoa CoreGraphics MetalKit
  • VPATH - 현재 디렉토리 이외의 파일을 찾을 디렉토리를 추가할수 있다. :를 사용하면 복수의 디렉토리를 등록할수 있다.

Metal-cpp는 header-only library이다. 헤더에 선언된 인터페이스들에 대한 implementation을 생성하려면 프로그램의 .cpp파일 중 하나는 다음과 같은 코드를 포함해야 한다.

#define NS_PRIVATE_IMPLEMENTATION
#define CA_PRIVATE_IMPLEMENTATION
#define MTL_PRIVATE_IMPLEMENTATION
#include <Foundation/Foundation.hpp>
#include <Metal/Metal.hpp>
#include <QuartzCore/QuartzCore.hpp>

Metal-cpp 객체, 타입에 대한 참조가 필요한 모든 파일에서 위의 세 개의 헤더 파일을 포함하면 된다.

🚨 NS, MTL, CA_PRIVATE_IMPLEMENTATION 매크로는 한 번만 정의해야 한다.

sample code에 포함된 MakeSingleHeader.py 스크립트를 실행하면 세 개의 헤더파일을 하나의 헤더파일로 만들어준다.

./SingleHeader/MakeSingleHeader.py Foundation/Foundation.hpp QuartzCore/QuartzCore.hpp Metal/Metal.hpp

이렇게 생성된 ./SingleHeader/Metal.hpp에는 metal-cpp를 사용하기 위해 필요한 모든 것들이 선언되어 있다. Implementation은 다음과 같은 코드에 의해 생성된다.

#define NS_PRIVATE_IMPLEMENTATION
#define CA_PRIVATE_IMPLEMENTATION
#define MTL_PRIVATE_IMPLEMENTATION
#include <Metal/Metal.hpp>

Cocoa Cocoa Touch cocoa-gpt

reference

Comments