Game Porting Toolkitメモ

私のGitHub上で遊んでいるDirectX 12プログラムを、Macで動かしたくなりました。

今回動かしたのは、このシンプルなRust + DX12プログラムです
MacからVisual Studioプロジェクトをビルドするのは面倒そうなので、GitHub ActionsでArtifactsにアップロードして取り出しました。

実行エラーの類は全くありませんでした。
DX12のニッチな機能を使っていなければ、問題はなさそうです。

デバッグレイヤーは未実装でした(当然)。
なぜかGPUはAMDの振りをするようです。

インストール

同梱のRead me.rtfの通りに行えばインストールできます。
途中、Homebrewのパスが/usr/local/bin/brewになっているかどうか確認するところがありますが、Rosettaを常用しない私としては/opt/homebrew/bin/brewから変更したくありません。
そういう人のための補足も書かれているのがありがたいです。

セットアップ中にLLVMのコンパイルが始まるので、時間がかかります。
Mac Book Airの4コアで巨大リポジトリのビルドは流石に非力です。
しかも1度ビルド中にカーネルパニックしました…

実行

ビルド済みのexeを/Users/[your user name]/my-game-prefix/drive_c/にcopyします。
私のプログラムの場合、実行中にdxcompiler.dllを参照するので、それもプログラムから参照されるディレクトリにcopyします。

Read meによれば、実行時にgameportingtoolkitコマンドをそのまま実行していますが、よくわからないエラーが出ます。

Error: No available formula with the name “game-porting-toolkit”

これが解決できなかったので、別の方法としてwine64を使う方法を試したら起動できました。
こちらのサイトに記載されていたSteam起動用のコマンドのパスを変更しただけです。

MTL_HUD_ENABLED=1 WINEESYNC=1 WINEPREFIX=~/my-game-prefix  /usr/local/Cellar/game-porting-toolkit/1.0.4/bin/wine64 ‘C:\test\exe\simple_triangle.exe’

これで起動できました。

しかし、なぜかc0000135エラーで起動できなくなることがあります。
時間を空けて何度か試すと直るのですが、原因不明です。

デバッグ?

Metal APIのキャプチャをしようと試行錯誤したのですが、今のところ無理でした。
Metalには直接的には用意されていない、DX12のClearRTV/DSVがどう実装されているのか興味があったのですが…。

Xcodeでプロセス(PIDはWine起動時のログで確認できます)にアタッチすると、何度もSIGUSR1に引っかかります。
LLDBに引っかからないようにするには、以下のコマンドを叩けば良いようです。

process handle –stop false SIGUSR1

https://groups.google.com/g/capnproto/c/gXhsjsnKj88

しかし自分のexeがどのスレッドなのかは全然分かりませんでした。

まとめ

Game Porting Toolkitを使ってDX12アプリケーションが動くことを確認しました。

DirectX12の新しいBarrier

昨日、DirectX Agility SDK 1.700.10で追加された、ResourceBarrier()を刷新する新しいバリアAPI(Enhanced Barrier)が公開されました。
しかしSDKはあるもののドキュメントが見当たりません。
そこで、ヘッダの中身を見ながら考察してみました。

続きを読む

Triangle Culling

Triangle Cullingを実装してみました。

アイデア

出典はOptimizing the Graphics Pipeline with Compute [Graham16]です。
Radeon GPU(PS4/XboxOne世代)のプリミティブ処理能力が低いから、余っているALU性能を活用してプリミティブをカリングし、高速化しようぜという話が書かれています。

今回は、スライドの中盤に書かれているTriangle Cullingのうち、Backface Culling, Frustum Culling, Small Primitive Cullingの3つを実装しました。

ソースコードはこちらあとでアップする

続きを読む

Unityで深度バッファからカメラZを取得

忘れないようにメモ。
Unity 2017.1


float LinearEyeDepth(float rawdepth)
{
  float x, y, z, w;
#if UNITY_REVERSED_Z
  x = -1.0 + _NearClip / _FarClip;
  y = 1;
  z = x / _NearClip;
  w = 1 / _NearClip;
#else
  x = 1.0 - _NearClip / _FarClip;
  y = _NearClip / _FarClip;
  z = x / _NearClip;
  w = y / _NearClip;
#endif

  return 1.0 / (z * rawdepth + w);
}

float d = _CameraDepthTexture.Load(int3(xy, 0));
float camera_z = LinearEyeDepth(d);

_NearClipと_FarClipの値は、CameraコンポーネントのnearClipPlaneとfarClipPlaneプロパティをそのまま渡せばよい。

Windows 10でDirect3Dのデバッグランタイムをインストールする方法

Windows 10でD3D11_CREATE_DEVICE_DEBUGフラグを指定してD3D11CreateDevice()を呼び出したところ、HRESULT 0x887a002dを返して失敗しました。

ログにはこんなメッセージが出ていました。

D3D11CreateDevice: Flags (0x2) were specified which require the D3D11 SDK Layers for Windows 10, but they are not present on the system.
These flags must be removed, or the Windows 10 SDK must be installed.
Flags include: D3D11_CREATE_DEVICE_DEBUG

“Graphics Tools”というのをインストールすれば良いらしいので、手順をメモしておきます。

続きを読む

Direct3D 12を始める – Pipeline State

Windows 10 Technical Preview向けのWindows SDKには、最新のDirectXのライブラリが同梱されています。
その中でもまだ情報が少ないDirect3D 12に焦点を当て、筆者が調べたことをまとめて記事にしていきます。

前回はFenceについて説明しました。
今回はPipelineStateついて説明します。

続きを読む

Direct3D 12を始める – Fence (1)

Windows 10 Technical Preview向けのWindows SDKには、最新のDirectXのライブラリが同梱されています。
その中でもまだ情報が少ないDirect3D 12に焦点を当て、筆者が調べたことをまとめて記事にしていきます。

前回はCommand Queue、Command List、Command Allocatorについて説明しました。
今回はコマンドを管理する上で重要となるフェンスについて説明します。

現時点でSDKはプレビュー版であり、リリース版では仕様変更の可能性があります。
書きかけにつき今後図を追加するかもしれません。 続きを読む

Direct3D 12を始める – Command

Windows 10 Technical Preview向けのWindows SDKには、最新のDirectXのライブラリが同梱されていますその中でもまだ情報が少ないDirect3D 12に焦点を当て、筆者が調べたことをまとめて記事にしていきます。

現時点でSDKはプレビュー版であり、リリース版では仕様変更の可能性があります。
書きかけにつき今後図を追加するかもしれません。
続きを読む