Visual Studio と Direct3D12 Template

プロジェクトテンプレート

Visual Studio 用のプロジェクトテンプレート

Direct3D Game Visual Studio templates (Redux) | Games for Windows and the DirectX SDK blog

Github で管理されている。

GitHub - walbourn/directx-vs-templates: Direct3D Visual Studio Templates

Wiki の「VS 2019 / VS 2022」をクリックすると、VS2019/VS2022向けの vsix ファイルをダウンロードできる。Direct3DUWPGame.vsix。

https://github.com/walbourn/directx-vs-templates/wiki

VS が起動している場合は終了させて、ダウンロードした vsix をダブルクリックすればインストールできる。

新規プロジェクトの作成

新規プロジェクトを作成する場合は下記を使う。

  • Direct3D12 Win32 Game
  • Direct3D12 Win32 Game DR

昔ながら Windows API + DirectX12 のテンプレート構成。この2つのどちらかを使用する。どちらも実行結果は一緒だけど、個人的には DR と付いている方が管理しやすくて好み。DR と付いている方は DeviceResources というヘルパークラスが追加されており、機能の一部はここに実装されている。DR が無い方は、Game クラスの中にほぼ全て書かれており Game クラスが肥大化している。

他のプロジェクト構成としては「Direct3D UWP」と付いているものがある。名前の通り UWP アプリとしてビルドできる。更に UWP の中でも C++/CX と C++/WinRT の構成で分かれている。WinRTの方が使用が推奨されているみたいなので、UWP で作る場合は Direct3D UWP(C++/WinRT)の方がいいのかな。

DXCompiler の使用

DirectX12の新しい機能(最新の Shader Model)を使用する場合は、DXC も最新のものを使う必要がある。

https://github.com/Microsoft/DirectXShaderCompiler

Github で開発されているので「Release」から最新をダウンロードしてくるか、もしくはVisual Studio から NuGet でも最新を取得することが出来る。

DX12 の Work Graph のサンプルなどでは、package.config に「Microsoft.Direct3D.DXC」が含まれている。最新のdxcを落としてきて実行時にhlslをコンパイルしている。

DirectXTK

インストール方法は NuGet を使うか、Github から落としてきた DirectXTK プロジェクトから lib を作ってリンクするか、もしくは直接 sln 内に組み込んで参照する。

DirectX12 アプリケーションのための便利なユーティリティライブラリ集
https://github.com/microsoft/DirectXTK12

  • DirectXTK_Desktop_2022_Win10
    • Win32 構成
  • DirectXTK_GDK_2022
    • GDK 構成
  •  DirectXTK_Windows10_2022
    • UWP 構成

UWP を使わない、直接 Win32 を叩いている DirectX12 プロジェクトだったら DirectXTK_Desktop_2022_Win10 を使えばいいはず。

 

Wikiの Samples ページを見るとサンプルへのリンクが置かれている。

https://github.com/microsoft/DirectXTK12/wiki/Samples

directxtk-samples

  • SimpleSampleWin32
    • 従来の Win32 API (x86, x64)+DirectX11
    • NuGet は directxtk_desktop_2019
  • SimpleSampleWin32DX12
    • 従来の Win32 API (x86, x64)+DirectX12
    • NuGet は directxtk12_desktop_2019
  • SimpleSampleWindows10
    • UWP向け、C++WinRT構成
    • NuGet は directxtk_uwp
  • SimpleSampleWindwos10DX12
    • UWP向け、C++WinRT構成のDirectX12 版
    • NuGet は directxtk12_uwp
  • SimpleSampleWindows10_XAML
    • UWP向け、XAMLの使用

若干紛らわしいが、Windows の Win32API は 32 という名前がついているが、x86 と x64 の両方のアプリケーションの開発が可能。そのため Win32 という名前がついたプロジェクト構成の中に、x86 と x64 の両方が含まれている。

各プロジェクトの中には package.config が置かれていて NuGet を使用して DirectXTK を取り込んでいる。

directxtk12modelviewer

プロジェクト構成はUWPとGDKの2つ。Win32な無いみたい。

  • DirectXTKModelViewer_Desktop_2019_Win10
    • UWPビルド
  • DirectXTKModelViewer_GDK_2019
    • GDKが無いとビルドが通らない

directxtk-samples と違いNuGet は使用していない。DirectXプロジェクトとは別に DiredctXTK12プロジェクトを直接sln内に追加している。Referencesの設定と、ヘッダーなどはプロジェクト構成でAdditional Includeしている。

DirectXMath

https://github.com/Microsoft/DirectXMath

