4

Vulkan がリリースされたので、(趣味として) Vulkan ベースの GUI を書くことにしました。しかし、私は現在、最初のステップである Vulkan 関数のロードで立ち往生しています。私が見る限り、Vulkan 関数をグローバルにロードする必要がある Nvidia の C++ Vulkan ラッパーを使用しています。

ローカル関数を正常にロードできますが、::vkCreateInstance失敗します:

void loadInstanceFunctions() {
    PFN_vkCreateInstance vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance"); //works

    ::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance");  //does not work
}

新しい関数ポインターをグローバルに割り当てようとすると、コンパイル時に 2 つのエラーが発生します (VS2015 を使用してコンパイル):

  • 式は変更可能な左辺値でなければなりません。
  • '=': 左オペランドとして機能します。

vulkan.hヘッダーで宣言された関数プロトタイプがあります。次に例を示します。

VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
    const VkInstanceCreateInfo*                 pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkInstance*                                 pInstance);

これが、関数をグローバルにロードできない原因です。もし私が を定義するとしたらVK_NO_PROTOTYPES、これらのプロトタイプはスキップされ、私はそれらを as などと再宣言することができると信じていPFN_vkCreateInstance vkCreateInstance = nullptr;ます。しかし、これは正しい方法ですか?

それで、私の質問 - Vulkan 関数をグローバルにロードする正しい方法は何ですか?

4

1 に答える 1

7
::vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(nullptr, "vkCreateInstance");  //does not work

vkCreateInstanceデフォルトでは、vulkan.h でプロトタイプとして定義されているシンボルに関数ポインターを割り当てようとしています。

定義VK_NO_PROTOTYPESすると、すべてのプロトタイプが前処理されます。

#ifndef VK_NO_PROTOTYPES
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
    const VkInstanceCreateInfo*                 pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkInstance*                                 pInstance);
...
#endif

プロトタイプがなくなったら、ドキュメントvkCreateInstanceに従ってグローバルにロードできます。

#define VK_NO_PROTOTYPES
#include <vulkan/vulkan.h>

#ifdef __cplusplus
extern "C" {
#endif
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName);
#ifdef __cplusplus
}
#endif

PFN_vkCreateInstance vkCreateInstance;

int main()
{
        vkCreateInstance = (PFN_vkCreateInstance) vkGetInstanceProcAddr(NULL, "vkCreateInstance");

        return 0;
}
于 2016-03-27T14:11:05.113 に答える