2016-04-01 7 views
16

新しいVulkan APIのすべての作成情報構造体(vk*CreateInfo)には、常に.sTypeのメンバーが存在します。価値が1つのものにしかならないのなら、これはなぜですか?また、Vulkanの仕様は、対応するvkCreate*関数のパラメータとしてのみvk*CreateInfo構造体を使用できることを明示しています。それは少し冗長なようです。ドライバーがこの構造体をGPUにまっすぐ渡していたら、それを持っている必要があるかもしれません(私はいつも最初のメンバーであることに気付きました)。しかし、これは、ドライバがそれをした場合、アプリはエラーが起こりにくく、構造体にintを前置するのは、非常に計算効率の悪い操作のようには見えないため、アプリには本当に悪い考えです。私はなぜそれが存在するのか分からない。Vulkan:vk * CreateInfo構造体のsTypeのポイントは何ですか?

TL; DRは
       はなぜvk*CreateInfo構造体は.sTypeメンバーを持っているのですか?

答えて

23

APIは、下位互換性を損なうことなく変更することができます。

バージョン1.1のVulkanがコマンドバッファプールなどの作成を拡張したい場合はどうすればよいでしょうか?まあ、彼らは全く新しいエントリーポイントを追加することができます:vkCreateCommandPool2。しかし、この関数は、vkCreateCommandPoolとほぼ同じシグネチャを持ちます。唯一の違いは、異なる構造を取ることです。

代わりに、VkCommandPoolCreateInfo2構造体を宣言するだけで済みます。そして、vkCreateCommandPoolがどちらかを取ると宣言します。どの実装から渡されたかを実装がどのように伝えますか?

このような構造の最初の4バイトはsTypeです。彼らはその価値をテストすることができます。値がVK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFOの場合、古い構造です。それがVK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO_2なら、それは新しいものです。

これにより、拡張機能がCreateInfo構造体を完全に上書きすることも容易になります。 pNextフィールドは、追加のパラメータを使用してAPIを拡張するためのフィールドです。 sTypeを使用すると、既存のパラメータを拡張することができます。

+0

仮想SDK 1.1のリリースでは、更新された署名付きの更新された 'vkCreateCommandBufferPool()'定義のみが含まれているのはなぜですか?ほとんどのライブラリには、バージョン履歴全体からの構造のさまざまなリビジョンがすべて含まれているわけではありません。なぜVulkanのような図書館はそれをしますか?または、アプリケーションがハードウェアの機能に応じて古い構造に頼る必要があるため、このようなライブラリはユニークですか? – spaaarky21

+0

@ spaaarky21:彼らは約束しなかったので。 Vulkanの仕様では、バージョン管理の仕組みが説明されています。それは、どのような種類のバージョン変更のためにどのような変更が行われるかを綴ります。マイナーバージョンの変更は、同じメジャーバージョンのすべてのマイナーバージョンと下位互換性があるように指定されています。ですから、1.0に対してコードを書くと、1.1または1.2実装で動作します。しかし2.0または3.0で動作するという保証はありません。 –

関連する問題