「主なグラフィックスAPIのメモリアライメント」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
 
22行目: 22行目:
 
== Vulkan ==
 
== Vulkan ==
 
[[Vulkan]]は[[GPU]](の[[ドライバ]])ごとに[[仕様]]が異なる前代未聞のクソ仕様。
 
[[Vulkan]]は[[GPU]](の[[ドライバ]])ごとに[[仕様]]が異なる前代未聞のクソ仕様。
そのクソ仕様はvkGetBufferMemoryRequirements関数でVkMemoryRequirements構造体に格納されるのでalignmentメンバーの整数倍にする。
+
そのクソ仕様はvkGetBufferMemoryRequirements関数でVkMemoryRequirements構造体に格納されるのでそのalignmentメンバーの整数倍にする。
 
<source lang="c">
 
<source lang="c">
 
VkMemoryRequirements memReq;
 
VkMemoryRequirements memReq;

2024年4月18日 (木) 01:34時点における最新版

Direct3D[編集 | ソースを編集]

Direct3Dでは16バイト区切りにする。構造体メンバー変数は16バイトの境界線を跨ぐように配置しないこと。

以下に擬似コードを示す。

NG
struct Buffer1 {
    float3 a        ;  0 + 12 = 12
    float2 b        ; 12 +  8 = 20 # NG
}
OK
struct Buffer1 {
    float3 a        ;  0 + 12 = 12
    float1 _dummy1  ; 12 +  4 = 16 # OK
    float2 b        ;  0 +  8 =  8 # 16ごとに0にリセット
}

Vulkan[編集 | ソースを編集]

VulkanGPU(のドライバ)ごとに仕様が異なる前代未聞のクソ仕様。 そのクソ仕様はvkGetBufferMemoryRequirements関数でVkMemoryRequirements構造体に格納されるのでそのalignmentメンバーの整数倍にする。

VkMemoryRequirements memReq;
vkGetBufferMemoryRequirements(device, buffer, &memReq);

こんなのやってられないのでAMDが作ってくれたVulkan Memory Allocatorを使いましょう。

Metal[編集 | ソースを編集]

Metalは深く考えなくても良いらしいが、とりあえずDirect3Dに合わせとけ。