「主なグラフィックスAPIのメモリアライメント」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) (→Vulkan) |
||
(同じ利用者による、間の5版が非表示) | |||
1行目: | 1行目: | ||
== Direct3D == | == Direct3D == | ||
− | [[Direct3D]] | + | [[Direct3D]]では16バイト区切りにする。[[構造体]]の[[メンバー変数]]は16バイトの境界線を跨ぐように配置しないこと。 |
+ | 以下に擬似コードを示す。 | ||
; NG | ; NG | ||
<source lang="c"> | <source lang="c"> | ||
struct Buffer1 { | struct Buffer1 { | ||
float3 a ; 0 + 12 = 12 | float3 a ; 0 + 12 = 12 | ||
− | float2 b ; 12 + 8 = 20 NG | + | float2 b ; 12 + 8 = 20 # NG |
} | } | ||
</source> | </source> | ||
21行目: | 22行目: | ||
== Vulkan == | == Vulkan == | ||
[[Vulkan]]は[[GPU]](の[[ドライバ]])ごとに[[仕様]]が異なる前代未聞のクソ仕様。 | [[Vulkan]]は[[GPU]](の[[ドライバ]])ごとに[[仕様]]が異なる前代未聞のクソ仕様。 | ||
− | + | そのクソ仕様はvkGetBufferMemoryRequirements関数でVkMemoryRequirements構造体に格納されるのでそのalignmentメンバーの整数倍にする。 | |
+ | <source lang="c"> | ||
+ | VkMemoryRequirements memReq; | ||
+ | vkGetBufferMemoryRequirements(device, buffer, &memReq); | ||
+ | </source> | ||
− | [[AMD]]が作ってくれた[[Vulkan Memory Allocator]]を使いましょう。 | + | こんなのやってられないので[[AMD]]が作ってくれた[[Vulkan Memory Allocator]]を使いましょう。 |
== Metal == | == Metal == |
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[編集 | ソースを編集]
VulkanはGPU(のドライバ)ごとに仕様が異なる前代未聞のクソ仕様。 そのクソ仕様はvkGetBufferMemoryRequirements関数でVkMemoryRequirements構造体に格納されるのでそのalignmentメンバーの整数倍にする。
VkMemoryRequirements memReq;
vkGetBufferMemoryRequirements(device, buffer, &memReq);
こんなのやってられないのでAMDが作ってくれたVulkan Memory Allocatorを使いましょう。