metal
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| metal [2015/08/15 15:01] – [OS X 版の OpenGL 4.x との違い] oga | metal [2016/08/26 18:35] (現在) – [Metal (iOS/tvOS/macOS)] oga | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== Metal (iOS/OS X) ====== | + | ====== Metal (iOS/tvOS/macOS) ====== |
| 行 9: | 行 9: | ||
| - | 対応 GPU の機能グループは | + | 対応 GPU の機能グループは |
| - | ^ Family | + | iOS9 では新たに GPUFamily3 が追加されています。 |
| - | | iOS GPUFamily1 | + | |
| - | | iOS GPUFamily2 | + | ^ Family |
| - | | OSX GPUFamily1 | + | | iOS GPUFamily1 |
| + | | iOS GPUFamily2 | ||
| + | | iOS GPUFamily3 | ||
| + | | OSX GPUFamily1 | ||
| - | Mac OS X 10.11 El Capitan 以降で対応します。 | + | Metal は Mac OS X 10.11 El Capitan 以降で対応します。Metal に対応している |
| - | ただし D3D10 世代の | + | |
| + | * 対応している Mac | ||
| + | * MacBook/ | ||
| + | * MacPro : 2013以降 | ||
| + | * 上記に含まれる GPU | ||
| + | * Intel HD Graphics Gen7 以降 (IvyBridge以降) | ||
| + | * GeForce Kepler 以降 | ||
| + | * RADEON GCN 以降 | ||
| GPU ごとの違い | GPU ごとの違い | ||
| - | ^ GPU | + | ^ GPU ^ Family |
| - | | PowerVR G6430 | + | | PowerVR G6430 | iOS GPUFamily1 |
| - | | PowerVR | + | | PowerVR |
| - | | GeForce Kepler | + | | GeForce Kepler |
| - | | Intel HD Graphics | + | | Intel HD Graphics |
| 行 47: | 行 58: | ||
| ===== iOS と OS X の違い ===== | ===== iOS と OS X の違い ===== | ||
| - | iOS 版 Metal はハードウエアが PowerVR Series 6/6XT のみなので、API 構造が PowerVR の仕様に従っています。 | + | iOS 版 Metal はハードウエアが PowerVR Series 6/6XT/7XT のみなので、API 構造が PowerVR の仕様に従っています。 |
| OS X 版も基本的に iOS 版を踏襲しているものの、 Intel HD Graphcis / GeForce / RADEON 等多くの GPU で動作させるためか、一部汎用的な仕様に改められています。 | OS X 版も基本的に iOS 版を踏襲しているものの、 Intel HD Graphcis / GeForce / RADEON 等多くの GPU で動作させるためか、一部汎用的な仕様に改められています。 | ||
| 行 57: | 行 68: | ||
| * Depth Format の種類が多く、Depth と Stencil がパックされた D24Unorm + S8 が追加。 | * Depth Format の種類が多く、Depth と Stencil がパックされた D24Unorm + S8 が追加。 | ||
| * iOS 側にも Depth と Stencil を同時に設定できる D32Float + S8 が逆輸入されている。 | * iOS 側にも Depth と Stencil を同時に設定できる D32Float + S8 が逆輸入されている。 | ||
| + | * Memory の Storage Type の違い | ||
| + | * iOS は UMA 前提なので SharedMemory と PrivateMemory (VRAM) に差がありません。 | ||
| + | * Buffer はデフォルトで SharedMemory となり直接書き込むことができます。 | ||
| + | * OS X は Discrete GPU が搭載されている可能性があるため、SharedMemory と PrivateMemory でアクセス速度が異なる可能性があります。 | ||
| + | * Buffer は iOS 互換のためデフォルトで ManagedMemory となります。自動で SystemMemory と PrivateMemory の同期が行われます。 | ||
| + | * Alignment の違い | ||
| + | * OS X では ConsntaBuffer (UniformBuffer) は 256byte 単位の alignment 整合が必要。 | ||
| + | * なお Direct3D 12 にも全く同様の制限があります。 | ||
| - | ConsntaBuffer (UniformBuffer) は 256byte alignment が必要。(Direct3D 12 にも全く同様の制限があります) | + | ===== OS X 版の OpenGL 4.1 との違い ===== |
| - | + | === OS X 10.10 / iOS 9 / tvOS 9 まで | |
| - | + | ||
| - | ===== OS X 版の OpenGL 4.x との違い ===== | + | |
| Mobile 向け API 、しかも特定の PowerVR 向けに設計された API なので若干仕様に偏りがあります。 | Mobile 向け API 、しかも特定の PowerVR 向けに設計された API なので若干仕様に偏りがあります。 | ||
| 行 70: | 行 87: | ||
| OpenGL 4.x の完全な代わりとしては物足りない部分がいろいろ出てくる可能性があります。 | OpenGL 4.x の完全な代わりとしては物足りない部分がいろいろ出てくる可能性があります。 | ||
| iOS 向け Application の移植が当面の用途になるかもしれません。 | iOS 向け Application の移植が当面の用途になるかもしれません。 | ||
| + | |||
| + | |||
| + | |||
| + | === macOS 10.11 / iOS 10 以降 === | ||
| + | |||
| + | macOS 10.11, iOS 10 以降で大幅な機能拡張が行われています。 | ||
| + | macOS 及び iOS の A9/A9X (PowerVR GT7xxx) で Tessellator が導入されました。 | ||
| + | Pipeline 構造は DirectX11/ | ||
| + | |||
| 行 79: | 行 105: | ||
| ===== Texture の転送 ===== | ===== Texture の転送 ===== | ||
| + | |||
| + | iOS では UMA 前提なので、他の低レベル API と違い Metal のリソース転送は即座に行われます。 | ||
| + | OSX では Discrete GPU も存在するため DMA 転送が必要です。iOS の API との互換性を保つために、Default で Managed Resource が用いられます。 | ||
| + | 直接転送命令を意識せずに更新できるので、他の低レベル API よりも扱いが簡単になっています。 | ||
| + | 他の低レベル API の Copy に相当するのが Blt API です。これらを用いて自分でリソースを転送することもできます。 | ||
| + | |||
| + | |||
| + | ===== Thread 並列化 ===== | ||
| + | |||
| + | CommandBuffer の生成は Thread 並列化が可能です。CPU 負荷を大きく減らすことができます。 | ||
| + | |||
| + | ただし CommandBuffer の生成には CommandEncoder が必要で、PowerVR の TBDR アーキテクチャに従い CommandEncoder は RenderTarget (FrameBuffer) と結びついています。 | ||
| + | CommandEncoder は Thread 間で共有することができないため、同じ RenderTarget へ書き込む描画命令を複数の CommandBuffer に分けることができません。 | ||
| + | |||
| + | この問題に対応するため、ParallelRenderCommandEncoder という専用の仕組みが用意されています。 | ||
| + | ParallelRenderCommandEncoder は、スレッド毎に使用できる複数の RenderCommandEncoder を作成することができます。 | ||
| + | これを用いると単一の CommandBuffer の生成を複数のスレッドに分解することができます。 | ||
| + | |||
metal.1439618476.txt.gz · 最終更新: by oga