DirectXMathはWindowsSDKに含まれているので、ヘッダーをインクルードするだけですぐに使える。VectorやMatrixを使いたい場合は DirectXMath.h をインクルードする。

DirectXMath.h

 

XMFLOAT3 と XMVECTOR

XMFLOAT3は単なる x, y, z の3要素を持っているだけのデータ型のため演算などは行えない。ベクトルの演算を行いたい場合は XMVECTOR を使用する。

DirectXTK の SimpleMath.h

https://github.com/microsoft/DirectXTK12/blob/main/Inc/SimpleMath.h

DirectX Tool kit の方にも Math 機能があり、Matrix, Vector, Quaternion, Ray や Plane などの基本的な機能が存在している。中を見るのも勉強になるかもしれない。これは DirectXMath.h の機能の一部をラップしたような作りになっている。

Vector3 などは XMFLOAT3 を継承して XMFLOAT3 に対して基本的なベクトル操作の機能を足したような作りになっている。(DotやCrossの実装は XMVector3Dot や XMVector3Crossが呼ばれている)

__MINGW32__ マクロの削除

新規の DIrectX12 プロジェクトを作成すると、テンプレートとして生成されたコードの中に「__MINGW32__」マクロが多数存在している。MinGWgcc)でビルドする場合は、この __MINGW32__ が有効になるみたいだが、Visual Studio を使用する場合はコードを通らないので可読性のために不要なコードは削除する。

このテンプレートを提供してくれているのは Micorosft の人みたいだけど、MS 内だと MinGW を使う機会があるのかな...?普通に開発していれば、DirectX を使うときは VC++ 以外の選択肢ってほぼ無い気もするが、どうなんだろう

半導体周りのブックマーク

ネットで調べていて気になった情報のリンク。

What should be the best way to learn VLSI design?
https://www.quora.com/What-should-be-the-best-way-to-learn-VLSI-design
VLSI 設計を学ぶには、どのような方法がいいか?

NVIDIA and Cadence
https://www.cadence.com/content/dam/cadence-www/global/en_US/documents/tools/pcb-design-analysis/nvidia-cs.pdf
NVIDIA は Cadence を使用している。

半導体設計EDAのCadenceとSynopsysのビジネスモデル
https://analog-handoutai.net/cdns_snps/

「日の丸半導体」復活には5兆円投じる覚悟必要
https://toyokeizai.net/articles/-/456632?page=2

日本勢がTSMCの5ナノや3ナノのプロセスを使おうとしたら、それが使えるケイデンスシノプシスEDAツールを買ってきて、言われた通りに設計するしかない。

まもなくTSMC OIP Forum開催、TSMCの最新3nmプロセス「N3E」の状況
https://www.eda-express.com/2022/10/tsmc-oip-forumtsmc3nmn3e.html

EDA Express
https://www.eda-express.com/

std::thread のメモ書き

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

void func(mutex& mtx, int* count)
{
    int local = 0;

    for (int i = 0; i < 10000000; i++)
    {
	mtx.lock();
	++(*count);
	mtx.unlock();
    }

    local += 1;
    std::cout << local << std::endl;
};

int main()
{
    int count = 0;

    mutex mtx;

    thread t1(func, std::ref(mtx), &count);
    thread t2(func, std::ref(mtx), &count);

    t1.join();
    t2.join();

    cout << count << endl;

    return 0;
}

2 thread で count を加算。

プログラムの動作速度の計測

class Timer {

public:

    Timer(const WCHAR* pMarker)
        : marker(pMarker)
    {
        QueryPerformanceFrequency(&clock);
        QueryPerformanceCounter(&start);
    }

    ~Timer()
    {
        QueryPerformanceCounter(&finish);
        double t = (double)(finish.QuadPart - start.QuadPart) * 1000.0 / clock.QuadPart;

        WCHAR buff[256] = {};
        swprintf_s(buff, L"%ls : %f msec\n", marker.c_str(), t);
        OutputDebugString(buff);
    }

    std::wstring marker;
    LARGE_INTEGER clock, start, finish;
};

計測したいスコープ範囲で Timer オブジェクトを生成する。

参考

http://www.sanko-shoko.net/note.php?id=rnfd

Git の覚書

ローカルの変更を取り消す
git checkout .

管理されていないファイル/フォルダを削除
git clean -fd

上記2つは、続けて一緒に使ったりする。

リモートブランチを一覧表示
git branch -a

リモートブランチに切り替える
git checkout remote/origin/4.27

git branch -a で一覧取得して、checkout に指定する。

新規ブランチを作成して移動
git branch -b feature/add_func

main ブランチに戻る
git branch main